2012-08-12 2 views
1

Я начинаю с этого (make) и имею некоторые проблемы с попыткой grep для текста в файле (как часть make процесс в Windows). Большая проблема, которую я пытаюсь решить, - проверить, удовлетворены ли все исполняемые файлы двоичных файлов в заданном каталоге. Я использую depend.exe (Dependency Walker) для более поздней части, выходной файл которого я пытаюсь grep, и, возможно, прервать процесс сборки, если проверка достоверности не выполняется.make error (Windows): строка 1: синтаксическая ошибка около неожиданного токена `, '

binary-dependency-validate: 
for BINARYEXEC in $(shell $(PATH_TO_FIND_EXE) $(PRE_DEFINED_DIR) -name "*.exe"); do \ 
    $(PATH_TO_DEPENDS_EXE) /c /pb /ot $(PRE_DEFINED_DIR)/$$BINARYEXEC-depends.txt $(PRE_DEFINED_DIR)/$$BINARYEXEC ; \ 
    ifeq ($(shell $(PATH_TO_GREP_EXE) "Error: At least one required implicit or forwarded dependency was not found." $(PRE_DEFINED_DIR)/$$BINARYEXEC-depends.txt),); \ 
     @echo "Dependency ok" ; \ 
    endif ; \ 
done 

Я сталкиваюсь следующее сообщение об ошибке:

line 1: syntax error near unexpected token `,' 

Любые предложения будут очень помочь. Я смотрел на this пост и попытался совместив ifeq без отступа, а также (что не помогло.)

ответ

1

Проблема заключается в том, что вы смешиваются Сделать Язык с оболочки язык.

файл сборка содержит правило, и правило содержит команды, которые выполняются с помощью оболочки:

target: 
    first command 
    second command 

Команды находятся в языке оболочки, и каждая команда должна предшествовать TAB.

Есть условные в Make: (. Отступы только для глаз)

ifeq (foo, bar) 
    VAR = something  
endif 

Есть также условные в различных языках сценариев:

if [ -f log ] 
    then 
    echo "log exists." 
fi 

A Убедитесь условное может заключить команду в пределах правила:

target: 
ifeq (foo, bar) 
    first command 
endif 
    second command 

Make будет оценивать это условие перед запуском правила, а не должно быть TAB до ifeq или endif, так как Make не должен интерпретировать их как команды, которые должны быть переданы в оболочку.

Команда (в правиле) может содержать оболочку условного:

target: 
    if [ -f log ]; \ 
    then echo "log exists." ; \ 
    fi 

Отступ перед тем if является TAB. Другие пробелы - для глаз.

В вашем файле make есть условное выражение в середине команды оболочки; Make не может оценить условное выражение перед выполнением команды, а оболочка не может понять синтаксис Make. Вы должны использовать условную оболочку.

+0

Спасибо, Бета (за подробное объяснение тоже). У меня была эта проблема исправлена, когда вместо этого я использовал shell.Но у меня есть еще одна проблема. Когда я запускаю make, команда grep начинается всегда перед мишенью, и, следовательно, $$ BINARYEXEC пуст, когда запускается grep. Несмотря на то, что цикл for выполняет итерацию через fine, grep никогда не пересчитывается на итерацию. И полученная ошибка: «grep: /-depends.txt: нет такого файла или каталога». Мне, должно быть, не хватает какой-то тонкой вещи о том, как делать эти команды. Любые указатели были бы замечательными. –

+0

Чистым экспериментированием я вижу, что все, что помечено для запуска в оболочке, обрабатывается (и выполняется) перед остальными командами. Следовательно, я изменил $ (shell $ (PATH_TO_GREP) ...) на просто $ (PATH_TO_GREP) ...., вытащил все из условия if, и теперь моя условная оболочка оболочки выглядит следующим образом: if [[$$ ? -eq 0]]. И это сработало для меня. Благодарю. –

+0

@ durden83, снова вы помещали Make-код ('$ (shell ...)') внутри команды. – Beta

0

Похоже, у вас есть шальная запятой на ifeq линии

binary-dependency-validate: 
for BINARYEXEC in $(shell $(PATH_TO_FIND_EXE) $(PRE_DEFINED_DIR) -name "*.exe"); do \ 
    $(PATH_TO_DEPENDS_EXE) /c /pb /ot $(PRE_DEFINED_DIR)/$$BINARYEXEC-depends.txt $(PRE_DEFINED_DIR)/$$BINARYEXEC ; \ 
    ifeq ($(shell $(PATH_TO_GREP_EXE) "Error: At least one required implicit or forwarded dependency was not found." $(PRE_DEFINED_DIR)/$$BINARYEXEC-depends.txt)); \ 
     @echo "Dependency ok" ; \ 
    endif ; \ 
done 
+0

GNU make указывает на правильность синтаксиса. т.е. ifeq (arg1,). Источник: http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html (удалено, и это все равно не устраняет проблему). –

Смежные вопросы