使用 NMAKE 巨集
若要使用巨集,請將其名稱括在括弧前面加上貨幣符號 ($
),如下所示:
$(macro_name)
不允許使用空格。 如果 巨集_name 是單一字元,則括弧是選擇性的。 定義字串會 $(macro_name)
取代 ;未定義的巨集會由 Null 字串取代。
巨集替代
叫用 巨集_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"
模式語法
某些函式支援使用 模式。 模式是包含單一通配符的字串,可比對任意數目的字元。 模式中的第一個 %
是通配符,而任何稍後 %
的字元都會被視為常值。 %
在實際通配符可以使用 逸出\
之前的任何位置(也就是,\%
會被視為常值 %
)。 任何會逸出通配符的任何 \
都可以使用另一個 \
來逸出(因此 \\%
會被視為常值 \
,後面接著通配符)。 若要視為相符專案,所有輸入字元都必須由模式比對;不支援部分相符專案。
模式可以使用 函式來 filter
示範,此函式只會保留符合模式的專案:
$(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 |
將專案保留在至少一個模式的清單中。 | VS 2022 17.0 |
filterout , filterouti |
將專案保留在不符合任何模式的清單中。 | VS 2022 17.0 |
patsubst , patsubsti |
轉換符合模式的每個專案,不符合的專案會依目前情況保留。 | VS 2022 17.1 |
strip |
清除和周圍專案的空格符。 | VS 2022 17.0 |
檔案路徑函式 | 用途 | 支援 |
abspath |
取得清單中每個項目的絕對路徑。 | VS 2022 17.1 |
basename |
取得清單中每個專案的基底名稱。 | VS 2022 17.1 |