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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Зачем мейку шелл?, И почему он не видит 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
S.R.
сообщение May 31 2008, 19:37
Сообщение #2





Группа: Новичок
Сообщений: 3
Регистрация: 18-04-08
Из: Татарстан/Набережные Челны
Пользователь №: 36 863



Попробуй запускать как make --win32
М.б. поможет... По крайней мере мне с кленовским gnu-arm помогло.


--------------------
WBR, Igor (AKA S.R.)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 31 2008, 22:06
Сообщение #3


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

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



Не, не работает. Пишет "--win32 no longer supported".


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





Группа: Новичок
Сообщений: 6
Регистрация: 24-06-08
Пользователь №: 38 522



Попробуйте использовать майкрософтовский nmake вместо make'a.

И хорошо было бы взглянуть на весь makefile, включая определения переменных..
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 25 2008, 19:28
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 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
сообщение Jul 1 2008, 14:32
Сообщение #8


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

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



Цитата(alx2 @ Jun 30 2008, 20:35) *
Возможно, их по-разному сконфигурировали при сборке (в смысле, скрипт configure пускали с разными опциями). А может на них вообще какие-то патчи накладывали...

Вот это меня и интересует. Как бы так сконфигурировать, чтоб без шелла обойтись:-)
Цитата
Так под виндой есть шелл (командный интерпретатор) - cmd.exe. В ресурските есть еще один - sh.exe. Другое дело, что их качество не на высоте. Смутно припоминаю (я виндой много лет уже не пользуюсь), что у одного из этих двух есть проблема с максимальной длиной строки. В смысле, очень маленького ее значения, порядка 1 кбайта.

Согласен на cmd:) Но make ищет /bin/sh... Надо задать какую-то переменную окружения?
Цитата
Нет в (официальном) комплекте gcc make'а.

Я говорил про mspgcc. Просто под винду стараются комплектовать пакеты так, чтобы работало "из коробки". Поэтому и mspgcc и WinAvr и WinArm - все идут с make & binutils. И поэтому у меня очень много разных make:)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2008, 16:09
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(AHTOXA @ Jul 1 2008, 17:32) *
Согласен на cmd:) Но make ищет /bin/sh... Надо задать какую-то переменную окружения?
А смысл? Все равно makefile обычно пишется используя возможности bash. И скрипты configure пишутся тоже под него.
Цитата(AHTOXA @ Jul 1 2008, 17:32) *
Я говорил про mspgcc. Просто под винду стараются комплектовать пакеты так, чтобы работало "из коробки". Поэтому и mspgcc и WinAvr и WinArm - все идут с make & binutils. И поэтому у меня очень много разных make:)
Тот, который у вас в комплекте прошлогоднего mspgcc - из комплекта cygwin. Соответственно и работает он, предполагая наличие cygwin. Начиная с июня этого года mspgcc собирается при помощи mingw, и теперь он дружит с утилитами из комплекта mingw. Этот комплект содержит и make и sh. Сами утилиты в последний комплект mspgcc (20080603) не включены. Вы можете скачать их отдельно с sourceforge и поставить один комплект на все пакеты. Будете иметь самую свежую версию этих утилит.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alx2
сообщение Jul 2 2008, 22:02
Сообщение #10


Местный
***

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



Цитата(AHTOXA @ Jul 1 2008, 19:32) *
Вот это меня и интересует. Как бы так сконфигурировать, чтоб без шелла обойтись:-)
ИМХО никак. Какого поведения хочется добиться? Что должен делать make, сконфигурированный для работы без шелла, когда он встречает команду, для выполнения которой нужен шелл? Сругаться и остановиться? Так он и так это делает, когда шелл не находит. smile.gif А если может выполнить команду без шелла, он и так выполняет без шелла...

Цитата(AHTOXA @ Jul 1 2008, 19:32) *
Согласен на cmd:) Но make ищет /bin/sh... Надо задать какую-то переменную окружения?
А документацию читать сейчас не модно? smile.gif Да, установить переменную SHELL. Можно как переменную окружения, можно как переменную самого make хоть в Makefile, хоть в командной строке.

Цитата(AHTOXA @ Jul 1 2008, 19:32) *
Я говорил про mspgcc. Просто под винду стараются комплектовать пакеты так, чтобы работало "из коробки". Поэтому и mspgcc и WinAvr и WinArm - все идут с make & binutils. И поэтому у меня очень много разных make:)
Вот за это я и не люблю комбайны (когда все в одном флаконе) - нафиг мне много разных make? А насчет winavr - это я, выходит, отстал от жизни. Когда я N лет назад интересовался (в RU.EMBEDDED), что такое winavr, мне ответили, что это avr-gcc под винду. А теперь в него и binutils (что еще логично), и make (что уже менее логично) запихнули... Скоро, наверное, редактор с отладчиком туда же сунут... smile.gif

Цитата(Сергей Борщ @ Jul 1 2008, 21:09) *
А смысл? Все равно makefile обычно пишется используя возможности bash. И скрипты configure пишутся тоже под него.
Хм. Меня как раз учили так не делать. Для написания скриптов - максимально POSIX-стандартный /bin/sh без нестандартных наворотов, дабы скрипт выполнился на (почти) любой системе. А навороты bash - это больше для интерактивного использования.

