Makefile 使用 --just-print 在文件函数上抛出错误

问题描述 投票:0回答:1

我有一个编译 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 仍然尝试执行文件函数呢?我可以做什么来解决这个问题?

makefile gnu-make
1个回答
0
投票

即使你使用

--just-print
运行,make 仍然必须扩展配方,否则它如何打印出要运行的内容?当配方扩展时,所有 make 变量和函数都会扩展。

直到扩展发生之后,make 甚至无法确定是否应该运行配方,因为它可能带有前缀

+
:

FOO = +echo do this

foo:
        $(FOO)

我知道没有办法解决这个问题,除了强制创建这个

$(file ...)
所需的目录,即使提供了
-n
。例如:

$(OBJECT_LIST): $(OBJECT_FILES)
        $(shell mkdir -p '$(@D)')
        $(file > $@,$^)

您需要在食谱中使用

$(shell ...)
的一个罕见原因。或者,如果您有其他规则强制创建变量,您可以在配方行前加上
+
来强制它们运行,即使使用
-n

© www.soinside.com 2019 - 2024. All rights reserved.