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

31
我很难编写一个生成多行变量输出到文件的makefile规则。
这是我目前的代码:
define VAR1
    /dev d 755 - - - - -
endef

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

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

all:
    echo "$(VARS)" > test

然而,echo命令失败并显示“未终止的引号字符串”,原因我不知道。如何将每个声明在单独行上的行放入文件中?


评论以链接这两个问题,这个 SO答案对我帮助最大,在这个问题的答案中没有。在EL7上构建devtoolset-11,其他解决方案似乎不起作用,即使文件受支持。使用subst将换行符替换为\n,然后将它们回显。这比手动操作更健壮,因为它允许多行变量的嵌套。 - russianfool
3个回答

31
如果你将变量导出到shell并作为shell变量引用,而不是make变量,那么你会更好地运气:

如果您将变量导出到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,而不是一系列的+=赋值,这样可以更容易地在VAR1VAR2值之间插入换行符。
  • 我在你的makefile中添加了export VARS,将该变量推入环境中以进行Shell调用。
  • 我使用$$VARS而不是$(VARS)来解引用它——这样留下了扩展给Shell而不是Make,这将避免出现“未终止的引号字符串”错误。

我怎么会错过那个?+1 - Beta
我经常遇到的一个小问题(但总是忘记):这在配方中确实有效,但在$(shell ...)函数中却无效。不知何故,它会吞掉所有换行符,甚至在输出时也是如此。 - undefined

20

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 ...)结构中逗号后不要加空格,否则输出将有一个前导空格!


谢谢你提供这个信息 - 正是我此时所需要了解的,因为我在Windows上遇到了命令行参数限制,破坏了我的“make”构建... 这对我很有帮助,因为没有调用shell来传递参数。干杯! - sdaau

4

看起来你遇到了"Unterminated quoted string"的问题,这是因为Make将配方中的每一行都在单独的shell中执行,并且第一行是:

echo "    /dev d 755 - - - - -

这里是我能想到的最佳解决方案(我承认它不是很好,但你要迎合Make的规则),就是将VARS传递给子Make,并调用$(info ...)
Makefile:
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                                        

Makefile.print:

$(info $(VARS))

.PHONY:all
all:
        @# do nothing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接