Вы не знаете, что сделано GNU make, и когда и что делается shell, и когда, чтобы выполнить рецепт.
Все где-нибудь в Makefile формы $(...)
оценивается make
, если он не бежал, как $$(...)
в команде оболочки.
Команда оболочки, если в контексте косметики функции $(shell ...)
или обратно-тики не может быть только команда в рецепте:
target: [prerequisite...]
command
...
Команда, составляющие рецепты выполняется последовательно, каждый в отдельной оболочке , чтобы выполнить рецепт.
Ничего немаскированной форма $(...)
не является командой в командной последовательности из рецепта, если это не является расширение переменного или макрокоманды вы определили, что расширяет к команде.
Линия в области действия цели не обязательно должна быть командой или расширена до команды. Он может также состоять из выражения $(...)
, которое не увеличивается до нуля, и просто инструктирует make
, чтобы что-то сделать, например.
$(info ...)
расширяет ничего и говорит make
для печати ...
на стандартный вывод.
$(eval ...)
расширяет ничего и говорит make
оценить ...
Этот рецепт имеет только две команды, а не четыре:
target: prereq...
$(eval [email protected])
command1
$(info $(TARGET))
command2
Есть подпиточной выражения, $(...)
в области видимости рецепте оценивается в последовательности, когда make решает запустить рецепт , а командная последовательность - это то, что осталось после того, как все они были оценены d. Затем выполняется командная последовательность.Например:
Makefile
target:
echo Hello > hello.txt
$(info Begin {)
$(eval s := $(shell cat hello.txt))
$(eval WORD=$(word 1, $(s)))
$(info [$(WORD)])
$(info } End)
Run что:
$ make
Begin {
cat: hello.txt: No such file or directory
[]
} End
echo Hello > hello.txt
Заметим, что все замыкающие выражений оцениваются до того в команды мишени запускаются.
Ваш макрос FILE_VAR
, очевидно, предназначен для расширения в области рецептов, так как первая строка представляет собой команду оболочки. Таким образом, оставшиеся линии должны достичь своих целей командами оболочки, если они зависят от последствий работы первой линии. Ни один из них не делает этого. Оставшиеся 3 строки оцениваются до 2.txt
, если он еще не существует во время выполнения.
Разве это не дубликат [ваш предыдущий пост] (http://stackoverflow.com/questions/41570930/using-eval-in-make-file)? Несколько комментариев, сделанных по этому сообщению, относятся к этому. Проводка [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve) настоятельно рекомендуется. –