По поводу configure - не замечаю такого. Вот рядом стоит система, в ней установлено 206 пакетов, большинство из них используют configure скрипт. Никому из них баш не понадобился...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 3 2008, 07:41
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(alx2 @ Jul 3 2008, 01:02) *
Хм. Меня как раз учили так не делать. Для написания скриптов - максимально POSIX-стандартный /bin/sh без нестандартных наворотов, дабы скрипт выполнился на (почти) любой системе. А навороты bash - это больше для интерактивного использования.
Подколол, подколол smile.gif Ну простите виндового пользователя, для которого что bash, что ash, что csh, что sh - все на одно лицо. Во встречавшихся мне линуксах по умолчанию стоял bash, sh - ссылка на него. В MSYS sh.exe тоже представляется как bash.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dxp
сообщение Jul 3 2008, 07:45
Сообщение #12


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Такая обширная дискуссия по такому вроде бы простому вопросу, имхо, косвенно указывает, что возможно есть повод и причина поглядеть на более другие средства. Меня make уже давно перестал устраивать (собственно, с самого начала не вызывал восторга, но тогда не видел альтернативы), и некоторое время назад я успешно переполз на SCons (http://www.scons.org/), чего и вам желаю. Снимается не только эта проблема с шеллом, но и куча других сопутствующих.

Прошу прощения за офтопик.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
alx2
сообщение Jul 3 2008, 10:18
Сообщение #13


Местный
***

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



Цитата(Сергей Борщ @ Jul 3 2008, 12:41) *
Подколол, подколол smile.gif Ну простите виндового пользователя, для которого что bash, что ash, что csh, что sh - все на одно лицо.
И не думал подкалывать. Я действительно понял фразу "возможности bash" как использование фичей, присущих именно bash и никому другому.
Цитата(dxp @ Jul 3 2008, 12:45) *
некоторое время назад я успешно переполз на SCons (http://www.scons.org/), чего и вам желаю. Снимается не только эта проблема с шеллом, но и куча других сопутствующих.
Спасибо за рекомендацию, будет время и настроение - посмотрю. А, возвращаясь ближе к топику, каким образом снимается проблема с шеллом? Там гвоздями забито использование своего встроенного шелла? Можно в двух словах об этом моменте?

Сообщение отредактировал alx2 - Jul 3 2008, 10:19


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jul 3 2008, 10:31
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(alx2 @ Jul 3 2008, 14:18) *
А, возвращаясь ближе к топику, каким образом снимается проблема с шеллом? Там гвоздями забито использование своего встроенного шелла? Можно в двух словах об этом моменте?


Там вместо шелла можно использовать язык Питон и его стандартную библиотеку. А она большей частью кроссплатформенная.
Поэтому в шелле обычно просто нет необходимости. Если же автор scons-скрипта решит использовать системный шелл - будут те же проблемы.

С другой стороны, чтобы запустить scons, нужно развернуть нужные версии питона и самой библиотеки scons, так что не факт что это проще, чем развернуть нужный набор утилит для make.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 3 2008, 10:45
Сообщение #15


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

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



Цитата(Сергей Борщ @ Jul 1 2008, 22:09) *
А смысл? Все равно makefile обычно пишется используя возможности bash.

Я про свои личные makefile:)
Цитата
Вы можете скачать их отдельно с sourceforge и поставить один комплект на все пакеты. Будете иметь самую свежую версию этих утилит.

А в каком конкретно пакете там sh?

Цитата(alx2 @ Jul 3 2008, 04:02) *
ИМХО никак. Какого поведения хочется добиться? Что должен делать make, сконфигурированный для работы без шелла, когда он встречает команду, для выполнения которой нужен шелл?


Ну я же писал. Это мои makefile-ы, и проблема в том, что разные версии make обрабатывают их по разному. Одни обходятся без sh, а другие - ищут sh.

Цитата
А документацию читать сейчас не модно? smile.gif Да, установить переменную SHELL. Можно как переменную окружения, можно как переменную самого make хоть в Makefile, хоть в командной строке.

Какую документацию? man make? Не понимаете вы, линуксоиды, нас, бедных виндузятников smile.gif Окей, попробую SHELL, спасибо.
Цитата
Вот за это я и не люблю комбайны (когда все в одном флаконе) - нафиг мне много разных make? А насчет winavr - это я, выходит, отстал от жизни. Когда я N лет назад интересовался (в RU.EMBEDDED), что такое winavr, мне ответили, что это avr-gcc под винду. А теперь в него и binutils (что еще логично), и make (что уже менее логично) запихнули... Скоро, наверное, редактор с отладчиком туда же сунут... smile.gif

Дык, уже, all included, как говоритсяsmile.gif


Цитата(dxp @ Jul 3 2008, 13:45) *
некоторое время назад я успешно переполз на SCons (http://www.scons.org/), чего и вам желаю.


А как же куча старых проектов?
И ещё такой вопрос: можно ли при использовании scons сесть за любой компьютер, воткнуть флешку и, ничего не инсталлируя, что-то поредактировать и покомпилировать? Как в этом смысле питон?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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