Makefile 前置處理

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

Makefile 前置處理指示詞

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

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

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

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

  • !ERRORtext

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

  • !MESSAGEtext

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

  • !INCLUDE [ < ] filename [ > ] ]

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

  • !IFconstant_expression

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

  • !IFDEFmacro_name

    處理和下一個 !ELSE!ENDIF 定義 macro_name 之間的語句 !IFDEF 。 Null 宏會被視為要定義。

  • !IFNDEFmacro_name

    處理與下一個或 !ENDIF 未定義macro_name 之間的語句 !IFNDEF!ELSE

  • !ELSE[ IF constant_expression macro_name | | IFDEFIFNDEF macro_name ]

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

  • !ELSEIF

    並為 !ELSE IF 的同義字。

  • !ELSEIFDEF

    並為 !ELSE IFDEF 的同義字。

  • !ELSEIFNDEF

    並為 !ELSE IFNDEF 的同義字。

  • !ENDIF

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

  • !UNDEFmacro_name

    未完成 macro_name

makefile 前置處理中的運算式

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

運算式可以使用運算子來處理常數值、命令、字串、宏和檔案系統路徑的結束代碼。

Makefile 前置處理運算子

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

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

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

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

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

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

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

注意

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

在前置處理中執行程式

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

範例

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

另請參閱

NMAKE 參考