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

 
 
> GNU make в windows, Проблемы и их решения
LessNik
сообщение Jun 4 2009, 07:51
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 6-09-06
Из: Москва
Пользователь №: 20 118



Добрый день!

gnu make не хочет понимать пути с пробелами. Как объяснить?

Код
CC = c:/Files/IAR Systems/Embedded Workbench 5.4 Evaluation/arm/bin/iccarm.exe          // почему-то понимает
INC1_PATH = ../../Common
INC2_PATH = ./Include
INC3_PATH = c:/Files/IAR Systems/Embedded Workbench 5.4 Evaluation/arm/INC             // не понимает

DLIB_CONFIG_FILE = c:/Files/IAR Systems/Embedded Workbench 5.4 Evaluation/arm/INC/DLib_Config_Normal.h

CC_OPT = -I. -I\""$(INC2_PATH)/\"" -I\""$(INC3_PATH)/\""

main.o: main.cpp
    @echo ------------------------ compiling $< ------------------------
    $(CC) main.cpp $(CC_OPT)

all: main.o


Выдаёт следующее:
/usr/bin/sh: c:/Files/IAR: No such file or directory
make: *** [main.o] Error 127
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3 >  
Start new topic
Ответов (15 - 29)
AHTOXA
сообщение Jun 4 2009, 17:35
Сообщение #16


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

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



Цитата(ReAl @ Jun 4 2009, 23:10) *
Проверка - слепить свою програмку, которая распечатывает argv[], вместо rar.exe подставить её и посмотреть, что реально передаётся (у меня одно время такая программка prargs.exe болталась в c:\bin)


У меня тоже есть такая - echo :-) Проверяю:
без sh:
Код
--- archiving...
   echo Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj
   Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj
   --- done!

С sh:
Код
--- archiving...
   echo Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj
   Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/config.c ./src/main.c ./src/rs1.c
   ./src/spi1.c ./src/common.h ./src/config.h ./src/gpio.h ./prj/stm32f10x_flash_md.ld ./makefile ./test1.mpj
   --- done!


Точно, разворачивает, зараза! Маскирую звёздочки:
Код
--- archiving...
   echo Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/\*.c ./src/\*.h ./prj/\*.\* ./makefile ./\*.mpj
   Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj
   --- done!


Замечательно, сработало. Снова удаляю sh:
Код
--- archiving...
   echo Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/\*.c ./src/\*.h ./prj/\*.\* ./makefile ./\*.mpj
   Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/\*.c ./src/\*.h ./prj/\*.\* ./makefile ./\*.mpj
   --- done!


Не очень красиво, но Rar это проглатывает нормально. Эта проблема, будем считать, решенаsmile.gif

А как быть с другими, которые я перечислил? Как, например, запустить cmd с параметрами?

Цитата(xemul @ Jun 4 2009, 23:17) *
Почему sh должен что-то знать про встроенные команды cmd? Для sh аналогичная команда называется mkdir, и он ее с радостью исполнит. Но cmd, будучи запущенным в sh, на mkdir гнусно выругается.


Потому, что это sh для винды. Порт, понимаете? Это подразумевает некую адаптацию под.

ЗЫ. Со слешами ReAl всё чётко разъяснил, спасибо емуsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 4 2009, 19:13
Сообщение #17


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(AHTOXA @ Jun 4 2009, 20:35) *
У меня тоже есть такая - echo :-)
А ещё невесть когда под досом нюансы какие-то были и выходило, что единственной адекватной моделью кошки могла быть только кошка. В смысле натуральный .exe


Цитата(AHTOXA @ Jun 4 2009, 20:35) *
А как быть с другими, которые я перечислил? Как, например, запустить cmd с параметрами?
Такое впечатление, что cmd интересовал меня в "эпоху" использования борландовского make, который как родной для доса/винды был.
Потом как-то интересовало наоборот - как заставить make всё делать через sh (он имеет право одиночные команды выполнять прямым обращением к ос без создания subshell)

О, кстати, а
Код
SHELL:=$(COMSPEC) /C

в первых строках makefile не спасёт отца русской демократии?
Правда, тогда всё через cmd будет работать.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 4 2009, 20:08
Сообщение #18


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

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



Цитата(ReAl @ Jun 5 2009, 01:13) *
А ещё невесть когда под досом нюансы какие-то были и выходило, что единственной адекватной моделью кошки могла быть только кошка. В смысле натуральный .exe

