在makefile中,如何将多行shell输出存储在变量中



我有一个shell命令,它输出多行。我想把它存储在makefile中的一个变量中,以便以后在目标中进行处理。

一个简化的例子:

我有一个名为zfile1 的文件

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

生成文件:

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

如果你有GNU make 4.2或更高版本,你可以使用$(file <zfile1)函数。看见https://www.gnu.org/software/make/manual/html_node/File-Function.html

如果你没有足够新的GNU make版本,你就无法做到这一点。当然,在你的例子中,根本没有必要将文件的内容放入make变量中:你可以让你的食谱使用文件本身。但也许你真正的用例并不是那么简单。

ETA

决不应在配方[1]中使用make函数eval或make函数shell

你可以写:

v1 := $(file <zfile1)
.ONESHELL:
a:
@echo "$(v1)"

您必须有.ONESHELL,否则配方的每一行(在扩展为多行之后(都被视为一个单独的配方行。请注意,.ONESHELL在整个制作过程中都有效,因此如果其他配方依赖于在不同的shell中调用的每一行,则可能会导致它们中断。

另一种选择是将结果导出到环境中,并使用如下shell变量:

export v1 := $(file <zfile1)
a:
@echo "$$v1"

也许有更好的方法可以做到这一点,但由于你只给了我们这个例子,而不是你真正想做的,所以我们只能说这些。

[1] 有时它会很有用,但如果你有足够复杂的需求,你可能会知道如何使用它

我觉得你把事情搞得太复杂了。

首先,将您的食谱编写为适当的独立shell脚本。

然后,您可以将整个脚本存储在一个文件中,并从make运行它,也可以将其作为单个逻辑行直接包含在makefile中,如下所示:

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

请注意,需要通过重复来"逃离"美元符号。

您也可以使用全局make变量,这取决于您实际使用的实际逻辑。

最新更新