CMD#40 : get_property 獲取一個屬性值
get_property(<variable>
<GLOBAL |
DIRECTORY [dir] |
TARGET <target> |
SOURCE <source> |
TEST <test> |
CACHE <entry> |
VARIABLE>
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
獲取在某個域中一個對象的某種屬性值。第一個參數指定了存儲屬性值的變量。第二個參數確定了獲取該屬性的域。域的選項僅限於:
- GLOBAL 域是唯一的,它不接受域名字。
- DIRECTORY域默認為當前目錄,但是其他的路徑(已經被CMake處理過)可以以相對路徑或完整路徑的方式跟在該域后面。
- TARGET域后面必須跟有一個已有的目標名。
- SOURCE域后面必須跟有一個源文件名。
- TEST域后面必須跟有一個已有的測試。
- CACHE域后面必須跟有一個cache條目。
- VARIABLE域是唯一的,它不接受域名字。
PROPERTY選項是必須的,它后面緊跟要獲取的屬性名。如果該屬性沒有被設置,該命令將返回空值。如果給定了SET選項,那么返回值會被設置為一個布爾值,用來指示該屬性是否被設置過。如果給定了DEFINED選項,那么返回值會被設置為一個布爾值,用來指示該屬性是否被類似於define_property的命令定義過。如果指定了BRIEF_DOCS或者FULL_DOCS選項,那么該變量將會被設置為被查詢屬性的文檔的字符串。如果被請求的屬性的文檔沒有被定義,將返回NOTFOUND。
CMD#41 : get_source_file_property
為一個源文件獲取一種屬性值。
get_source_file_property(VAR file property)
從一個源文件中獲取某種屬性值。這個屬性值存儲在變量VAR中。如果該屬性沒有被找到,VAR會被設置為NOTFOUND。使用set_source_files_proterties命令來設置屬性值。源文件屬性通常用來控制文件如何被構建。一個必定存在的屬性是LOCATION。
CMD#42 : get_target_property 從一個目標中獲取一個屬性值。
get_target_property(VAR target property)
從一個目標中獲取屬性值。屬性的值會被存儲在變量VAR中。如果該屬性沒有被發現,VAR會被設置為NOTFOUND。使用set_target_properties命令來設置屬性值。屬性值一般用於控制如何去構建一個目標,但是有些屬性用來查詢目標的信息。該命令可以獲取當前已經被構建好的任意目標的屬性。該目標不一定存在於當前的CMakeLists.txt文件中。
CMD#43 : get_test_property
獲取一個測試的屬性。
get_test_property(test VAR property)
從指定的測試中獲取某種屬性。屬性值會被存儲到變量VAR中。如果沒有找到該屬性,CMake將會報錯。你可以使用命令cmake --help-property-list來獲取標准屬性的清單。
CMD#44 : if
條件執行一組命令。
if(expression)
# then section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
elseif(expression2)
# elseif section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
else(expression)
# else section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endif(expression)
評估給定的表達式。如果結果是true,在THEN段的命令就會被調用。否則,在ELSE區段的命令會被調用。ELSEIF和ELSE區段是可選的 。可以有多個ELSEIF子句。注意,在else和elseif子句中的表達式也是可選的。判斷條件可以用長表達式,並且表達式有約定的優先級順序。括號中的表達式會首先被調用;然后是一元運算符,比如EXISTS,COMMAND以及DEFINED;然后是EQUAL,LESS,GREATER,STRLESS,STRGREATER,STREQUAL,MATCHES;然后是NOT運算符,最后是AND,OR運算符。幾種可能的表達式是:
if(<常量>)
如果<常量>是1,ON,YES,TRUE,Y或者非0數值,那么表達式為真;如果<常量>是0,OFF,NO,FALSE,N,IGNORE,"",或者以'-NOTFOUND'為后綴,那么表達式為假。這些布爾常量值是大小寫無關的。
if(<變量>)
如果<變量>的值不是一個false常量,表達式為真。
if(NOT <表達式>)
如果<表達式>的值是false的話,真個表達式為真。
if(<表達式1> AND <表達式2>)
如果兩個表達式都為真,整個表達式為真。
if(<表達式1> OR <表達式2>)
只要有一個表達式為真,整個表達式為真。
if(COMMAND command-name)
如果給出的名字是一個可以被調用的命令,宏,或者函數的話,整個表達式的值為真。
if(POLICY policy-id)
如果給出的名字是一個已有的策略(格式是CMP<NNNN>),表達式為真。
if(TARGET 目標名)
如果給出的名字是一個已有的構建目標或導入目標的話,表達式為真。
if(EXISTS 文件名)
if(EXISTS 路徑名)
如果給出的文件名或路徑名存在,表達式為真。該命令只對完整路徑有效。
if(file1 IS_NEWER_THAN file2)
如果file1比file2更新或者其中的一個文件不存在,那么表達式為真。該命令只對完整路徑有效。
if(IS_DIRECTORY directory-name)
如果給定的名字是一個路徑,表達式返回真。該命令只對完整路徑有效。
if(IS_SYMLINK file-name)
如果給定的名字十一個符號鏈接的話,表達式返回真。該命令只對完整路徑有效。
if(IS_ABSOLUTE path)
如果給定的路徑是一個絕對路徑的話,表達式返回真。
if(variable MATCHES regex)
if(string MATCHES regex)
如果給定的字串或變量值域給定的正則表達式匹配的話,表達式返回真。
if(variable LESS number)
if(string LESS number)
if(variable GREATER number)
if(string GREATER number)
if(variable EQUAL number)
if(string EQUAL number)
如果給定的字串或變量值是一個有效的數字並且不等號或等號滿足的話,表達式返回真。
if(variable STRLESS string)
if(string STRLESS string)
if(variable STRGREATER string)
if(string STRGREATER string)
if(variable STREQUAL string)
if(string STREQUAL string)
如果給定的字串或變量值依字典序小於(或者大於,或者等於)右邊給出的字串或變量值的話,表達式返回真。
if(version1 VERSION_LESS version2)
if(version1 VERSION_EQUAL version2)
if(version1 VERSION_GREATER version2)
對版本號的各部分依次比較(版本號格式是major[.minor[.patch[.tweak]]])version1和version2的大小。
if(DEFINED variable)
如果給定的變量被定義了的話,該表達式為真。如果變量被設置了,它的值是真是假都無所謂。
if((expression) AND (expression OR (expression)))
在小括號內的表達式會首先被計算,然后才按照先前介紹的運算來計算。有內嵌的括號時,最里的括號會作為包含它們的表達式的計算過程的一部分。IF語句在CMake的歷史上出現的相當早,它擁有一些需要特殊介紹的便捷特性。IF表達式只有在其中有一個單一的保留值的時候,才會精簡操作(即不做變量展開——譯注);這些保留值包括:如果是大小寫無關的 ON,1, YES,TRUE,Y,它返回真;如果是OFF,0,NO,FALSE,N,NOTFOUND,*-NOTFOUND,IGNORE,它返回假。這種特性非常合理,它為新作者提供了一種不需要精確匹配true或者false的便利性。這些值會被當做變量處理,即使它們沒有使用${}語法的時候,也會被解引用。這意味着,如果你寫下了這樣的語句:
if (boobah)
CMake將會把它當做你寫了
if (${boobah})
來處理。類似地,如果你寫了
if (fubar AND sol)
CMake將會便捷地把它解釋為
if ("${fubar}" AND "${sol}")
上述兩例的后者確實是正確的書寫方式,但是前者也是可行的。if語句中只有某些操作有這種特殊的變量處理方式。這些特殊的語句包括:
- 對於MATCHES運算符,待匹配的左邊的參數首先被檢查,用來確認它是否是一個已經定義的變量;如果是,該變量的值會被使用,否則就會用它的原始值。
- 如果MATCHES運算符沒有左邊的參數,它返回false,但不產生錯誤。
- LESS,GREATER,EQUAL運算符的左邊的參數和右邊的參數會被獨立測試,用來確認它們是否是被定義的變量;如果是,使用它們被定義的值,否則使用它們的原始值。
- STRLESS,STRGREATER,STREQUAL運算符的左邊的參數和右邊的參數會被獨立測試,用來確認它們是否是被定義的變量;如果是,使用它們被定義的值,否則使用它們的原始值。
- VERSIONLESS,VERSIONGREATER,VERSIONEQUAL運算符的左邊的參數和右邊的參數會被獨立測試,用來確認它們是否是被定義的變量;如果是,使用它們被定義的值,否則使用它們的原始值。
- NOT運算符右邊的參數會被測試用來確定它是否是布爾常量,如果是,就用這個常量;否則它會被當做一個變量然后被解引用。
- AND和OR運算符的左邊的參數和右邊的參數會被獨立測試,用來確認它們是否是布爾常量;如果是,就用這個常量,否則它們會被當做變量然后被解引用。