有人可以提供一个使用递归扩展变量 (REV) 的真实示例吗?在文档或各种博客文章中,人们只给出了无用的玩具示例,例如
foo = $(bar)
bar = $(ugh)
ugh = Huh?
Run Code Online (Sandbox Code Playgroud)
除了使用$(call). 我还发现,过去人们使用 REV 为特定目标的编译器提供附加参数,但现在认为这种技巧已经过时,因为 GNU Make 具有特定于目标的变量。
这两个递归扩展变量和简单扩展变量递归他们扩展。主要的区别是,当该扩张发生。
因此,如果您反转分配,则上面的示例对于简单的扩展变量就可以正常工作:
ugh := Huh?
bar := $(ugh)
foo := $(bar)
Run Code Online (Sandbox Code Playgroud)
因此,递归扩展变量给您带来的主要好处是可以按照您需要的任何顺序自由分配值(这意味着您无需担心包含的 makefile 等的包含顺序)。
在工作中的一个项目中,我们有十几个包含相互依赖关系的 makefile。这些是通过使用已知格式的变量名来表达的(例如,模块 A 生成一个A_provides变量等)。需要利用模块 A 提供的东西的模块可以$(A_provides)在它们的 makefile 中列出。
使用简单的扩展变量(直到最近我们一直在使用)这意味着包含生成的 makefile 需要手动排序以强制在使用 makefile 之前包含分配的 makefile(到其他变量中)。
对于递归扩展的变量,此顺序无关紧要。(如果这些变量在这些 makefile 中的任何立即评估的上下文中使用,情况就不会如此,但幸运的是它们不是,它们只设置稍后在主 makefile 中使用的变量。)
| 归档时间: |
|
| 查看次数: |
7094 次 |
| 最近记录: |