gpt4 book ai didi

makefile - GNU Make 递归扩展变量示例

转载 作者:行者123 更新时间:2023-12-05 08:57:41 24 4
gpt4 key购买 nike

有人可以提供一个使用递归扩展变量 (REV) 的真实示例吗?在文档或各种博客文章中,人们只给出无用的玩具示例,例如

foo = $(bar)
bar = $(ugh)
ugh = Huh?

除了使用 $(call) 创建自定义函数外,我找不到 REV 的真正用途。我还发现,过去人们使用 REV 为特定目标的编译器提供额外的参数,但这种技巧现在被认为已经过时,因为 GNU Make 具有特定于目标的变量。

最佳答案

递归扩展变量简单扩展变量都递归它们的扩展。主要区别在于扩展何时发生。

因此,如果您反转赋值,您上面的示例可以很好地处理简单的扩展变量:

ugh := Huh?
bar := $(ugh)
foo := $(bar)

因此,递归扩展变量的主要优点是可以自由地按照您需要的任何顺序分配值(这意味着您无需担心包含的 makefile 等的包含顺序)。

在工作中的一个项目中,我们有十几个包含相互依赖关系的 makefile。这些是通过使用已知格式的变量名来表达的(例如,模块 A 生成一个 A_provides 变量等)。需要使用模块 A 提供的东西的模块可以列出 $( A_provides) 在他们的 makefile 中。

使用简单的扩展变量(直到最近我们一直在使用)这意味着包含生成的 makefile 需要手动排序顺序以强制包含分配 makefile 之前使用 makefile(到其他变量)。

对于递归扩展的变量,这个顺序无关紧要。 (如果变量在这些 makefile 中的任何立即评估的上下文中使用,情况就不会是这样,但幸运的是它们不是,它们只设置稍后在主 makefile 中使用的变量。)

关于makefile - GNU Make 递归扩展变量示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30213505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com