如何使用 shell echo 命令在 GNU Makefile 目标中追加文件
How to use shell echo command to append a file inside a GNU Makefile target
我正在尝试使用以下语法从 make 目标中将一些文本附加到文件中
$shell(echo "module load ABC/$$(MODULE_LOAD)" >> $@/_env/local/filexyz)
但是 GNU Make 4.2.1 抱怨以下内容。
/bin/sh: -c: line 21: syntax error near unexpected token echo
总而言之,我希望文件 PQR/_env/local/filexyz 在最后一行包含以下文本
module load ABC/4.5.6
首先,make 函数的语法错误;应该是 $(shell ...)
而不是 $shell(...)
.
其次,我假设这实际上出现在食谱中,因为您正在使用 $@
。提问时请包含足够的细节,以便我们可以看到整个上下文,例如整个食谱,而不仅仅是一行。
在写菜谱的时候使用shell
功能是很严重的anti-pattern,因为菜谱中的每一行都是已经运行 通过 shell。使用 shell
函数会造成很多问题。
第三,您不想转义变量 $$(MODULE_LOAD)
,因为这会导致 shell 到 运行 一个可能不存在的命令 MODULE_LOAD
.
直接写就可以了:
echo "module load ABC/$(MODULE_LOAD)" >> $@/_env/local/filexyz
我正在尝试使用以下语法从 make 目标中将一些文本附加到文件中
$shell(echo "module load ABC/$$(MODULE_LOAD)" >> $@/_env/local/filexyz)
但是 GNU Make 4.2.1 抱怨以下内容。
/bin/sh: -c: line 21: syntax error near unexpected token echo
总而言之,我希望文件 PQR/_env/local/filexyz 在最后一行包含以下文本
module load ABC/4.5.6
首先,make 函数的语法错误;应该是 $(shell ...)
而不是 $shell(...)
.
其次,我假设这实际上出现在食谱中,因为您正在使用 $@
。提问时请包含足够的细节,以便我们可以看到整个上下文,例如整个食谱,而不仅仅是一行。
在写菜谱的时候使用shell
功能是很严重的anti-pattern,因为菜谱中的每一行都是已经运行 通过 shell。使用 shell
函数会造成很多问题。
第三,您不想转义变量 $$(MODULE_LOAD)
,因为这会导致 shell 到 运行 一个可能不存在的命令 MODULE_LOAD
.
直接写就可以了:
echo "module load ABC/$(MODULE_LOAD)" >> $@/_env/local/filexyz