Как сделать вывод многострочной оболочки в make-файле в переменной - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть команда оболочки, которая выводит несколько строк. Я хочу сохранить его в переменной в make-файле для последующей обработки в целевом объекте.

Упрощенный пример:

У меня есть этот файл с именем zfile1

#zfile1
some text
$echo 123
more text
$$$#&^$
more text

Makefile :

a:
    @$(eval v1 = $(shell cat zfile1))
#   need to process the variable here, example:
    @echo "$(v1)"
#   I want to prevent expansion of values in the file and print in multi-line

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я думаю, вы делаете вещи слишком сложными.

Начните с написания своих рецептов в виде надлежащих автономных сценариев оболочки.

Затем можно сохранить весь сценарий в файле и запустите его из make или вы можете включить его непосредственно в ваш make-файл в виде одной логической строки, как показано ниже:

a:
    @v1=$$(< zfile1); \
    echo $$v1

Обратите внимание на необходимость «экранировать» знак доллара, повторяя его.

Вы также можете использовать глобальные переменные make, в зависимости от фактической логики c вашего реального использования.

0 голосов
/ 27 февраля 2020

Если у вас GNU make 4.2 или выше, вы можете использовать функцию $(file <zfile1). См. https://www.gnu.org/software/make/manual/html_node/File-Function.html

Если у вас нет достаточно новой версии GNU make, вы не сможете этого сделать. Конечно, в вашем примере вообще нет необходимости помещать содержимое файла в переменную make: вы можете просто заставить свой рецепт использовать сам файл. Но, возможно, ваш реальный вариант использования не так прост.

ETA

Вы никогда не должны использовать ни функцию make eval, ни функцию make shell в рецепте [1].

Вы можете просто написать:

v1 := $(file <zfile1)

.ONESHELL:
a:
        @echo "$(v1)"

Вы должны иметь .ONESHELL, потому что в противном случае каждая строка рецепта (после того, как он разложится на несколько строк) считается отдельной строкой рецепта. Обратите внимание, что .ONESHELL действует для всего процесса создания, поэтому может привести к разрыву других рецептов, если они полагаются на каждую строку, вызываемую в другой оболочке.

Другой вариант - экспортировать результат в среду, и используйте переменную оболочки, подобную этой:

export v1 := $(file <zfile1)

a:
        @echo "$$v1"

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

[1] Бывают случаи, когда это может быть полезно, но если у вас достаточно изощренное требование для этого, вы, вероятно, знаете, как его использовать.

...