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

mri*_*ard 22 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
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ski 24

如果将变量导出到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
Run Code Online (Sandbox Code Playgroud)

请注意以下对makefile的调整:

  • 我曾经define创造VARS,而不是一系列的+=任务,这使得它更容易得到的值之间的换行VAR1VAR2.
  • 我添加export VARS到你的makefile中,将变量推送到shell调用的环境中.
  • 我使用$$VARS而不是$(VARS)取消引用它 - 将扩展留给shell而不是make,这将避免"Unterminated quoted string"错误.


zwo*_*wol 11

GNU make 4.0增加了直接写文件的能力:

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

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

define VARS :=
$(VAR1)
$(VAR2)
endef

all:
        $(file > test,$(VARS))
Run Code Online (Sandbox Code Playgroud)

请注意,您仍然需要使用define来定义VARS,或者VAR1第一行的第一行将VAR2被标记为一行.另外,不要在$(file ...)构造中的逗号后面加一个空格,否则输出中会有一个前导空格!