我有一个编译 C/C++ 项目的 makefile。最后的链接器行对于 shell 来说字符太多,因此我转而使用传递给链接器的参数列表文件,如以下问题所示:与 GNU Make 链接时参数列表太长
我现在有这个规则:
$(OBJECT_LIST): $(OBJECT_FILES)
$(file > $@,$^)
其中
OBJECT_LIST
是包含对象列表的文件的路径,OBJECT_FILES
是直接传递给链接器的对象文件列表。
我的 IDE 使用
--just-print
选项来确定应索引哪些文件。当它执行上述规则时,它会抛出类似于以下内容的错误:
open: objects.in: No such file or directory. Stop.
由于这是一次空运行(来自 just-print 选项),显然没有实际创建任何目录,那么为什么 make 仍然尝试执行文件函数呢?我可以做什么来解决这个问题?
即使你使用
--just-print
运行,make 仍然必须扩展配方,否则它如何打印出要运行的内容?当配方扩展时,所有 make 变量和函数都会扩展。
直到扩展发生之后,make 甚至无法确定是否应该运行配方,因为它可能带有前缀
+
:
FOO = +echo do this
foo:
$(FOO)
我知道没有办法解决这个问题,除了强制创建这个
$(file ...)
所需的目录,即使提供了-n
。例如:
$(OBJECT_LIST): $(OBJECT_FILES)
$(shell mkdir -p '$(@D)')
$(file > $@,$^)
您需要在食谱中使用
$(shell ...)
的一个罕见原因。或者,如果您有其他规则强制创建变量,您可以在配方行前加上 +
来强制它们运行,即使使用 -n
。