将makefile(> 131000个字符)变量的内容写入文件?

Rei*_*fer 6 makefile

如何在不调用shell命令的情况下将makefile变量的内容写入文件?问题是变量的内容可能比shell允许的命令长(即长于MAX_ARG_STRLEN(131072)字符).

特别是,在一个makefile中,我有一个包含要处理的长文件名列表的变量(包括它们对于源外构建的绝对路径).现在我需要将这些文件名写入(临时)文件,然后我可以将其传递给另一个命令.

到目前为止,我们有一个规则($COLLATED_FILES是包含路径的变量):

$(outdir)/collated-files.tely: $(COLLATED_FILES)
    $(LYS_TO_TELY) --name=$(outdir)/collated-files.tely --title="$(TITLE)" \
    --author="$(AUTHOR)" $^
Run Code Online (Sandbox Code Playgroud)

如果COLLATED_FILES超过大约130000个字符,则会中断,我们收到错误消息:

make[2]: execvp: /bin/sh: Argument list too long
Run Code Online (Sandbox Code Playgroud)

作为解决方案,我们现在尝试将变量的内容写入文件并在$(LYS_TO_TELY)命令中使用该文件.不幸的是,我还没有找到一种方法来做到这一点,而无需调用shell.我的尝试包括:

$(outdir)/collated-files.list: $(COLLATED_FILES)
    echo "" > $@
    $(foreach f,$^,echo $f >> $@;)
Run Code Online (Sandbox Code Playgroud)

但是这也会echo在shell中同时调用所有命令,因此shell命令也一样长.

有没有办法将$(COLLATED_FILES)文件的内容写入磁盘而不将命令行上的文件传递给shell命令?

我还搜索了我是否可以将变量的内容传递给shell,但是我找不到任何方向,无论是......

Pau*_*per 5

假设您正在使用GNU Make,就可以使用该file功能!

https://www.gnu.org/software/make/manual/html_node/File-Function.html

$(file op filename,text)
Run Code Online (Sandbox Code Playgroud)

其中op或者是>>>

这需要GNU Make 4.0+