使用 NMAKE 宏

若要使用宏,请将其名称括在美元符号前面 ($),如下所示:

$(macro_name)

不允许包含空格。 如果 macro_name 是单个字符,则括号是可选的。 定义字符串替换 $(macro_name);未定义的宏由 null 字符串替换。

宏替换

调用 macro_name 时,其定义字符串中出现的 string1 匹配项都将替换为 string2

$(macro_name:string1=string2)

宏替换区分大小写,并且是文本;string1string2 无法调用宏。 替换不会修改原始定义。 可以在除 $$@ 之外的任何预定义宏中替换文本。

冒号 (:) 前面没有空格或制表符;冒号后的任何空格或制表符将解释为文本。 如果 string2 为 null,则会从宏的定义字符串中删除 string1 的所有匹配项。

宏函数

NMAKE 提供了一组可用于修改字符串、项列表和文件路径的函数。 从 Visual Studio 2022 开始,NMAKE 中提供了这些函数。

函数语法

函数使用以下语法:

$(function_name arg0,arg1,arg2...)

函数的参数可以是任何字符串,并且可能包含嵌套宏调用。 除特殊情况外,参数不能为 null。

将忽略函数名称和参数列表之间的任何多余空格。 如果第一个参数需要前导空格,请使用包含所需空格的宏:

SINGLESPACE=$(subst ',,' ') # Use "subst" since a normal assignment trims trailing whitespace.
$(subst $(SINGLESPACE)an,irec,red ant) # Evaluates to "redirect"

参数列表中的逗号始终视为参数分隔符,无法转义。 如果任何参数需要文本逗号,请改用包含逗号的宏:

COMMA=,
INPUT=a, b
$(subst $(COMMA) , and ,$(INPUT)) # Evaluates to "a and b"

列出语法

某些函数支持空格分隔的项列表。 将忽略在列表开头、列表末尾或每个项之间的多余空格。 函数生成的列表在每个项之间使用单个空格作为分隔符,并且没有前导空格或尾随空格。

例如,最简单的列表函数是 strip,它采用单个列表参数并生成一个列表,其中包含完全相同的项(但已按上述清理了空格):

$(strip a   b   c d    ) # Evaluates to "a b c d"

Pattern 语法

某些函数支持使用 pattern。 pattern 是一个字符串,其中包含一个可以匹配任意字符数的通配符。 pattern 中的第一个 % 是通配符,之后的任何 % 字符都被视为文本。 实际通配符之前任何位置的 % 都可以使用 \(即,\% 被视为文本 %)进行转义。 任何将转义通配符的 \ 都可以使用另一个 \ 进行转义(因此 \\% 被视为后跟通配符的文本 \)。 若要被视为匹配项,所有输入字符都必须由 pattern 匹配;部分匹配项不受支持。

可以使用 filter 函数演示 Pattern,该函数仅保留与 pattern 匹配的项:

$(filter abc,abc) # Evaluates to "abc" - exactly matches
$(filter bc,abc) # Evaluates to "" - pattern "bc" only matches part of the item "abc"
$(filter %ef,abcdef) # Evaluates to "abcdef" - wildcard matches "abcd"
$(filter a%f,abcdef) # Evaluates to "abcdef" - wildcard matches "bcde"
$(filter %abc,abc) # Evaluates to "abc" - wildcard doesn't need to match any characters
$(filter a%c%d,abcd abc%d) # Evaluates to "abc%d" - only the first `%` is a wildcard, the rest are literals
$(filter a\%b%d,a%bcd) # Evaluates to "a%bcd" - `%` before the wildcard must be escaped with `\`
$(filter a\\%cd,a\bcd) # Evaluates to "a\bcd" - a `\` that would escape the wildcard must be escaped with another `\`
$(filter a%c\\%d,abc\\%d) # Evaluates to "abc\\%d" - any `\` after the wildcard isn't treated as an escape
$(filter \\a%f,\\abcdef) # Evaluates to "\\abcdef" - any `\\` that isn't directly before the wildcard isn't treated as an escape

按类别列出函数

函数 目的 支持
文本函数 用途 支持
 %> 检查输入是否包含字符串。 VS 2022 17.0
lowercase 将字符串转换为小写。 VS 2022 17.2
 %> 将一个字符串的所有实例替换为另一个字符串。 VS 2022 17.0
uppercase 将字符串转换为大写。 VS 2022 17.2
列表函数 用途 支持
 %> 将项保留在与至少一种 pattern 匹配的列表中。 VS 2022 17.0
 %> 将项保留在与任何 pattern 不匹配的列表中。 VS 2022 17.0
 %> 转换与 pattern 匹配的每个项,不匹配的项按原样保留。 VS 2022 17.1
strip 清理项列表中及其周围的空格。 VS 2022 17.0
文件路径函数 用途 支持
abspath 获取列表中每个项的绝对路径。 VS 2022 17.1
basename 获取列表中每个项的基名称。 VS 2022 17.1

另请参阅

宏和 NMAKE