Да у меня тоже такая кошка есть:-) Выпытывала у IAR EW параметры командной строки компилятора/линкера, чтоб к med-у присобачитьsmile.gif
Цитата
Такое впечатление, что cmd интересовал меня в "эпоху" использования борландовского make, который как родной для доса/винды был.
Потом как-то интересовало наоборот - как заставить make всё делать через sh (он имеет право одиночные команды выполнять прямым обращением к ос без создания subshell)

И как, удалось? А то тут сразу видна засада с этими звёздочками. Не все же программы такие добрые как Rar, некоторым наверняка не понравится экранирование, если make вдруг решит запустить их без sh...
Цитата
О, кстати, а
Код
SHELL:=$(COMSPEC) /C

в первых строках makefile не спасёт отца русской демократии?
Правда, тогда всё через cmd будет работать.

Дык, я этого эффекта добился удалением sh:) А иногда всё же хочется что-нибудь этакое завернуть в makefile, скриптовое:-)))


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 4 2009, 20:43
Сообщение #19


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(AHTOXA @ Jun 4 2009, 23:08) *
И как, удалось? А то тут сразу видна засада с этими звёздочками. Не все же программы такие добрые как Rar, некоторым наверняка не понравится экранирование, если make вдруг решит запустить их без sh...
Да где-то писал. Достаточно сделать так, чтобы команда не была одиночной :-)
Например,
Код
archive:
     @echo --- archiving...
     $(archiver) a -r -agyy-mm-dd,hh-nn-ss $(bak_dir)/$(target)_.rar $(rars)
     @echo --- done!
переписать как
Код
archive:
     @echo --- archiving...; \
     $(archiver) a -r -agyy-mm-dd,hh-nn-ss $(bak_dir)/$(target)_.rar $(rars); \
     @echo --- done!
и всё - у нас уже не набор одиночніх команд, а типа скрипт :-)
Т.е. к сугубо одиночной команде какой-то эхо-оживляж редко когда мешает.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 4 2009, 22:52
Сообщение #20


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

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



Спасибо, попробую пооживлять:-)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 5 2009, 11:07
Сообщение #21


Местный
***

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



Цитата(AHTOXA @ Jun 4 2009, 20:42) *
Видите разницу?
А можно еще показать содержимое директория src (вывод ls -l src например)?
Цитата(AHTOXA @ Jun 4 2009, 20:42) *
Под шеллом Rar не увидел папочки /src/term! smile.gif
А должен был? Папочка src/term не подпадает ни под одну из указанных в командной строке масок (в "term" нет точки например)!
Цитата(AHTOXA @ Jun 4 2009, 20:42) *
ЗЫ. Только не говорите, что это Rar виноват, потому что у меня много других примеровsmile.gif
Не буду. Он не виноват. В этом случае, похоже, виноват программист. smile.gif
Цитата(AHTOXA @ Jun 4 2009, 21:10) *
Но объясните мне тогда, зачем sh, вместо того, чтобы просто вызвать заказанную программу с заказанными аргументами, ещё и подменяет системные вызовы для этой программы? Я так понял, что не срабатывает рекурсивный поиск внутри самого Rar-а.
Почему Вы решили, что он не срабатывает? Насколько я вижу, у Вас в директории ./src/ есть файлы config.c, main.c и rs1.c. Правильно? Во вложенных в src директориях (том же term например) есть файлы с такими именами? Что-то мне подсказывает, что нет. Тогда какой рекурсии Вы ждете? При наличии файлов с одинаковыми именами рекурсия работает, я только что проверил. Причина разного поведения rar'а кроется в передаче ему при вызове разных аргументов, а вовсе не подмена каких-либо системных вызовов...

Цитата(xemul @ Jun 4 2009, 22:17) *
Возможно, проще будет формировать скриптом список файлов, подлежащих упаковке, и скармливать его rar'у.
ИМХО в данном случае проше изучить документацию на шелл и правильно им пользоваться. В частности, если программист не хочет, чтобы шелл выполнял подстановку имен файлов вместо содержащих "*" аргументов, он должен сообщить об этой шеллу, например заэкранировав звезду бэкслешем или взяв аргумент в одинарные кавычки...

Цитата(AHTOXA @ Jun 4 2009, 22:35) *
А как быть с другими, которые я перечислил? Как, например, запустить cmd с параметрами?
Это единственный шелл, о котором я неодновретно слышал отрицательные отзывы именно в плане работы с make. Это плохой, негодный шелл. Лучше им просто не пользоваться. Параметры же ему передаются с символом слэш вместо минуса.

Цитата(AHTOXA @ Jun 5 2009, 01:08) *
если make вдруг решит запустить их без sh...
Насколько мне известно, самого наличия "*" в командной строке вполне достаточно чтобы гнутый make звал шелл.

