分享方式:


Makefile 前置處理

您可以使用前置處理指示詞和表示式來控制 NMAKE 工作階段。 前置處理指令可以放在makefile或中 Tools.ini。 使用 指示詞,您可以有條件地處理makefile、顯示錯誤訊息、包含其他makefiles、取消定義巨集,以及開啟或關閉特定選項。

Makefile 前置處理指示詞

前置處理指示詞不區分大小寫。 初始驚嘆號 (!) 必須出現在行的開頭。 零或多個空格或索引標籤可以出現在驚嘆號後面,以進行縮排。

  • !CMDSWITCHES{ +option option- | } ...

    開啟或關閉每個列出的 選項 。 空格或索引標籤必須出現在 或 - 運算子之前+。 運算子與 選項字母之間不能顯示空格。 字母不區分大小寫,且未指定斜線 (/)。 若要開啟某些選項並關閉其他選項,請使用 的 !CMDSWITCHES個別規格。

    /Dmakefile 中只能使用、 /I/N/S 。 在 中Tools.ini,除了 、、/HELP/NOLOGO/X/?之外/F,所有選項都允許使用。 在描述區塊中指定的變更在下一個描述區塊之前不會生效。 這個指示詞會更新 MAKEFLAGS;如果 MAKEFLAGS 指定,則會在遞歸期間繼承變更。

  • !ERROR發簡訊

    顯示錯誤 U1050 中的文字,然後停止 NMAKE,即使/K使用 、.IGNORE!CMDSWITCHES/I 、 或 dash (-) 命令修飾詞也一樣。 忽略文字之前的空格或索引標籤。

  • !MESSAGE發簡訊

    將文字顯示至標準輸出。 忽略文字之前的空格或索引標籤。

  • !INCLUDE [ < ] filename [ > ] ]

    將檔名讀為makefile,然後繼續進行目前的makefile。 NMAKE 會先搜尋 指定或目前目錄中的檔名 ,然後以遞歸方式搜尋任何父 makefiles 的目錄,然後,如果 檔名 是以角括號 (< >), 括在巨集所 INCLUDE 指定的目錄中,該目錄一開始設定為 INCLUDE 環境變數。 將設定、.PRECIOUS和推斷規則傳遞.SUFFIXES至遞歸Makefiles很有用。

  • !IFconstant_expression

    處理與下一個 !ELSE !ENDIF 或 如果constant_expression評估為非零值之間的語句。!IF

  • !IFDEF巨集_name

    在和下一個 之間!IFDEF處理語句,如果!ENDIF定義 巨集_name,則!ELSE為 。 將 null 巨集視為已定義。

  • !IFNDEF巨集_name

    在和下一個 !ELSE !ENDIF 之間處理語句!IFNDEF,如果未定義 巨集_name,則為 。

  • !ELSE[ IF constant_expression 巨集IFDEF | _name | IFNDEF巨集_name ]

    !ELSE如果先前 !IF!IFDEF!IFNDEF 語句評估為零,則處理 和 下一個 !ENDIF 語句之間的語句。 選擇性關鍵詞可讓您進一步控制前置處理。

  • !ELSEIF

    並為 !ELSE IF 的同義字。

  • !ELSEIFDEF

    並為 !ELSE IFDEF 的同義字。

  • !ELSEIFNDEF

    並為 !ELSE IFNDEF 的同義字。

  • !ENDIF

    標記、 !IFDEF!IFNDEF 區塊的!IF結尾。 忽略相同行之後 !ENDIF 的任何文字。

  • !UNDEF巨集_name

    undefines 巨集_name

Makefile 前置處理中的運算式

!IF!ELSE IF constant_expression是由整數常數(以十進位或 C 語言表示法)、字串常數或命令所組成。 使用括號將表達式分組。 表達式使用 C 樣式帶正負號的長整數算術;數位以 32 位二的補碼形式,範圍 -2147483648 為2147483647。

表達式可以使用運算符來處理常數值、命令、字串、巨集和文件系統路徑的結束代碼。

Makefile 前置處理運算子

Makefile 預先處理運算式可以使用充當常數值、命令結束代碼、字串、巨集和檔案系統路徑的運算子。 若要評估表達式,預處理器會先展開巨集,然後執行命令,然後執行作業。 它會依括弧中的明確分組順序來評估作業,然後依運算符優先順序來評估作業。 結果為常數值。

運算子 DEFINED 是邏輯運算符,可處理巨集名稱。 如果已定義 巨集_name,則表達式DEFINED( macro_name )為 true,即使沒有指派的值也一樣。 DEFINED結合 !IF 或相當於 !IFDEF!ELSE IF !ELSE IFDEF。 不過,不同於這些指示詞, DEFINED 可以在複雜的表達式中使用。

運算子 EXIST 是可處理文件系統路徑的邏輯運算元。 EXIST( path )如果路徑存在,則為 true。 來自的結果 EXIST 可用於二進位表達式。 如果 path 包含空格,請以雙引弧括住它。

若要比較兩個字串,請使用相等運算符或==不等比較運算元 (!=) 運算符。 以雙引號含括字串。

整數常數可以使用一元運算子進行數值否定 (-)、一個補碼 (~) 和邏輯否定 (!)。

運算式可使用下列運算子。 相同優先順序的運算子會分組在一起,這些群組按優先順序從高到低列出。 一元運算子與右側運算元相關聯。 相同優先順序的二元運算子會從左向右關聯運算元。

Operator 描述
DEFINED(巨集_name ) 針對 巨集_name 的目前定義狀態產生邏輯值。
EXIST(路徑 ) 針對路徑上的檔案存在產生邏輯值。
! 一元邏輯 NOT。
~ 一元的補碼。
- 一元負運算。
* 乘法。
/ 除法。
% 模數 (餘數)。
+ 加法。
- 減法。
<< 位元左移。
>> 位元右移。
<= 小於或等於。
>= 大於或等於。
< 小於。
> 大於。
== 相等。
!= 不等。
& 位元 AND。
^ 位元 XOR。
| 位元 OR。
&& 邏輯 AND。
|| 邏輯 OR。

注意

位 XOR 運算子 (^) 與逸出字元相同,而且必須在表示式中使用時逸出 (as ^^) 。

在前置處理中執行程式

若要在前置處理期間使用命令的結束代碼,請在括弧 ([ ]) 內指定命令,並搭配任何自變數。 執行命令之前,會展開任何巨集。 NMAKE 會將命令規格取代為命令的結束代碼,這可用於表達式來控制前置處理。

範例

!IF [my_command.exe arg1 arg2] != 0
!MESSAGE my_command.exe failed!
!ENDIF

另請參閱

NMAKE 參考