我的根 makefile 中有一些规则如下所示:
DEPS += a
DEPS += b
...
$(THE_BINARY) : $(DEPS)
在提供一些必需的变量后,单个应用程序生成文件包含
此根生成文件。我想这样做,以便应用程序也可以添加到 DEPS
变量。这有效:
DEPS += some_other_dep
include root.make
但这不是:
include root.make
DEPS += some_other_dep
这是因为 ($DEPS)
在分配规则的位置展开,而不是在末尾展开吗?有没有一种方法可以让 DEPS += ...
行做同样的事情来编写根 makefile?
最佳答案
Aggieboy 对这个问题的评论是正确的:如果您首先包含 makefile,那么在您添加额外内容之前使用 $(DEPS)
的规则已经展开,所以它看不到额外的东西。对于使用常见包含文件编写此类 makefile 环境的人,我的建议是定义任何规则的包含文件应始终放在末尾。
.SECONDEXPANSION
确实可以解决这个问题,如果您想那样做的话,而且它实际上并不难理解。如果description in the manual太难读了,看看this discussion of expansion in GNU make可能会有用,特别是 secondary expansion 上的那个.
我通常不推荐这个,因为虽然它会解决这个问题,但你会在下一个规则中遇到同样的问题......你基本上必须对所有的东西使用二次扩展你的规则,如果你想允许 include
文件以任何顺序 WRT 变量分配。并且,二次扩展仅适用于先决条件列表中使用的变量。如果您想推迟扩展用于/作为目标的变量,那您就不走运了。
关于c++ - makefile 延迟变量扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28328794/