Сообщение отредактировал alx2 - Jun 5 2009, 11:17


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 5 2009, 12:06
Сообщение #22


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

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



Цитата(alx2 @ Jun 5 2009, 17:07) *
А можно еще показать содержимое директория src (вывод ls -l src например)?
Зачем? Вроде всё уже выяснили. Там исходники и подкаталог с исходниками (*.c и *.h)
Цитата
А должен был? Папочка src/term не подпадает ни под одну из указанных в командной строке масок (в "term" нет точки например)!/quote]
Должен был. Ибо ключик -r для Rar требует рекурсивного обхода заданных путей. Без sh же всё срабатывает.

Цитата
Не буду. Он не виноват. В этом случае, похоже, виноват программист. smile.gif

Узнаю линупсоеда:-) Виноват может быть кто угодно, только не линупс:-) Вы бы почитали тред повнимательнее, ведь мы с ReAl-ом уже во всём разобрались.
Цитата
Почему Вы решили, что он не срабатывает? Насколько я вижу, у Вас в директории ./src/ есть файлы config.c, main.c и rs1.c. Правильно? Во вложенных в src директориях (том же term например) есть файлы с такими именами? Что-то мне подсказывает, что нет. Тогда какой рекурсии Вы ждете? При наличии файлов с одинаковыми именами рекурсия работает, я только что проверил. Причина разного поведения rar'а кроется в передаче ему при вызове разных аргументов, а вовсе не подмена каких-либо системных вызовов...
Да, с этим уже разобрались. Sh не подменял системные вызовы, sh зачем-то самовольно развернул звёздочки. Его старание похвально, но я от него этого совсем не ждал. Получилось во вред.
Повторю, я говорю всё это применительно к винде. Наверное, для юниксов это всё естественно и само собой, но для меня, виндового пользователя, это оказалось совершенно неожиданно.
Цитата
Это единственный шелл, о котором я неодновретно слышал отрицательные отзывы именно в плане работы с make. Это плохой, негодный шелл. Лучше им просто не пользоваться. Параметры же ему передаются с символом слэш вместо минуса.

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

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


А вот это интересно, спасибо, проверю.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 7 2009, 16:58
Сообщение #23


Местный
***

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



Цитата(AHTOXA @ Jun 5 2009, 17:06) *
Узнаю линупсоеда:-) Виноват может быть кто угодно, только не линупс:-) Вы бы почитали тред повнимательнее, ведь мы с ReAl-ом уже во всём разобрались.
Вы обознались. Я линукс не ем, и вообще им не пользуюсь. И даже слова такого тут не произносил. smile.gif В том, что программист не прочитал документацию на используемую программу, и не знал, что звезда для шелла имеет специальное значение, виноват уж точно не линукс... А сообщение я отредактировал, удалив то, о чем ReAl и другие уже написали. Там изначально вдвое больше было написано... Если что-то лишнее и осталось - прошу прощения за недосмотр.
Цитата(AHTOXA @ Jun 5 2009, 17:06) *
Какие нарекания?
К сожалению, сейчас уже вряд ли вспомню. Одной из проблем, насколько мне помнится, было очень уж сильное ограничение на длину командной строки. Коллега сталкивался с невозможностью сделать "echo ...список файлов... >listfile".
Цитата(AHTOXA @ Jun 5 2009, 17:06) *
И много чего нельзя сделать иначе чем через него. И в том, что sh не хочет запускать cmd, а вижу признаки заговора линупсоедов:-) А слеш там обратный, чем он мешает sh?
Ой, извините, я уже ничего не понимаю. Просто каша какая-то - все в одну кучу свалено! smile.gif Как это "sh не хочет запускать cmd"? Кто вообще спрашивает его желание? Что нормальному шеллу в командной строке указывают, то он и выполняет. При чем тут линуксоеды? Каким боком шеллу мешает обратный слеш? Прошу прощения, но я ничего не могу на это ответить. Я не сталкивался ни с проблемой сделать что-либо без использования cmd, ни с отказом шелла что-либо запускать, ни с помехами от бэкслешей.

Впрочем, по поводу использования внутренних команд cmd.exe - вот фрагмент Makefile'а моего коллеги:
Код
COPY = cmd /C copy

file2.bin: file1.bin
      $(COPY) file1.bin file2.bin


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 8 2009, 09:04
Сообщение #24


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

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



Цитата(alx2 @ Jun 7 2009, 22:58) *
Вы обознались. Я линукс не ем, и вообще им не пользуюсь. И даже слова такого тут не произносил. smile.gif

