我很难编写一个在文件中输出多行变量的makefile规则。
这是我的代码:
define VAR1
/dev d 755 - - - - -
endef
define VAR2
/test d 777 - - - - -
/test2 d 777 - - - - -
endef
VARS += $(VAR1)
VARS += $(VAR2)
all:
echo "$(VARS)" > test
但是,由于我不知道的原因,回声无法告诉“未终止的引用字符串”。 我怎么能把文件放在单独一行上声明的每一行?
答案 0 :(得分:22)
如果您将变量导出到shell并将其作为shell变量引用,而不是make变量,那么您将获得更好的运气:
define VAR1
/dev d 755 - - - - -
endef
define VAR2
/test d 777 - - - - -
/test2 d 777 - - - - -
endef
define VARS
$(VAR1)
$(VAR2)
endef
export VARS
all:
echo "$$VARS" > test
请注意以下对makefile的调整:
define
来创建VARS
,而不是一系列+=
分配,这样可以更轻松地在VAR1
和{{{{}}之间获取换行符1}}。VAR2
,以便将变量推送到shell调用的环境中。export VARS
而非$$VARS
取消引用它 - 将扩展留给shell,而不是make,这将避免“未终止的引用字符串”错误。答案 1 :(得分:10)
GNU make 4.0添加了the ability to write files directly:
define VAR1
/dev d 755 - - - - -
endef
define VAR2
/test d 777 - - - - -
/test2 d 777 - - - - -
endef
define VARS :=
$(VAR1)
$(VAR2)
endef
all:
$(file > test,$(VARS))
请注意,您仍然需要使用define
来定义VARS
,或VAR1
的最后一行,VAR2
的第一行将被标记为一行。另外,不要在$(file ...)
构造中的逗号后面加一个空格,否则输出中会有一个前导空格!
答案 2 :(得分:4)
看起来好像你得到“未终止的引用字符串”,因为Make在一个单独的shell中执行配方的每一行,第一行是:
echo " /dev d 755 - - - - -
这是我能想到的最好的解决方案(我承认它不是很好,但你违背了Make的方法)是将VARS
传递给调用{{1 }}:
生成文件:
$(info ...)
Makefile.print:
define VAR1
/dev d 755 - - - - -
endef
define VAR2
/test d 777 - - - - -
/test2 d 777 - - - - -
endef
define VARS
$(VAR1)
$(VAR2)
endef
export VARS
all:
$(MAKE) -f Makefile.print > test