реклама на сайте
подробности

 
 
> Зачем мейку шелл?, И почему он не видит echo?
AHTOXA
сообщение May 30 2008, 21:00
Сообщение #1


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Работаю под виндой. Частенько сталкиваюсь с таким явлением: при запуске make он пытается найти sh. Не находит и обламывается.
Почему у меня нету sh? Я не помню, что-то мне в нём когда-то не понравилось, или что-то в этом роде. То ли он слеши перепутывал, то ли находил каждый файл по нескольку раз, то ли ещё что-то. Короче, хотелось бы обойтись без него:-)
Когда это происходит с чужими мейкфайлами, где есть что-то типа if -f[]... , то всё понятно, это явная команда шелла. Но бывает что ругается на мои обычные мейк-файлы, в которых ничего подобного не используется!
Вот сегодня, скачал новый mspgcc, там make 3.81. Был 3.80. Так вот, новый ругается на следующую строчку:
Код
clean:
    @$(RM) $(elffile) $(hexfile) 2>nul

пишет
Код
make: /bin/sh: Command not found
make: *** [clean] Error 127

Если убрать перенаправление вывода, для этой строки шелл становится не нужен. Но затыкается на следующей:
Код
    @echo --- assembling $<...

Пишет что не найдена команда echo. Хорошо, пишу
Код
echo        := cmd /C echo
,далее
    @$(echo) --- assembling $<...

- упс, починилось:-) Но только до следующей строки:
Код
    @$(CC) $(aflags) -o $@ $<

Там опять не найден bin/sh... Тут я уже не знал что делать, вернул прошлый мейк, всё заработало. И, что самое интересное, тот же самый (по идее) make 3.81 из сборки klen-а - шелл не запускает.

Хотелось бы понять:
  • в каких случаях мейк может запустить шелл?
  • от чего это зависит?
  • как с этим бороться?
  • независим ли мейк от шелла?
  • и почему в mspgcc не положили sh.exe? wink.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alx2
сообщение Jun 25 2008, 19:28
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(AHTOXA @ May 31 2008, 02:00) *
Хотелось бы понять:
  • в каких случаях мейк может запустить шелл?
  • от чего это зависит?
  • как с этим бороться?
  • независим ли мейк от шелла?
  • и почему в mspgcc не положили sh.exe? wink.gif
Попробую ответить, хотя я так и не понял, о каком конкретно make идет речь.
Для чего make зарускает шелл - для выполнения указанной в Makefile команды. Это если ответить кратко. Если более развернуто, то дело в следующем. Что по идее должен сделать make для выполнения некой команды? Запустить шелл и передать ему эту самую команду. Это общий случай, который работает всегда. Почему не выполнить ее самому? А зачем, если уже есть шеллы, которые это прекрасно умеют? Зачем дублировать функционал шелла в make, если шелл можно просто вызвать?
Но часто команда, которую требуется выполнить, тривиальна, и заключается, в свою очередь, в запуске какой-то программы (исполняемого файла) с передачей ему аргументов, например:

Код
gcc -c -O2 file.c

Для таких тривиальных случаев make в целях экономии просто пропускает запуск шелла, ибо ему нет никакой разницы, запустить шелл или сразу целевую программу.

В каких случаях make запускает шелл и от чего это зависит? Во всех отличных от тривиального случаях, как то перенаправление ввода/вывода, составные команды, условное выполнение, ветвление, циклы, встроенные команды шелла и т.п. Например:

Код
cd src/doc && make all
rm -f liba.a; ar cq liba.a $(OBJ)
for F in $(LIST); do somethung $F; done

Или вот приведенная тобой команда:
Код
@$(RM) $(elffile) $(hexfile) 2>nul
Тут перенаправление вывода.

По поводу второй твоей команды:
Код
@$(CC) $(aflags) -o $@ $<
что-либо сказать сложно, надо знать, что получается после подстановки переменных.