Да не суть. Главное, что не виндузоид smile.gif
Цитата
В том, что программист не прочитал документацию на используемую программу, и не знал, что звезда для шелла имеет специальное значение, виноват уж точно не линукс...

Хм. Я совершенно не собирался использовать sh, он сам как-то затесался...
Цитата
К сожалению, сейчас уже вряд ли вспомню. Одной из проблем, насколько мне помнится, было очень уж сильное ограничение на длину командной строки. Коллега сталкивался с невозможностью сделать "echo ...список файлов... >listfile".

Это, имхо, очень устаревшие сведения.
Цитата
Ой, извините, я уже ничего не понимаю. Просто каша какая-то - все в одну кучу свалено! smile.gif Как это "sh не хочет запускать cmd"? Кто вообще спрашивает его желание? Что нормальному шеллу в командной строке указывают, то он и выполняет.

Вот именно. А этот - самовольничает. В сообщении №13 я привёл пример моей попытки вызова cmd.
Цитата
При чем тут линуксоеды? Каким боком шеллу мешает обратный слеш? Прошу прощения, но я ничего не могу на это ответить. Я не сталкивался ни с проблемой сделать что-либо без использования cmd, ни с отказом шелла что-либо запускать, ни с помехами от бэкслешей.

Это потому, что вы работаете не под виндой. То есть, извините, берётесь судить о том, чего не пробовали. Я уверен, что вы отлично знаете, как устроен sh, но под виндой у него есть некоторые особенности. И именно о них я и веду речь.
Цитата
Впрочем, по поводу использования внутренних команд cmd.exe - вот фрагмент Makefile'а моего коллеги:
Код
COPY = cmd /C copy
file2.bin: file1.bin
       $(COPY) file1.bin file2.bin

Вашему коллеге повезло, make решил не вызывать sh при выполнении этой команды. У меня такое без sh тоже замечательно работает.


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


Местный
***

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



Цитата(AHTOXA @ Jun 8 2009, 14:04) *
Это, имхо, очень устаревшие сведения.
Рад, что сейчас ситуация улучшилась. Беру свои слова о cmd.exe обратно.
Цитата(AHTOXA @ Jun 8 2009, 14:04) *
Это потому, что вы работаете не под виндой. То есть, извините, берётесь судить о том, чего не пробовали.
AHTOXA, Вы опять неправы. Во-первых, под виндой я работал. Во-вторых, программы, о работе которых я говорил (make, rar, zsh), - кроссплатформенные, существуют под самые разные ОС. Не пользовался я только cmd.exe в качестве шелла, но я ведь сразу уточнил, что сужу о его качестве с чужих слов. Еще раз прошу прощения за то, что информация о нем оказалась устаревшей.
Цитата(AHTOXA @ Jun 8 2009, 14:04) *
Я уверен, что вы отлично знаете, как устроен sh, но под виндой у него есть некоторые особенности. И именно о них я и веду речь.
Извините за недоверие, но до сих пор приведенные Вами примеры неправильного поведения шелла оказывались примерами незнания его работы. Подозреваю, что большинство других примеров (Вы говорили что у Вас их много) - такие же. Ну не могу я представить, как еще среди кучи существующих шеллов можно не найти ни одного нормального. Думаю, что пробуя шеллы и столкнувшить с какими-то затруднениями, Вы, не разобравшись, поспешили в выводами об их низком качестве. Я использую Z shell (помнится, я его Вам когда-то рекомендовал), никаких особенностей и различий в его работе под виндой и не виндой я не замечал.
Цитата(AHTOXA @ Jun 8 2009, 14:04) *
Вашему коллеге повезло, make решил не вызывать sh при выполнении этой команды. У меня такое без sh тоже замечательно работает.
Не вижу в этом никакого везения. Программы работают в соответствии с документацией. Ладно, в предыдущем примере добавляю ";" в конце команды. Теперь make записывает команду во временный файл, вызывает для его выполнения Z shell, он в свою очередь вызывает cmd.exe, который выполняет копирование (все это видно если запустить make с ключом -d). То есть при вызове одного шелла из другого (хотя я не понимаю, для чего это может быть нужно) тоже все работает.

