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

 
 
> Зачем мейку шелл?, И почему он не видит 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
сообщение Jun 28 2008, 19:47
Сообщение #3


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

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



Цитата(alx2 @ Jun 26 2008, 01:28) *
Попробую ответить, хотя я так и не понял, о каком конкретно make идет речь.

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

Но почему разные мейки ведут себя по разному? Мой мейкфайл чудесно обрабатывается make 3.81 из WinAvr, и отказывается обрабатываться make 3.81 из mspgcc. Вроде и версия мейка одна и та же. А логика почему-то разнится.
Цитата
Например:

Код
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
Тут перенаправление вывода.

Однако же с другими мейками работало!
Цитата
Как с этим бороться? А зачем бороться? Не проще взять нормальный шелл и пользоваться им?

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

Но наличие хоть какого-то шелла подразумевается? Хотя чего я спрашиваю, в линуксе-то шелл имеется непременно. Видимо это что-то настолько само собой разумеющееся, что никто при портировании мейка под винду даже об этом не задумался.
Цитата
Почему в mspgcc не положили шелл? Потому что это компилятор. Почему в комплекте компилятора должен идти шелл?

Потому что в комплекте компилятора идёт мейкsmile.gif А мейк, как мы видим, без шелла не работает.

ЗЫ. В любом случае, большое спасибо за разъяснения.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 30 2008, 14:35
Сообщение #4


Местный
***

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



Цитата(AHTOXA @ Jun 29 2008, 00:47) *
Но почему разные мейки ведут себя по разному? Мой мейкфайл чудесно обрабатывается make 3.81 из WinAvr, и отказывается обрабатываться make 3.81 из mspgcc. Вроде и версия мейка одна и та же. А логика почему-то разнится.
GNU make - это отдельный продукт. Почему два make одной и той же версии ведут себя по-разному - не знаю. Возможно, их по-разному сконфигурировали при сборке (в смысле, скрипт configure пускали с разными опциями). А может на них вообще какие-то патчи накладывали...

Цитата(AHTOXA @ Jun 29 2008, 00:47) *
А где взять нормальный шелл? Что-то мне такой пока не встречалсяsmile.gif
В моей системе он есть "из коробки". В винде - сложнее. Обычно под виндой рекомендуют использовать bash. Поищи в интернете, наверняка должен быть где-то уже собранный бинарник (если нет желания собирать самому).

Цитата(AHTOXA @ Jun 29 2008, 00:47) *
Но наличие хоть какого-то шелла подразумевается? Хотя чего я спрашиваю, в линуксе-то шелл имеется непременно. Видимо это что-то настолько само собой разумеющееся, что никто при портировании мейка под винду даже об этом не задумался.
Так под виндой есть шелл (командный интерпретатор) - cmd.exe. В ресурските есть еще один - sh.exe. Другое дело, что их качество не на высоте. Смутно припоминаю (я виндой много лет уже не пользуюсь), что у одного из этих двух есть проблема с максимальной длиной строки. В смысле, очень маленького ее значения, порядка 1 кбайта.

Цитата(AHTOXA @ Jun 29 2008, 00:47) *
Потому что в комплекте компилятора идёт мейкsmile.gif
Нет в (официальном) комплекте gcc make'а. Можешь скачать ftp://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-core-4.3.1.tar.bz2 и попробовать в нем найти make. smile.gif Если какое-то третье лицо взяло GNU make, взяло gcc, положило их в один архив и выложило в интернете - это самодеятельность этого лица, не более. ИМХО это недостаточное основание говорить "в комплекте gcc идет 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 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 Текстовая версия Сейчас: 20th July 2025 - 15:01
Рейтинг@Mail.ru


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