特殊 NMAKE 宏
NMAKE 提供多个特殊宏来表示各种文件名和命令。 其中一些宏的一种用途是在预定义的推理规则中。 与所有宏一样,NMAKE 提供的宏区分大小写。
文件名宏
文件名宏是在依赖项中指定的预定义 as 文件名(而不是磁盘上的完整文件名规范)。 调用时,不需要将这些宏括在括号中;仅 $
as 指定显示。
宏 | 含义 |
---|---|
$@ |
当前目标的完整名称(路径、基名称、扩展), as 当前指定。 |
$$@ |
当前目标的完整名称(路径、基名称、扩展), as 当前指定。 仅在 as 依赖项中有效。 |
$* |
当前目标的路径和基本名称减去文件扩展名。 |
$** |
当前目标的所有依赖项。 |
$? |
时间戳晚于当前目标的所有依赖项。 |
$< |
时间戳晚于当前目标的依赖文件。 仅在推理规则中的命令中有效。 |
若要指定预定义文件名宏的一部分,请追加宏修饰符,并将修改后的宏括在括号中。
修饰符 | 生成的文件名部分 |
---|---|
D |
驱动器加目录 |
B |
基名称 |
F |
基名称加扩展名 |
R |
驱动器加目录加基本名 |
递归宏
使用递归宏以递归方式调用 NMAKE。 递归会话继承命令行和环境变量宏以及 Tools.ini
信息。 它们不会继承生成文件定义的推理规则或 .SUFFIXES
和 .PRECIOUS
规范。 有三种方法可以将宏传递给递归 NMAKE 会话:
- 在递归调用之前使用
SET
命令设置环境变量。 - 在命令中为递归调用定义宏。
- 或者,在
Tools.ini
中定义一个宏。
宏 | 定义 |
---|---|
MAKE |
最初用于调用 NMAKE 的命令。 宏 $(MAKE) 提供了 nmake.exe 的完整路径。 |
MAKEDIR |
调用 NMAKE 时的当前目录。 |
MAKEFLAGS |
当前生效的选项。 使用 as/$(MAKEFLAGS) 。 不包括该 /F 选项。 |
命令宏和选项宏
命令宏是为 Microsoft 产品预定义的。 选项宏表示这些产品的选项,默认情况下未定义。 两者都在预定义的推理规则中使用,并且可以在描述块或用户定义的推理规则中使用。 可以重新定义命令宏来表示部分或全部命令行,包括选项。 选项宏在未定义的情况下生成 null 字符串。
工具 | 命令宏 | 定义 as | 选项宏 |
---|---|---|---|
宏装配器 | AS |
ml 或 ml64 |
AFLAGS |
C 编译器 | CC |
cl |
CFLAGS |
C++ 编译器 | CPP |
cl |
CPPFLAGS |
C++ 编译器 | CXX |
cl |
CXXFLAGS |
资源编译器 | RC |
rc |
RFLAGS |
环境变量宏
NMAKE 继承会话开始时存在的环境变量的宏定义。 如果在操作系统环境中设置了变量,则它可以使用 as NMAKE 宏。 继承的名称将转换为大写。 在预处理之前发生继承。 使用 /E 选项会导致从环境变量继承的宏替代生成文件中具有相同名称的任何宏。
环境变量宏可以在会话中重新定义,这会改变相应的环境变量。 还可以使用 SET 命令更改环境变量。 但是,使用 SET 命令更改会话中的环境变量不会更改相应的宏。
例如:
PATH=$(PATH);\nonesuch
all:
echo %%PATH%%
在本例中,更改 PATH
会更改相应的环境变量 PATH
;这会将 \nonesuch
附加到你的路径中。
如果定义了 as 在生成文件中语法不正确的字符串,则不会创建任何宏,也不会生成警告。 如果变量的值包含美元符号($),NMAKE 会将其 as 解释为宏调用的开头。 使用宏可能会导致意外行为。