Например простое добавление ";" в конце команды указывает GNU make на необходимость запуска шелла вместо прямого выполнения, чем часто пользуются именно чтобы заставить make не умничать и запускать шелл. Да и просто использование в командной строке (даже в имени файла) символов, обычно имеющих специальное значение для шелла (кавычки, обратные апострофы, знак доллара и т.п.) приводит к тому, что make на всякий пожарный запускает шелл. Даже пробел в имени директория (типа "Program Files"), говорят, может "напугать" make...

Как с этим бороться? А зачем бороться? Не проще взять нормальный шелл и пользоваться им?

Независим ли make от шелла? Не совсем понятен вопрос. Да, независим в том смысле, что будет использовать тот шелл, который ему укажут. make не требует обязательного использования шелла какой-то конкретной марки.

Почему в mspgcc не положили шелл? Потому что это компилятор. Почему в комплекте компилятора должен идти шелл? Если мне нужен шелл, я возьму шелл. Если компилятор - возьму компилятор. Если make - возьму make. Зачем класть разные программы в один пакет? Это было бы странно. Тем более что шеллов много разных, одному нравится один, другому - другой...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AHTOXA   Зачем мейку шелл?   May 30 2008, 21:00
- - S.R.   Попробуй запускать как make --win32 М.б. поможет.....   May 31 2008, 19:37
|- - AHTOXA   Не, не работает. Пишет "--win32 no longer sup...   May 31 2008, 22:06
- - Инноватор   Попробуйте использовать майкрософтовский nmake вме...   Jun 24 2008, 11:47
|- - AHTOXA   Цитата(alx2 @ Jun 26 2008, 01:28) Попробу...   Jun 28 2008, 19:47
|- - alx2   Цитата(AHTOXA @ Jun 29 2008, 00:47) Но по...   Jun 30 2008, 14:35
|- - AHTOXA   Цитата(alx2 @ Jun 30 2008, 20:35) Возможн...   Jul 1 2008, 14:32
|- - Сергей Борщ   Цитата(AHTOXA @ Jul 1 2008, 17:32) Соглас...   Jul 1 2008, 16:09
|- - alx2   Цитата(AHTOXA @ Jul 1 2008, 19:32) Вот эт...   Jul 2 2008, 22:02
|- - Сергей Борщ   Цитата(alx2 @ Jul 3 2008, 01:02) Хм. Меня...   Jul 3 2008, 07:41
||- - alx2   Цитата(Сергей Борщ @ Jul 3 2008, 12:41) П...   Jul 3 2008, 10:18
||- - Непомнящий Евгений   Цитата(alx2 @ Jul 3 2008, 14:18) А, возвр...   Jul 3 2008, 10:31
||- - dxp   Цитата(Непомнящий Евгений @ Jul 3 2008, 17...   Jul 4 2008, 06:17
||- - Непомнящий Евгений   Цитата(dxp @ Jul 4 2008, 10:17) Что за ...   Jul 4 2008, 07:55
||- - dxp   Цитата(Непомнящий Евгений @ Jul 4 2008, 14...   Jul 4 2008, 11:12
||- - Непомнящий Евгений   Цитата(dxp @ Jul 4 2008, 15:12) Конечно, ...   Jul 4 2008, 12:01
|- - dxp   Такая обширная дискуссия по такому вроде бы просто...   Jul 3 2008, 07:45
- - AHTOXA   Цитата(Сергей Борщ @ Jul 1 2008, 22:09) А...   Jul 3 2008, 10:45
|- - Непомнящий Евгений   Цитата(AHTOXA @ Jul 3 2008, 14:45) И ещё ...   Jul 3 2008, 10:52
|- - Сергей Борщ   Цитата(AHTOXA @ Jul 3 2008, 13:45) А в ка...   Jul 3 2008, 13:00
|- - alx2   Цитата(AHTOXA @ Jul 3 2008, 15:45) Какую ...   Jul 3 2008, 17:42
- - AHTOXA   Цитата(Сергей Борщ @ Jul 3 2008, 19:00) Н...   Jul 3 2008, 19:58


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016