如何在 nmake 调用之间转发宏?
Posted
技术标签:
【中文标题】如何在 nmake 调用之间转发宏?【英文标题】:How to forward macros between nmake invocations? 【发布时间】:2009-04-28 21:10:23 【问题描述】:假设我们有
--- a.mak ---
some_variable = value
all:
nmake -f b.mak
--- END ---
--- b.mak ---
all:
@echo some_variable = WHAT TO PUT HERE TO GET VALUE OF some_variable?
--- END ---
我尝试了不同的方法,例如使用 set 和 setx 命令,但在父 makefile 中设置的变量值在从其中调用的 makefile 中不可见。
【问题讨论】:
【参考方案1】:这是来自 MSDN 的关于 calling nmake
recursively 的信息:
使用递归宏递归调用 NMAKE。递归会话继承命令行和环境变量宏以及 Tools.ini 信息。它们不继承 makefile 定义的推理规则或 .SUFFIXES 和 .PRECIOUS 规范。要将宏传递给递归 NMAKE 会话,请在递归调用之前使用 SET 设置环境变量,在递归调用的命令中定义宏,或在 Tools.ini 中定义宏。
所以,你可以让a.mak
看起来像:
# ---- a.mak ----
some_variable = value
all:
nmake -f b.mak some_variable=$(some_variable)
#--- END ---
另外,请注意,使用set
索曼命令将变量放入环境中也可以,但nmake
会自动将环境变量名称大写(即使对于像“windir
”这样的怪异名称,它在系统出于某种原因),并且区分大小写,因此要使用环境变量,您必须使用大写的变量。
From MSDN:
继承的名称被转换为大写。继承发生在预处理之前
所以,如果您要使用环境而不是在命令行上显式传递变量,您的 b.mak
应该是这样的:
#--- b.mak ---
all:
@echo some_variable is: $(SOME_VARIABLE)
#--- end ---
因此,将 nmake 宏名称的全大写命名约定标准化可能不是一个坏主意。
【讨论】:
【参考方案2】:也许您应该考虑不递归调用 make,请参阅论文 Recursive Make Considered Harmful。您仍然可以拥有类似于您已经拥有的 makefile(由 make 包含)的模块化文件,只是规则仅在一个*** makefile 中定义。
【讨论】:
以上是关于如何在 nmake 调用之间转发宏?的主要内容,如果未能解决你的问题,请参考以下文章