makefile 延迟变量扩展
makefile delay variable expansion
我的根 makefile 中有一些规则如下所示:
DEPS += a
DEPS += b
...
$(THE_BINARY) : $(DEPS)
单独的应用程序生成文件 include
在提供一些必需的变量后这个根生成文件。我想这样做,以便应用程序也可以添加到 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 is too hard to read, it might be useful to look at this discussion of expansion in GNU make, in particular the one on secondary expansion.
我通常不推荐这个,因为虽然它会解决 这个 问题,但你会在下一个规则中遇到同样的问题......你基本上必须如果您想允许 include
文件以任何顺序进行 WRT 变量分配,请对所有规则使用二次扩展。并且,二次扩展仅适用于先决条件列表中使用的变量。如果你想推迟使用 in/as 目标的变量扩展,你就不走运了。
我的根 makefile 中有一些规则如下所示:
DEPS += a
DEPS += b
...
$(THE_BINARY) : $(DEPS)
单独的应用程序生成文件 include
在提供一些必需的变量后这个根生成文件。我想这样做,以便应用程序也可以添加到 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 is too hard to read, it might be useful to look at this discussion of expansion in GNU make, in particular the one on secondary expansion.
我通常不推荐这个,因为虽然它会解决 这个 问题,但你会在下一个规则中遇到同样的问题......你基本上必须如果您想允许 include
文件以任何顺序进行 WRT 变量分配,请对所有规则使用二次扩展。并且,二次扩展仅适用于先决条件列表中使用的变量。如果你想推迟使用 in/as 目标的变量扩展,你就不走运了。