makefile延迟变量扩展

时间:2015-02-04 18:33:12

标签: c++ makefile

我的root makefile中有一些规则如下所示:

DEPS += a
DEPS += b
...

$(THE_BINARY) : $(DEPS)

在提供一些必需变量之后,单个app makefile include这个根makefile。我想这样做,以便应用程序也可以添加到DEPS变量。这有效:

DEPS += some_other_dep
include root.make

但这不是:

include root.make
DEPS += some_other_dep

这是因为($DEPS)是在分配规则时扩展的,而不是在最后?有没有办法以这样的方式编写根makefile:DEPS += ...两行都做同样的事情?

1 个答案:

答案 0 :(得分:1)

Aggieboy的评论在问题上是正确的:如果你首先包含makefile,那么使用$(DEPS)的规则已经扩展,然后再向其添加额外的内容,所以它没有看到额外的东西。我对使用常见包含文件编写此类makefile环境的人的建议是,定义任何规则的包含文件应该始终在最后。

如果你想这样做,.SECONDEXPANSION会解决这个问题,而且实际上并不难理解。如果description in the manual难以阅读,那么查看this discussion of expansion in GNU make,尤其是secondary expansion上的{{3}}可能会有用。

我通常不建议这样做,因为虽然它会解决问题,但您会在下一条规则中遇到同样的问题......您基本上会有这样的问题如果要在任何WRT变量赋值顺序中允许include个文件,请对所有规则使用二级扩展。并且,二级扩展仅适用于先决条件列表中使用的变量。如果你想推迟扩展/作为目标使用的变量,那么你运气不好。