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
指定,則會在遞歸期間繼承變更。!ERROR
發簡訊顯示錯誤 U1050 中的文字,然後停止 NMAKE,即使
/K
使用 、.IGNORE
!CMDSWITCHES
/I
、 或 dash (-
) 命令修飾詞也一樣。 忽略文字之前的空格或索引標籤。!MESSAGE
發簡訊將文字顯示至標準輸出。 忽略文字之前的空格或索引標籤。
!INCLUDE
[<
] filename [>
] ]將檔名讀為makefile,然後繼續進行目前的makefile。 NMAKE 會先搜尋指定或目前目錄中的檔名 ,然後以遞歸方式搜尋任何父 makefiles 的目錄,然後,如果 檔名 是以角括號 (
< >
) 括住,則由巨集指定的INCLUDE
目錄中,該目錄一開始設定為INCLUDE
環境變數。 將設定、.PRECIOUS
和推斷規則傳遞.SUFFIXES
至遞歸Makefiles很有用。!IF
constant_expression處理與下一個
!ELSE
!ENDIF
或 如果constant_expression評估為非零值之間的語句。!IF
!IFDEF
macro_name處理和下一個
!ELSE
或!ENDIF
定義macro_name之間的語句!IFDEF
。 Null 巨集會被視為要定義。!IFNDEF
macro_name處理與下一個或
!ENDIF
未定義macro_name之間的語句!IFNDEF
。!ELSE
!ELSE
[IF
constant_expression macro_name | |IFDEF
IFNDEF
macro_name ]!ELSE
如果先前!IF
、!IFDEF
或!IFNDEF
語句評估為零,則處理 和 下一個!ENDIF
語句之間的語句。 選擇性關鍵詞可讓您進一步控制前置處理。!ELSEIF
並為
!ELSE IF
的同義字。!ELSEIFDEF
並為
!ELSE IFDEF
的同義字。!ELSEIFNDEF
並為
!ELSE IFNDEF
的同義字。!ENDIF
標記、
!IFDEF
或!IFNDEF
區塊的!IF
結尾。 忽略相同行之後!ENDIF
的任何文字。!UNDEF
macro_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 包含空格,請以雙引弧括住它。
若要比較兩個字串,請使用相等運算符或==
不等比較運算元 (!=
) 運算符。 以雙引號含括字串。
整數常數可以使用一元運算子進行數值否定 (-
)、一個補碼 (~
) 和邏輯否定 (!
)。
運算式可使用下列運算子。 相同優先順序的運算子會分組在一起,這些群組按優先順序從高到低列出。 一元運算子與右側運算元相關聯。 相同優先順序的二元運算子會從左向右關聯運算元。
Operator | 描述 |
---|---|
DEFINED( macro_name ) |
針對macro_name目前的定義狀態產生邏輯值。 |
EXIST( 路徑 ) |
針對路徑上的檔案存在產生邏輯值。 |
! |
一元邏輯 NOT。 |
~ |
一元的補碼。 |
- |
一元負運算。 |
* |
乘法。 |
/ |
除法。 |
% |
模數 (餘數)。 |
+ |
加法。 |
- |
減法。 |
<< |
位元左移。 |
>> |
位元右移。 |
<= |
小於或等於。 |
>= |
大於或等於。 |
< |
小於。 |
> |
大於。 |
== |
相等。 |
!= |
不等。 |
& |
位元 AND。 |
^ |
位元 XOR。 |
| |
位元 OR。 |
&& |
邏輯 AND。 |
|| |
邏輯 OR。 |
注意
位 XOR 運算子 (^
) 與逸出字元相同,而且必須在表示式中使用時逸出 (as ^^
) 。
在前置處理中執行程式
若要在前置處理期間使用命令的結束代碼,請在括弧 ([ ]
) 內指定命令,並搭配任何自變數。 執行命令之前,會展開任何巨集。 NMAKE 會將命令規格取代為命令的結束代碼,這可用於表達式來控制前置處理。
範例
!IF [my_command.exe arg1 arg2] != 0
!MESSAGE my_command.exe failed!
!ENDIF