|
GNU make в windows, Проблемы и их решения |
|
|
|
Jun 4 2009, 07:51
|

Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 4 2009, 09:04
|

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

|
Цитата(LessNik @ Jun 4 2009, 11:07)  Я до этого скачивал последнюю версию WinAvr, где есть вся подборка утилит Там в комплекте подборка утилит чуть ли не 2003 года сборки. Со всеми глюками. Я писал Эрику Веддингтону об этом, но он не хочет обновлять утилиты, мотивируя тем, что у msys нет нормального инсталлятора, а скачивать кучу архивов и собирать из них набор утилит ему лень (там во многих архивах одни и те же файлы и разобраться, какой из них более свежий - довольно муторно). Об одном из глюков я писал здесь. По вашему вопросу - мне тоже кажется, что вам надо взять строку в кавычки.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 4 2009, 10:38
|

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

|
Спасибо всем. Заработало: обновил make и взял строки в кавычки Код CC = "c:/Files/IAR Systems/Embedded Workbench 5.4 Evaluation/arm/bin/iccarm.exe" OBJS_DIR = ./OBJ INC1_DIR = ../../Common INC2_DIR = ./Include INC3_DIR = "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 = -o$(OBJS_DIR) --debug --endian=little --cpu=ARM7TDMI-S -e --fpu=None --eec++ \ --dlib_config $(DLIB_CONFIG_FILE) -I$(INC1_DIR) -I. -I$(INC2_DIR) -I$(INC3_DIR) --interwork --cpu_mode arm -Ohs
main.o: main.cpp @echo ------------------------ compiling $< ------------------------ $(CC) main.cpp $(CC_OPT)
all: main.o
|
|
|
|
|
Jun 4 2009, 13:44
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 4 2009, 15:42
|

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

|
Цитата(xemul @ Jun 4 2009, 21:04)  У любого уважающего себя шелла на путь с пробелами (или любой аргумент с пробелами), не оформленный должным образом (общепринято - кавычками, хотя без труда переопределяется), приключится такой же рвотный рефлекс. Да. Да. Да! Поэтому я согласился, что в этом случае шелл ведёт себя правильно  А вот пример неправильного поведения (их у меня много): кусок 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!  Я живу себе в полной уверенности, что у меня всё занычено в архив, а не тут-то было. Вот такая вот засада  Поэтому я выкинул sh, и ничуть не жалею. ЗЫ. Только не говорите, что это Rar виноват, потому что у меня много других примеров
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 4 2009, 15:51
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(AHTOXA @ Jun 4 2009, 19:42)  Видите разницу? Под шеллом Rar не увидел папочки /src/term!  Я живу себе в полной уверенности, что у меня всё занычено в архив, а не тут-то было. Вот такая вот засада  Поэтому я выкинул sh, и ничуть не жалею. ЗЫ. Только не говорите, что это Rar виноват, потому что у меня много других примеров  Несложно заметить, что пропущены все папки с символом '\' Для знакомых мне шеллов (кроме виндового cmd) символ '\' имеет спецательное значение, отсюда и все (Ваши) проблемы. А rar (под DOS/Win) и cmd просто не понимают разницы между '\' и '/' в путях
|
|
|
|
|
Jun 4 2009, 16:10
|

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

|
Цитата(xemul @ Jun 4 2009, 21:51)  Несложно заметить, что пропущены все папки с символом '\' Для знакомых мне шеллов (кроме виндового cmd) символ '\' имеет спецательное значение, отсюда и все (Ваши) проблемы. А rar (под DOS/Win) и cmd просто не понимают разницы между '\' и '/'  Я это заметил. Но объясните мне тогда, зачем sh, вместо того, чтобы просто вызвать заказанную программу с заказанными аргументами, ещё и подменяет системные вызовы для этой программы? Я так понял, что не срабатывает рекурсивный поиск внутри самого Rar-а. Я пытался обойти это, заставив sh вызвать родной виндовый cmd: Код archive: @echo --- archiving... cmd /WAIT /C "start $(archiver) a -r -agyy-mm-dd,hh-nn-ss $(bak_dir)/$(target)_.rar $(rars)" Код >make archive --- archiving... cmd /WAIT /C "start Rar.exe a -r -agyy-mm-dd,hh-nn-ss ./bak/test1_.rar ./src/*.c ./src/*.h ./prj/*.* ./makefile ./*.mpj" "gp" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Где тут слеши? И где он нашёл буквы "gp"?  Попробуйте также заставить sh вызвать какую-нибудь встроенную команду виндового командного интерпретатора (cmd), типа md: Код dirs: @echo --- creating directories... md prj Код >make dirs --- creating directories... md prj2 process_begin: CreateProcess(NULL, md prj2, ...) failed. make (e=2): Не удается найти указанный файл make: *** [dirs] Error 2 И так далее, и тому подобное...
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 4 2009, 17:10
|

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

|
Цитата(xemul @ Jun 4 2009, 18:51)  Несложно заметить, что пропущены все папки с символом '\' Мне кажется, что они сначала пропущены были, а только потом оказалось, что они с '\'  Расшифровываю: в выдаче на экран в строках эти '\' - уже от самого 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
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jun 4 2009, 17:17
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(AHTOXA @ Jun 4 2009, 20:10)  Я это заметил. Но объясните мне тогда, зачем sh, вместо того, чтобы просто вызвать заказанную программу с заказанными аргументами, ещё и подменяет системные вызовы для этой программы? Я так понял, что не срабатывает рекурсивный поиск внутри самого Rar-а. Если я правильно понимаю, то rar, строя путь для вложенных папок, использует дефолтный в ОС разделитель для папок '\', не догадываясь, что его запускают в *nix-образном шелле. Возможно, проще будет формировать скриптом список файлов, подлежащих упаковке, и скармливать его rar'у. Цитата Попробуйте также заставить sh вызвать какую-нибудь встроенную команду виндового командного интерпретатора (cmd), типа md: Почему sh должен что-то знать про встроенные команды cmd? Для sh аналогичная команда называется mkdir, и он ее с радостью исполнит. Но cmd, будучи запущенным в sh, на mkdir гнусно выругается.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|