Теперь по поводу письма номер 13. Я до сих пор его игнорировал, так как там ошибку выдает cmd, которого я как раз не знаю и которым не пользуюсь. Да и Rar'а у меня не было. Чтобы не говорили, что я сужу о том, чего не пробовал, я решил посмотреть-таки и приведенный там пример. Скачал и установил rar, создал такой Makefile:
Код
archiver=Rar.exe
bak_dir=./bak
target=test1
rars=./src/*.c ./src/*.h ./prj/*.* ./

archive:
        @echo --- archiving...
        cmd /WAIT /C "start $(archiver) a -r -agyy-mm-dd,hh-nn-ss $(bak_dir)/$(target)_.rar $(rars)"
Создал директории bak, prj и src, положил туда тестовые файлы. Результат - ошибка не воспроизводится. Команда выполняется, на долю секунды появляется новое окно, в bak создается архив со всем содержимым текущего директория.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 8 2009, 16:04
Сообщение #26


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

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



Цитата(alx2 @ Jun 8 2009, 20:44) *
AHTOXA, Вы опять неправы. Во-первых, под виндой я работал. Во-вторых, программы, о работе которых я говорил (make, rar, zsh), - кроссплатформенные, существуют под самые разные ОС.

Пардон, откуда взялся zsh? smile.gif Вроде до сих пор шла речь о sh? Что же касается кросплатформенности, то именно об этом я и веду речь. Что при адаптации к другой платформе надо учитывать особенности этой платформы. Почему, например, make под винду перестал разворачивать звёздочки? Я думаю, что из-за того, что такое поведение (разворот звёздочек) противоречит общепринятому под виндоуз. Почему sh не перестал? Потому что он пуп земли, и поэтому он мне не нравитсяsmile.gif
Цитата
Извините за недоверие, но до сих пор приведенные Вами примеры неправильного поведения шелла оказывались примерами незнания его работы.

Вполне возможно. Я не готов тратить месяцы на изучение инструмента, единственное назначение которого (в моём применении) - вызвать другую программу.
Цитата
Подозреваю, что большинство других примеров (Вы говорили что у Вас их много) - такие же. Ну не могу я представить, как еще среди кучи существующих шеллов можно не найти ни одного нормального. Думаю, что пробуя шеллы и столкнувшить с какими-то затруднениями, Вы, не разобравшись, поспешили в выводами об их низком качестве.
Я использую Z shell (помнится, я его Вам когда-то рекомендовал), никаких особенностей и различий в его работе под виндой и не виндой я не замечал.

Я пробовал разные версии sh. Про zsh я, извините, забыл.
Цитата
Не вижу в этом никакого везения. Программы работают в соответствии с документацией. Ладно, в предыдущем примере добавляю ";" в конце команды. Теперь make записывает команду во временный файл, вызывает для его выполнения Z shell, он в свою очередь вызывает cmd.exe, который выполняет копирование (все это видно если запустить make с ключом -d). То есть при вызове одного шелла из другого (хотя я не понимаю, для чего это может быть нужно) тоже все работает.

А sh - не может:
Код
>make -d archive
Must remake target `archive'.
CreateProcess(NULL,sh D:\kgp\bin\echo --- archiving...,...)
Putting child 0x00999e00 (archive) PID 10073360 on the chain.
Live child 0x00999e00 (archive) PID 10073360
Main thread handle = 0x000007ac
--- archiving...
Reaping winning child 0x00999e00 PID 10073360
CreateProcess(D:\kgp\bin\sh.exe,D:/kgp/bin/sh.exe -c "cmd /WAIT /C \"start Rar.exe a -r -agyy-mm
-dd,hh-nn-ss ./bak/test1_.rar ./src/\*.s ./src/\*.c ./src/\*.inc ./src/\*.h ./prj/\*.\* ./makefile ./*.mpj\"",...)
Live child 0x00999e00 (archive) PID 10073360
"gp" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.


Ага, теперь хоть понятно, что за "gp" smile.gif Но всё равно непонятно, что не так... А, кажись понялsmile.gif
Меняю кавычки на одинарные, и телемаркет! Всё заработало. Большое Вам спасибо за этоsmile.gif
Правда, архив пустой, но это от экранирования наверное. Да, точно. Убрал экранирование звёздочек - всё работает.
Цитата
Код
         cmd /WAIT /C "start $(archiver) a -r -agyy-mm-dd,hh-nn-ss $(bak_dir)/$(target)_.rar $(rars)"
Создал директории bak, prj и src, положил туда тестовые файлы. Результат - ошибка не воспроизводится. Команда выполняется, на долю секунды появляется новое окно, в bak создается архив со всем содержимым текущего директория.


Интересно... Давайте уж вывод make -d, чтоб разобраться досконально. И что там с подкаталогами? Хотя в этом случае как раз работает cmd, который не умничаетsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 9 2009, 18:10
Сообщение #27


Местный
***

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



Цитата(AHTOXA @ Jun 8 2009, 21:04) *
Пардон, откуда взялся zsh? smile.gif Вроде до сих пор шла речь о sh?
Это шутка, или Вы действительно не понимаете? smile.gif Что такое, по-вашему, "sh"? Это имя конкретной программы? Это просто исторически сложившееся название команды, вызывающей шелл. Такое имя было у Thompson shell в первой версии AT&T UNIX'а. Не хотите ли Вы сказать, что у Вас именно тот самый Thompson shell? smile.gif С тех пор утекло много воды и появилась масса самых разных шеллов. Они часто имеют и собственные команды запуска, например "bash" для Bourne-Again shell или "zsh" для Z shell - это дает возможность иметь сразу несколько разных шеллов. Таким образом, когда говорят "bash", "tcsh", "zsh" или "ash" - обычно понятно, какой именно шелл имеется в виду. А вот просто "sh" без дополнительных уточнений не говорит ни о чем. На той машине, где я вчера заставлял gmake пускать cmd.exe из-под Z-шелла, имя исполняемого файла Z-шелла было "sh.exe"! Здесь я назвал его zsh только ради конкретизации. На моей домашней машине, за которой я сейчас пишу, команда sh - это BSD-шелл, выросший из Bourne shell. В некоторых ОС с ядром linux принято, что команда sh вызывает Bourne-Again shell (линуксисты его любят). Под телевизором у меня стоит Дримбокс - у него команда sh запускает ash. Шелл из комплекта виндового ресурскита (не знаю как он называется) тоже, насколько я помню, имел имя файла sh.exe. Поэтому я до сих пор не знаю, какую именно программу Вы использовали в качестве шелла.
Цитата(AHTOXA @ Jun 8 2009, 21:04) *
Что же касается кросплатформенности, то именно об этом я и веду речь. Что при адаптации к другой платформе надо учитывать особенности этой платформы. Почему, например, make под винду перестал разворачивать звёздочки?
Приведите, пожалуйста, пример, в котором GNU make (и именно он!) под одной платформой звездочку разворачивает, а под виндой - нет. У меня, еще раз извините, есть сомнения в существовании такого различия в поведении make.
Цитата(AHTOXA @ Jun 8 2009, 21:04) *
Я не готов тратить месяцы на изучение инструмента, единственное назначение которого (в моём применении) - вызвать другую программу.
Тогда извините, но я верну Вам почти ваши же слова. Высказывая негативное к нему (инструменту) отношение, говоря, что он дурит, подменяет системные вызовы и т.п., Вы беретесь судить о том, чего не знаете...
Цитата(AHTOXA @ Jun 8 2009, 21:04) *
А sh - не может:
Наверняка Вы его неправильно используете.
Цитата(AHTOXA @ Jun 8 2009, 21:04) *
Ага, теперь хоть понятно, что за "gp"
....
Большое Вам спасибо за это smile.gif - всё работает.
Мне-то за что??? smile.gif Я кроме "у меня работает" и не сказал ничего. Я так и не знаю даже, какой у Вас там шелл!!! smile.gif
Цитата(AHTOXA @ Jun 8 2009, 21:04) *
Интересно... Давайте уж вывод make -d, чтоб разобраться досконально. И что там с подкаталогами? Хотя в этом случае как раз работает cmd, который не умничаетsmile.gif
Сейчас машина с виндой недоступна, завтра вечером постараюсь вывод привести.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 9 2009, 19:57
Сообщение #28


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

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



Цитата(alx2 @ Jun 10 2009, 00:10) *
Это шутка, или Вы действительно не понимаете? smile.gif Что такое, по-вашему, "sh"?

sh - это та программа, которую вызывает make, неужели непонятно? smile.gif
Цитата
А вот просто "sh" без дополнительных уточнений не говорит ни о чем.

Тем, кто под виндой пользуется Winavr, winarm, msp-gcc и проч. и проч. и проч - очень даже говорит. На всякий случай посмотрел:
Код
GNU bash, version 3.1.0(1)-release (i686-pc-msys)

Цитата
Приведите, пожалуйста, пример, в котором GNU make (и именно он!) под одной платформой звездочку разворачивает, а под виндой - нет. У меня, еще раз извините, есть сомнения в существовании такого различия в поведении make.
Я помню, что предыдущие версии gnu make разворачивали звёздочки. 3.79-cygwin, емнимс. Частично это подтверждает ReAl в посте #14. Но Вы, конечно, можете продолжать сомневаться.
Цитата
Тогда извините, но я верну Вам почти ваши же слова. Высказывая негативное к нему (инструменту) отношение, говоря, что он дурит, подменяет системные вызовы и т.п., Вы беретесь судить о том, чего не знаете...
Это нечестно. Про подмену вызовов - я уже давно признал что это не так. А насчёт остального - привёл примеры. Вы считаете, это нормальное поведение программы? Не дурит? Я так не считаю.
Цитата
Наверняка Вы его неправильно используете.

Ну это уже совсем ни в какие ворота. Я привёл пример makefile, показал, что происходит. Зачем тогда весь этот спор, если аргументы игнорируются?
Цитата
Мне-то за что??? smile.gif

За то, что благодаря этому дурацкому спору с Вами, я научился запускать cmd из-под sh:) Хотя я наверное всё равно выкину это sh опятьsmile.gif
Цитата
Сейчас машина с виндой недоступна, завтра вечером постараюсь вывод привести.

Ок.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 10 2009, 13:47
Сообщение #29


Местный
***

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



Цитата(AHTOXA @ Jun 10 2009, 00:57) *
sh - это та программа, которую вызывает make, неужели непонятно? smile.gif
Ну тогда я все правильно написал про zsh - у меня под виндой make, запуская sh, вызывает именно Z-shell. Не знаю, почему Вас это удивило.
Цитата(AHTOXA @ Jun 10 2009, 00:57) *
Я помню, что предыдущие версии gnu make разворачивали звёздочки. 3.79-cygwin, емнимс. Частично это подтверждает ReAl в посте #14. Но Вы, конечно, можете продолжать сомневаться.
А при чем тут make? Прочитайте раздел 4.4 документации на GNU make.
Цитата
Wildcard expansion is performed by make automatically in targets and in prerequisites. In commands the shell is responsible for wildcard expansion.
В случае, о котором говорил Real, звезды подставляются как раз в команду, а вовсе не в цели или пререквизиты. Таким образом, make в том примере и не должен разворачивать звезды, это не его работа. Извините за недоверие, но в том, что предыдущие версии make, вопреки документации, делали это сами, я продолжаю сомневаться.
Цитата(AHTOXA @ Jun 10 2009, 00:57) *
Это нечестно. Про подмену вызовов - я уже давно признал что это не так. А насчёт остального - привёл примеры. Вы считаете, это нормальное поведение программы? Не дурит? Я так не считаю.
Ни в одном из приведенных Вами примеров (пример с rar, пример с вызовом внутренней команды cmd) я не вижу расхождения поведения программ с их документацией. Да, поведение, совпадающее с описанным в документации, я считаю нормальным.
Цитата(AHTOXA @ Jun 10 2009, 00:57) *
Ну это уже совсем ни в какие ворота. Я привёл пример makefile, показал, что происходит. Зачем тогда весь этот спор, если аргументы игнорируются?
Да полно, не сердитесь Вы так. smile.gif Ну вот сами рассудите. До этого уже неоднократно оказывалось, что когда поведение программы расходилось с Вашими ожиданиями, поведение программы совпадало с документацией, а Ваши ожидания - нет. Вы сами говорили, что не готовы изучать документацию на шелл. Каким именно шеллом Вы пользовались, мне не было известно. У меня Ваш пример работал без ошибок. Какой же вывод я по-вашему должен был сделать? Что именно тут Вы обнаружили ошибку в работе шелла? smile.gif Еще раз извините, но это неубедительно. Мне кажется, прежде чем говорить, что нашел глюк в программе, надо десять раз свериться с ее документацией, проверить, не упустил ли чего сам... Вот если вы скажете: "В таком-то месте документации написано так, а в жизни программа работает эдак" - это будет аргумент, который вряд ли можно игнорировать. А пока Ваши аргументы - это Ваши ожидания, не подкрепленные документацией...

Кстати, раз Вы уже поняли, расскажите, что это было за "gp", которое cmd у Вас не мог найти. Любопытно все-таки...

Вот "хвост" вывода make -d, который Вы просили:
Код
Must remake target `archive'.
Creating temporary batch file c:\TMP\make45282.sh
--- archiving...
CreateProcess(c:\usr\bin\sh.exe,c:/usr/bin/sh.exe c:\TMP\make45282.sh,...)
Putting child 0x008908a0 (archive) PID 8985376 on the chain.
Live child 0x008908a0 (archive) PID 8985376
Reaping winning child 0x008908a0 PID 8985376
Cleaning up temp batch file c:\TMP\make45282.sh
Creating temporary batch file c:\TMP\make45283.sh
cmd /WAIT /C "start Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj"
CreateProcess(c:\usr\bin\sh.exe,c:/usr/bin/sh.exe c:\TMP\make45283.sh,...)
Live child 0x008908a0 (archive) PID 8982784
Reaping winning child 0x008908a0 PID 8982784
Cleaning up temp batch file c:\TMP\make45283.sh
Removing child 0x008908a0 PID 8982784  from chain.
Successfully remade target file `archive'.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 10 2009, 16:59
Сообщение #30


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

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



Цитата(alx2 @ Jun 10 2009, 19:47) *
Ну тогда я все правильно написал про zsh - у меня под виндой make, запуская sh, вызывает именно Z-shell. Не знаю, почему Вас это удивило.

Потому что я говорил про мой sh smile.gif
Цитата
А при чем тут make? Прочитайте раздел 4.4 документации на GNU make.В случае, о котором говорил Real, звезды подставляются как раз в команду, а вовсе не в цели или пререквизиты. Таким образом, make в том примере и не должен разворачивать звезды, это не его работа. Извините за недоверие, но в том, что предыдущие версии make, вопреки документации, делали это сами, я продолжаю сомневаться.

Позвольте я Вам процитирую, что сказал ReAl:
Цитата(ReAl @ Jun 4 2009, 23:10) *
В случае с sh (и, кажется, с некоторыми вариантами самого make, тогда и упрятывание sh из путей не помогает) раскрутка '*'-чек происходит до вызова rar и ему передаются уже все обнаруженные файлы.

Курсив мой. Насколько я понимаю, здесь речь идёт именно о разворачивани звёздочек мейком в команде. Моя память говорит мне, что я также встречался с таким поведением мейка. Но доказать я сейчас конечно не смогу, я не храню кривые мейки.
Цитата
Да полно, не сердитесь Вы так. smile.gif Ну вот сами рассудите. До этого уже неоднократно оказывалось, что когда поведение программы расходилось с Вашими ожиданиями, поведение программы совпадало с документацией, а Ваши ожидания - нет.

Да бросьте вы. Вот моя команда в makefile:
Код
   archive:
       @cmd /WAIT /C "start rar a -r -agyy-mm-dd,hh-nn-ss ./bak/test_.rar ./src/*.c ./src/*.h"

Вот что происходит:
Код
>make archive
   "gp" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

Это всё в соответствии с документацией? И то, что у Вас эта строка работает, а у меня - нет, это тоже прописано в документации?
Вы меня извините за повтор, но у меня такое чувство, что часть моих аргументов и примеров уходит в никуда. Особенно про необходимость адаптации программы при портировании на другую платформу.
Цитата
А пока Ваши аргументы - это Ваши ожидания, не подкрепленные документацией...

Да я собственно и не отрицал этого. Говоря "глючит", я имел в виду - "работает не так, как я ожидаю". Такая формулировка слова "глючит" примирит Вас с моим высказыванием? :-)
Цитата
Кстати, раз Вы уже поняли, расскажите, что это было за "gp", которое cmd у Вас не мог найти. Любопытно все-таки...

Дык, там же видно было:
Код
CreateProcess(D:\kgp\bin\sh.exe,D:/kgp/bin/sh.exe -c "cmd /WAIT /C \"start rar a -r -agyy-mm-dd,hh-nn-ss ./bak/test_.rar
    ./src/*.c ./src/*.h\"",...)
   Live child 0x009941b0 (archive) PID 10069136
   "gp" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

gp - это кусочек от пути к sh (D:\kgp\bin\sh.exe). Каким образом он попал в командную строку, переданную cmd - не знаю. Может и мейк дурит. Давайте проверим. У меня есть программа ShowCmdLine.exe (ReAl напомнил), которая показывает командную строку. Итак:

Код
   archive:
       @ShowCmdLine.exe /WAIT /C "start rar a -r -agyy-mm-dd,hh-nn-ss ./bak/test_.rar ./src/*.c ./src/*.h"

Командная строка:
Код
ShowCmdLine.exe D:/kgp/WAIT c:/ "start rar a -r -agyy-mm-dd,hh-nn-ss ./bak/test_.rar ./src/*.c ./src/*.h"


Красотаsmile.gif Проверим, кто же дурит. Переименовываем ShowCmdLine.exe в sh.exe, смотрим, что передаёт make шеллу:
Код
D:/kgp/bin/sh.exe -c "cmd /WAIT /C \"start rar a -r -agyy-mm-dd,hh-nn-ss ./bak/test_.rar ./src/*.c ./src/*.h\""

Вроде всё нормально, не? Значит, таки sh дурит? И не только в моём понимании этого слова? smile.gif

Цитата
Вот "хвост" вывода make -d, который Вы просили:
Код
Must remake target `archive'.
     Creating temporary batch file c:\TMP\make45282.sh
     ...


У, через временный файл, ничего не видно smile.gif


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

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

 


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


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