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

 
 
> 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
 
Start new topic
Ответов
AHTOXA
сообщение Jun 4 2009, 08:19
Сообщение #2


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

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



Это не мейк дурит, а sh. Я так не нашёл нормального. Выкинул нафиг.
А имена возьмите в кавычки, и всё заработает.


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


Местный
***

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



Цитата(AHTOXA @ Jun 4 2009, 13:19) *
Это не мейк дурит, а sh. Я так не нашёл нормального. Выкинул нафиг.
Это действительно шелл (о чем написано в сообщении об ошибке, которое надо было внимательно читать), а не мейк. Но шелл в данном случае вовсе не дурит, а ведет себя совершенно правильно. Ему передали такую команду:
Код
c:/Files/IAR Systems/Embedded Workbench 5.4 Evaluation/arm/bin/iccarm.exe main.cpp -I. -I\""./Include/"\" -I\""c:/Files/IAR Systems/Embedded Workbench 5.4 Evaluation/arm/INC/"\"
В этой команде первый ничем не экранированный пробел стоит после c:/Files/IAR. Поэтому c:/Files/IAR шелл трактует как имя команды, все остальное - как ее параметры.
Также замечу, что эту вызвавшую ошибку команду мейк выводит на экран, и ее тоже стоило внимательно прочитать - все стало бы ясно.


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


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

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



Цитата(alx2 @ Jun 4 2009, 19:44) *
Это действительно шелл (о чем написано в сообщении об ошибке, которое надо было внимательно читать), а не мейк. Но шелл в данном случае вовсе не дурит, а ведет себя совершенно правильно.

Согласен, в данном случае шелл ведёт себя правильно. Я просто выразил своё негативное к нему(шеллу) отношениеsmile.gif (Под виндой конечно, думаю что в родной среде он хорош.)


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



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(AHTOXA @ Jun 4 2009, 18:21) *
Согласен, в данном случае шелл ведёт себя правильно. Я просто выразил своё негативное к нему(шеллу) отношениеsmile.gif (Под виндой конечно, думаю что в родной среде он хорош.)

У любого уважающего себя шелла на путь с пробелами (или любой аргумент с пробелами), не оформленный должным образом (общепринято - кавычками, хотя без труда переопределяется), приключится такой же рвотный рефлекс.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 4 2009, 15:42
Сообщение #6


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

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



Цитата(xemul @ Jun 4 2009, 21:04) *
У любого уважающего себя шелла на путь с пробелами (или любой аргумент с пробелами), не оформленный должным образом (общепринято - кавычками, хотя без труда переопределяется), приключится такой же рвотный рефлекс.


Да. Да. Да! Поэтому я согласился, что в этом случае шелл ведёт себя правильноsmile.gif

А вот пример неправильного поведения (их у меня много):

кусок makefile:

Код
    target    = test1
...
       archiver    = Rar.exe
