如何在nmake调用之间转发宏?

时间:2009-04-28 21:10:24

标签: macros persistence environment-variables forwarding nmake

如何在nmake调用之间转发宏?

假设我们有

--- 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中是不可见的。

2 个答案:

答案 0 :(得分: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 sommand将变量放入环境中也可以正常工作,但nmake会自动将环境变量名称大写(即使对于像windir这样的奇怪变量也是如此“由于某种原因,它在系统中是小写的,并且区分大小写,因此要使用环境变量,必须使用大写的变量。

From MSDN

  

继承的名称将转换为大写。继承在预处理之前发生

所以,如果您要使用环境而不是在命令行上显式传递变量,那么b.mak应该是这样的:

#--- b.mak ---
all:
   @echo some_variable is: $(SOME_VARIABLE)
#--- end ---

因此,标准化nmake宏名称的全大写命名约定可能不是一个坏主意。

答案 1 :(得分:0)

也许您应该考虑不要递归调用make,请参阅论文Recursive Make Considered Harmful。您仍然可以使用类似于您已有的makefile(由make包含)的模块化文件,只是规则只在一个顶级makefile中定义。