【寫在前面】
CMake 的生成器表示式用於在構建系統級別上進行條件判斷和邏輯運算,它們通常用在目標屬性和生成器表示式上下文中。這些表示式允許你根據不同的平臺、配置或編譯器來定製構建過程。
本文引用的文件連結:
cmake 生成器表示式 (7) — CMake 3.26.4 Documentation
【正文開始】
本篇文章將介紹《條件表示式》
和《邏輯運算子》
。
- 條件表示式:
生成器表示式的一個基本類別與條件邏輯有關。支援兩種形式的條件生成器表示式:
$<condition:true_string>
如果
condition
為 “1”,則評估為“true_string”,如果condition
評估為“0”,則評估為空字串。condition
的任何其他值都會導致錯誤。
$<IF:condition,true_string,false_string>
在 3.8 版本加入.
如果
condition
為 “1”,則評估為“true_string”,如果condition
為“0”,則評估為“false_string”。condition
的任何其他值都會導致錯誤。
通常,condition
本身就是一個生成器表示式。例如,當使用 Debug
配置時,以下表示式擴充套件為 DEBUG_MODE
,所有其他配置為空字串:
$<$<CONFIG:Debug>:DEBUG_MODE>
使用示例:
#條件表示式 $<condition:true_string>
#等價於C++ if (condition == "1") return true_string else return ""
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[1]: WIN32: ${WIN32} | $<${WIN32}:is win32> | $<0:is 0>"
)
#條件表示式 $<IF:condition,true_string,false_string>
#等價於C++ condition ? true_string : false_string
set(IS_DEBUG "1")
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[2]: IS_DEBUG: ${IS_DEBUG} | $<IF:${IS_DEBUG},is debug,is release>"
)
除了 1
或 0
之外的類似布林的 condition
值可以透過用 $<BOOL:...>
生成器表示式包裝它們來處理:
$<BOOL:string>
將
string
轉換為0
或1
。如果以下任何一項為真,則評估為“0”:
string
為空,
string
是不區分大小寫的等於0
、FALSE
、OFF
、N
、NO
、IGNORE
或NOTFOUND
string
以字尾-NOTFOUND
結尾(區分大小寫)。否則計算為“1”。
當 CMake 變數提供 condition
時,經常使用 $<BOOL:...>
生成器表示式:
$<$<BOOL:${HAVE_SOME_FEATURE}>:-DENABLE_SOME_FEATURE>
使用示例:
#條件表示式 $<BOOL:string>
#等價於C++ if (string) return "1" else return "0"
set(STRING2BOOL "not empty")
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[3]: STRING2BOOL: ${STRING2BOOL} | $<BOOL:${STRING2BOOL}> | $<$<BOOL:${STRING2BOOL}>:STRING2BOOL is not empty>"
)
三個示例的輸出如下:
- 邏輯運算子
支援常見的布林邏輯運算子:
$<AND:conditions>
其中
conditions
是以逗號分隔的布林表示式列表,所有這些表示式的計算結果必須為1
或0
。如果所有條件都為“1”,則整個表示式的計算結果為“1”。如果任何條件為“0”,則整個表示式的計算結果為“0”。
$<OR:conditions>
其中
conditions
是以逗號分隔的布林表示式列表。所有這些都必須評估為“1”或“0”。如果condition
中的至少一個為“1”,則整個表示式的計算結果為“1”。如果所有condition
的計算結果為“0”,則整個表示式的計算結果為“0”。
$<NOT:condition>
condition
必須是0
或1
。如果condition
為“1”,則表示式的結果為“0”,否則為“1”。
使用示例:
#邏輯運算子 $<AND:conditions>
#等價於C++ if (condition && condition && ...) return "1" else return "0"
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[1]: (1 && 0 && 1) = $<AND:1,0,1>"
)
#邏輯運算子 $<OR:conditions>
#等價於C++ if (condition || condition || ...) return "1" else return "0"
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[2]: (1 || 0 || 0) = $<OR:1,0,0>"
)
#邏輯運算子 $<NOT:condition>
#等價於C++ if (!condition) return "1" else return "0"
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[3]: !1 = $<NOT:1>"
)
結果如下:
【結語】
專案連結(多多star呀..⭐_⭐):
Github 地址:https://github.com/mengps/LearnCMake