如何在不调用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,但是我找不到任何方向,无论是......
假设您正在使用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+