使用 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 匹配;部分匹配项不受支持。

可以使用 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

按类别列出函数

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

另请参阅

宏和 NMAKE