$(macro_name)
不允许包含空格。 如果 macro_name 是单个字符,则括号是可选的。 定义字符串替换 $(macro_name)
;未定义的宏由 null 字符串替换。
调用 macro_name 时,其定义字符串中出现的 string1 匹配项都将替换为 string2。
$(macro_name:string1=string2)
宏替换区分大小写,并且是文本;string1 和 string2 无法调用宏。 替换不会修改原始定义。 可以在除 $$@
之外的任何预定义宏中替换文本。
冒号 (:
) 前面没有空格或制表符;冒号后的任何空格或制表符将解释为文本。 如果 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