使用GNU Make将多行变量输出到文件

时间:2011-09-02 09:13:43

标签: makefile

我很难编写一个在文件中输出多行变量的makefile规则。

这是我的代码:

define VAR1
    /dev d 755 - - - - -
endef

define VAR2
    /test d 777 - - - - -
    /test2 d 777 - - - - -
endef

VARS += $(VAR1)
VARS += $(VAR2)

all:
    echo "$(VARS)" > test

但是,由于我不知道的原因,回声无法告诉“未终止的引用字符串”。 我怎么能把文件放在单独一行上声明的每一行?

3 个答案:

答案 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}}。
  • 我在您的makefile中添加了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