как заставить $ (eval $ (shell ...)) работать в GNU make - PullRequest
13 голосов
/ 19 августа 2010

make-синтаксис разделен символом новой строки, но $ (shell ...) заменяет символы новой строки пробелами. Итак, какой наименее уродливый способ сделать

$ (eval $ (shell-программа, которая выпускает make-файл-фрагмент))

, который работает не так, как хотелось бы.

Ответы [ 3 ]

13 голосов
/ 19 августа 2010

Это, вероятно, подойдет для того, что вы имеете в виду:

makefile_fragment:
  program-that-emits-makefile-fragment > $@

include makefile_fragment

Этого достаточно? Есть дополнительные приемы, которые вы можете использовать, если они вам нужны, например, наличие правила добавления контекста вокруг того, что создает программа, или вывод результата через sed, чтобы поместить его в одну строку, а затем разбор с обратной косой чертой.

5 голосов
/ 19 августа 2010

Эта проблема уже была сообщена сопровождающим GNU make:

http://savannah.gnu.org/bugs/?28230

Она была закрыта со следующим комментарием:

Как упоминает Филипп, это предполагаемое / документированное поведение.
Я рекомендую использовать «include», а не eval;пусть ваш сценарий запишет файл, а затем включит этот файл.

ДОБАВЛЕНО : Обходной путь есть!Вот пример GNUmakefile (замените 8 пробелов символами табуляции; да, после define newline есть две пустые строки):

define newline


endef

$(eval $(subst #,$(newline),$(shell { echo 'war:'; echo '        echo "not love?"'; echo '        echo "Give peace a chance!"'; } | tr '\n' '#')))

В общем, это $(eval $(subst #,$(newline),$(shell myscript | tr '\n' '#')))

Вы должны выбратьсимвол, который не появится в выходных данных скрипта;# кажется хорошим кандидатом.

0 голосов
/ 20 августа 2010

Вот способ сделать это, взломав символ% замены, поэтому нам не нужно полагаться на символ, который не появляется в выходных данных myscript.

define nl


enddef
$(foreach line, $(shell myscript | sed -e 's/%/\\%/' -e 's/$$/%/'), \
  $(eval $(patsubst %, $(line), $(nl))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...