CMake 生成器表示式---條件表示式和邏輯運算子

梦起丶發表於2024-10-30

【寫在前面】

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>"
)

除了 10 之外的類似布林的 condition 值可以透過用 $<BOOL:...> 生成器表示式包裝它們來處理:

$<BOOL:string>

string 轉換為 01。如果以下任何一項為真,則評估為“0”:

  • string 為空,

  • string 是不區分大小寫的等於 0FALSEOFFNNOIGNORE 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 是以逗號分隔的布林表示式列表,所有這些表示式的計算結果必須為 10。如果所有條件都為“1”,則整個表示式的計算結果為“1”。如果任何條件為“0”,則整個表示式的計算結果為“0”。

$<OR:conditions>

其中 conditions 是以逗號分隔的布林表示式列表。所有這些都必須評估為“1”或“0”。如果 condition 中的至少一個為“1”,則整個表示式的計算結果為“1”。如果所有 condition 的計算結果為“0”,則整個表示式的計算結果為“0”。

$<NOT:condition>

condition 必須是 01。如果 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

相關文章