CMake學習(六) —— if 和 else

一、基本語法

if(<condition>)
  <commands>
elseif(<condition>) # optional block, can be repeated
  <commands>
else()              # optional block
  <commands>
endif()

如果需要對項目進行有條件的編譯,則需要用到if-else語句。

二、基本用法

比如需要根據操作系統執行不同的代碼:

# CMakeLists.txt
# CMake最低版本要求
cmake_minimum_required(VERSION 3.5)

# 項目名稱
project(test_6)

if(WIN32)
	message(STATUS "Now is windows")
elseif(APPLE)
	message(STATUS "Now is Apple systens.")
elseif(UNIX)
	message(STATUS "Now is UNIX-like OS's.")
endif()

三、其他用法

1. 邏輯運算

# 取反運算
if(NOT <condition>)

# 與運算
if(<cond1> AND <cond2>)

# 或運算
if(<cond1> OR <cond2>)

2. 特殊語句

if(COMMAND command-name)
如果給定名稱是可以調用的命令,宏或函數,則爲trueif(POLICY policy-id)
如果給定名稱是現有策略(格式爲CMP<NNNN>),則爲True 。

if(TARGET target-name)
如果給定名稱是通過調用調用創建的現有邏輯目標名稱,則爲True。 add_executable()add_library(), 要麼 add_custom_target() 已經被調用的命令(在任何目錄中)。

if(TEST test-name)
如果給定名稱是由測試人員創建的現有測試名稱,則爲True add_test() 命令。

if(EXISTS path-to-file-or-directory)
如果指定的文件或目錄存在,則爲True。僅針對完整路徑定義行爲。解析符號鏈接,即,如果命名的文件或目錄是符號鏈接,則如果符號鏈接的目標存在,則返回trueif(file1 IS_NEWER_THAN file2)
如果file1是更新版本file2或兩個文件之一不存在,則爲true 。僅針對完整路徑定義行爲。如果文件時間戳完全相同,則IS_NEWER_THAN比較將返回true,這樣,在出現平局的情況下將發生任何相關的生成操作。這包括爲file1和file2傳遞相同文件名的情況。

if(IS_DIRECTORY path-to-directory)
如果給定名稱是目錄,則爲True。僅針對完整路徑定義行爲。

if(IS_SYMLINK file-name)
如果給定名稱是符號鏈接,則爲True。僅針對完整路徑定義行爲。

if(IS_ABSOLUTE path)
如果給定路徑是絕對路徑,則爲True。

if(<variable|string> MATCHES regex)
如果給定的字符串或變量的值與給定的常規條件匹配,則爲true。有關正則表達式格式,請參見正則表達式規範。 ()組被捕獲在CMAKE_MATCH_<n> 變量。

if(<variable|string> LESS <variable|string>)
如果給定的字符串或變量的值是有效數字且小於右邊的數字,則爲trueif(<variable|string> GREATER <variable|string>)
如果給定的字符串或變量的值是有效數字並且大於右側的數字,則爲trueif(<variable|string> EQUAL <variable|string>)
如果給定的字符串或變量的值是有效數字並且等於右側的數字,則爲trueif(<variable|string> LESS_EQUAL <variable|string>)
如果給定的字符串或變量的值是有效數字且小於或等於右側的數字,則爲trueif(<variable|string> GREATER_EQUAL <variable|string>)
如果給定的字符串或變量的值是有效數字並且大於或等於右側的數字,則爲trueif(<variable|string> STRLESS <variable|string>)
如果給定的字符串或變量的值在字典上小於右側的字符串或變量,則爲trueif(<variable|string> STRGREATER <variable|string>)
如果給定的字符串或變量的值在字典上大於右側的字符串或變量,則爲trueif(<variable|string> STREQUAL <variable|string>)
如果給定的字符串或變量的值在字典上等於右側的字符串或變量,則爲trueif(<variable|string> STRLESS_EQUAL <variable|string>)
如果給定的字符串或變量的值在字典上小於或等於右側的字符串或變量,則爲trueif(<variable|string> STRGREATER_EQUAL <variable|string>)
如果給定的字符串或變量的值在字典上大於或等於右側的字符串或變量,則爲trueif(<variable|string> VERSION_LESS <variable|string>)
按組件的整數版本號比較(版本格式爲 major[.minor[.patch[.tweak]]],省略的組件視爲零)。任何非整數版本組件或版本組件的非整數結尾部分均會在該點處有效截斷字符串。

if(<variable|string> VERSION_GREATER <variable|string>)
按組件的整數版本號比較(版本格式爲 major[.minor[.patch[.tweak]]],省略的組件視爲零)。任何非整數版本組件或版本組件的非整數結尾部分均會在該點處有效截斷字符串。

if(<variable|string> VERSION_EQUAL <variable|string>)
按組件的整數版本號比較(版本格式爲 major[.minor[.patch[.tweak]]],省略的組件視爲零)。任何非整數版本組件或版本組件的非整數結尾部分均會在該點處有效截斷字符串。

if(<variable|string> VERSION_LESS_EQUAL <variable|string>)
按組件的整數版本號比較(版本格式爲 major[.minor[.patch[.tweak]]],省略的組件視爲零)。任何非整數版本組件或版本組件的非整數結尾部分均會在該點處有效截斷字符串。

if(<variable|string> VERSION_GREATER_EQUAL <variable|string>)
按組件的整數版本號比較(版本格式爲 major[.minor[.patch[.tweak]]],省略的組件視爲零)。任何非整數版本組件或版本組件的非整數結尾部分均會在該點處有效截斷字符串。

if(<variable|string> IN_LIST <variable>)
如果給定元素包含在命名列表變量中,則爲trueif(DEFINED <name>|CACHE{<name>}|ENV{<name>})
如果<name>定義了具有給定的變量,緩存變量或環境變量,則爲true 。變量的值無關緊要。請注意,宏參數不是變量。

if((condition) AND (condition OR (condition)))
首先評估括號內的條件,然後像前面的示例一樣評估其餘條件。如果有嵌套的括號,則將最裏面的括號作爲包含它們的條件的一部分進行評估。

參考:
https://cmake.org/cmake/help/v3.14/command/if.html?highlight=#command:if
https://blog.csdn.net/sean_8180/article/details/81189996

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章