分享方式:


使用 NMAKE 巨集

若要使用巨集,請將其名稱括在括弧前面加上貨幣符號 ($),如下所示:

$(macro_name)

不允許使用空格。 如果 巨集_name 是單一字元,則括弧是選擇性的。 定義字串會 $(macro_name)取代 ;未定義的巨集會由 Null 字串取代。

巨集替代

叫用 巨集_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"

模式語法

某些函式支援使用 模式。 模式是包含單一通配符的字串,可比對任意數目的字元。 模式中的第一個 % 是通配符,而任何稍後 % 的字元都會被視為常值。 %在實際通配符可以使用 逸出\之前的任何位置(也就是,\%會被視為常值 %)。 任何會逸出通配符的任何 \ 都可以使用另一個 \ 來逸出(因此 \\% 會被視為常值 \ ,後面接著通配符)。 若要視為相符專案,所有輸入字元都必須由模式比對;不支援部分相符專案。

模式可以使用 函式來 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

另請參閱

巨集和 NMAKE