...
     rars    = $(src_dir)/*.c $(src_dir)/*.h $(prj_dir)/*.* $(base)/makefile $(base)/*.mpj
...
archive:
     @echo --- archiving...
     $(archiver) a -r -agyy-mm-dd,hh-nn-ss $(bak_dir)/$(target)_.rar $(rars)
     @echo --- done!


как это работает без шелла (удалил из пути):
Код
>make archive
--- archiving...
Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj

Creating archive ./bak/test1_09-06-04,21-33-44.rar

Adding    ./src/config.c                                              OK
Adding    ./src/main.c                                                OK
Adding    ./src/rs1.c                                                 OK
Adding    ./src/term\commands.c                                       OK
Adding    ./src/term\handlers.c                                       OK
Adding    ./src/term\vars.c                                           OK
Adding    ./src/config.h                                              OK
Adding    ./src/gpio.h                                                OK
Adding    ./src/rs1.h                                                 OK
Adding    ./src/term\commands.h                                       OK
Adding    ./src/term\handlers.h                                       OK
Adding    ./src/term\vars.h                                           OK
Adding    ./prj/stm32f10x_flash_md.ld                                 OK
Adding    ./makefile                                                  OK
Adding    ./test1.mpj                                                 OK
Done
--- done!


и с шеллом (вернул):

Код
>make archive
--- archiving...
Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj

Creating archive ./bak/test1_09-06-04,21-24-00.rar

Adding    ./src/config.c                                              OK
Adding    ./src/main.c                                                OK
Adding    ./src/rs1.c                                                 OK
Adding    ./src/config.h                                              OK
Adding    ./src/gpio.h                                                OK
Adding    ./src/rs1.h                                                 OK
Adding    ./prj/stm32f10x_flash_md.ld                                 OK
Adding    ./makefile                                                  OK
Adding    ./test1.mpj                                                 OK
Done
--- done!


Видите разницу? Под шеллом Rar не увидел папочки /src/term! smile.gif Я живу себе в полной уверенности, что у меня всё занычено в архив, а не тут-то было. Вот такая вот засадаsmile.gif
Поэтому я выкинул sh, и ничуть не жалею.

ЗЫ. Только не говорите, что это Rar виноват, потому что у меня много других примеровsmile.gif


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



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(AHTOXA @ Jun 4 2009, 19:42) *
Видите разницу? Под шеллом Rar не увидел папочки /src/term! smile.gif Я живу себе в полной уверенности, что у меня всё занычено в архив, а не тут-то было. Вот такая вот засадаsmile.gif
Поэтому я выкинул sh, и ничуть не жалею.

ЗЫ. Только не говорите, что это Rar виноват, потому что у меня много других примеровsmile.gif

Несложно заметить, что пропущены все папки с символом '\'
Для знакомых мне шеллов (кроме виндового cmd) символ '\' имеет спецательное значение, отсюда и все (Ваши) проблемы.
А rar (под DOS/Win) и cmd просто не понимают разницы между '\' и '/' в путях smile.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 4 2009, 17:10
Сообщение #8


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

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



Цитата(xemul @ Jun 4 2009, 18:51) *
Несложно заметить, что пропущены все папки с символом '\'
Мне кажется, что они сначала пропущены были, а только потом оказалось, что они с '\' smile.gif
Расшифровываю: в выдаче на экран в строках эти '\' - уже от самого rar, он при рекурсивном разборе каталогов так их напечатал.
А в случае с шеллом - в самом
Цитата
--- archiving...
Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj
обратніх слешей в передаваемой строке нет.

Теперь в чём разница, и как бороться, насколько я помню:

В случае с sh (и, кажется, с некоторыми вариантами самого make, тогда и упрятывание sh из путей не помогает) раскрутка '*'-чек происходит до вызова rar и ему передаются уже все обнаруженные файлы. Но эта раскрутка происходит без спуска вниз по каталогам.

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

Правка - замаскировать '*'-ки, чтобы они не имели специального смысла
Код
rars    = $(src_dir)/\*.c $(src_dir)/\*.h $(prj_dir)/\*.\* $(base)/makefile $(base)/\*.mpj


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


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

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


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

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


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

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


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

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


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

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



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


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

Сообщений в этой теме
- LessNik   GNU make в windows   Jun 4 2009, 07:51
- - _Pasha   Цитата(LessNik @ Jun 4 2009, 10:51) Добры...   Jun 4 2009, 07:56
- - LessNik   Я до этого скачивал последнюю версию WinAvr, где е...   Jun 4 2009, 08:07
|- - Сергей Борщ   Цитата(LessNik @ Jun 4 2009, 11:07) Я до ...   Jun 4 2009, 09:04
|- - _Pasha   Цитата(AHTOXA @ Jun 4 2009, 11:19) А имен...   Jun 4 2009, 08:23
||- - AHTOXA   Цитата(xemul @ Jun 4 2009, 21:51) Несложн...   Jun 4 2009, 16:10
|||- - xemul   Цитата(AHTOXA @ Jun 4 2009, 20:10) Я это ...   Jun 4 2009, 17:17
|- - alx2   Цитата(AHTOXA @ Jun 4 2009, 20:42) Видите...   Jun 5 2009, 11:07
|- - AHTOXA   Цитата(alx2 @ Jun 5 2009, 17:07) А можно ...   Jun 5 2009, 12:06
|- - alx2   Цитата(AHTOXA @ Jun 5 2009, 17:06) Узнаю ...   Jun 7 2009, 16:58
|- - AHTOXA   Цитата(alx2 @ Jun 7 2009, 22:58) Вы обозн...   Jun 8 2009, 09:04
|- - alx2   Цитата(AHTOXA @ Jun 8 2009, 14:04) Это, и...   Jun 8 2009, 14:44
|- - AHTOXA   Цитата(alx2 @ Jun 8 2009, 20:44) AHTOXA, ...   Jun 8 2009, 16:04
|- - alx2   Цитата(AHTOXA @ Jun 8 2009, 21:04) Пардон...   Jun 9 2009, 18:10
|- - AHTOXA   Цитата(alx2 @ Jun 10 2009, 00:10) Это шут...   Jun 9 2009, 19:57
|- - alx2   Цитата(AHTOXA @ Jun 10 2009, 00:57) sh - ...   Jun 10 2009, 13:47
|- - AHTOXA   Цитата(alx2 @ Jun 10 2009, 19:47) Ну тогд...   Jun 10 2009, 16:59
|- - ReAl   Цитата(AHTOXA @ Jun 10 2009, 19:59) Позво...   Jun 10 2009, 17:14
|- - AHTOXA   Цитата(ReAl @ Jun 10 2009, 23:14) Не обяз...   Jun 10 2009, 18:09
|- - ReAl   Цитата(AHTOXA @ Jun 10 2009, 21:09) То ес...   Jun 10 2009, 19:13
|- - AHTOXA   Понятно:-) Поискал среди старых мейков, не нашёл. ...   Jun 10 2009, 23:43
- - LessNik   Спасибо всем. Заработало: обновил make и взял стро...   Jun 4 2009, 10:38


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

 


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


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