CMake 手册详解(二十二)
原文地址 http://www.cnblogs.com/coderfenghc/archive/2012/10/20/2712806.html
CMD#65:?separate_arguments?將空格分隔的參數(shù)解析為一個(gè)分號(hào)分隔的list。
separate_arguments(<var> <UNIX|WINDOWS>_COMMAND "<args>")解析一個(gè)unix或者windows風(fēng)格的命令行字符串"<args>",并將結(jié)果以分號(hào)分隔的list的形式存儲(chǔ)到<var>中。整個(gè)命令行都必須從這個(gè)"<args>"參數(shù)中給出。
UNIX_COMMAND模式以沒(méi)有被括起來(lái)的白字符為參數(shù)的分隔符。它可以識(shí)別單引號(hào)和雙引號(hào)的引號(hào)對(duì)。反斜杠可以對(duì)下一個(gè)字符的字面值轉(zhuǎn)義(\",就是");沒(méi)有其他特殊的轉(zhuǎn)義字符(例如\n就是n)。
WINDOWS_COMMAND模式按照與運(yùn)行時(shí)庫(kù)相同的語(yǔ)法解析一個(gè)windows命令行,在啟動(dòng)(starrtup)時(shí)構(gòu)造argv。它使用沒(méi)有被雙引號(hào)括起來(lái)的白字符來(lái)分隔參數(shù)。反斜杠維持其字面含義,除非它們?cè)陔p引號(hào)之前。更多細(xì)節(jié),參見(jiàn)MSDN的文章:"Parsing C Command-Line Arguments"。
separate_arguments(VARIABLE)將VARIABLE的值轉(zhuǎn)換為一個(gè)分號(hào)分隔的list。所有的空格會(huì)被替換為';'。該命令可以用來(lái)輔助生成命令行。
CMD#66:?set?將一個(gè)CMAKE變量設(shè)置為給定值。
set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])將變量<variable>的值設(shè)置為<value>。在<variable>被設(shè)置之前,<value>會(huì)被展開(kāi)。如果有CACHE選項(xiàng),那么<variable>就會(huì)添加到cache中;這時(shí)<type>和<docstring>是必需的。<type>被CMake GUI用來(lái)選擇一個(gè)窗口,讓用戶設(shè)置值。<type>可以是下述值中的一個(gè):
FILEPATH = 文件選擇對(duì)話框。 PATH = 路徑選擇對(duì)話框。 STRING = 任意的字符串。 BOOL = 布爾值選擇復(fù)選框。 INTERNAL = 不需要GUI輸入端。(適用于永久保存的變量)。如果<type>是內(nèi)部的(INTERNAL),那么<value>總是會(huì)被寫(xiě)入到cache中,并替換任何已經(jīng)存在于cache中的值。如果它不是一個(gè)cache變量,那么這個(gè)變量總是會(huì)寫(xiě)入到當(dāng)前的makefile中。FORCE選項(xiàng)將覆蓋cache值,從而去掉任何用戶帶來(lái)的改變。
如果指定了PARENT_SCOPE選項(xiàng),變量<variable>將會(huì)被設(shè)置為當(dāng)前作用域之上的作用域中。每一個(gè)新的路徑或者函數(shù)都可以創(chuàng)建一個(gè)新作用域。該命令將會(huì)把一個(gè)變量的值設(shè)置到父路徑或者調(diào)用函數(shù)中(或者任何類似的可用的情形中。)
如果沒(méi)有指定<value>,那么這個(gè)變量就會(huì)被撤銷而不是被設(shè)置。另見(jiàn):unset()命令。
set(<variable> <value1> ... <valueN>)在這種情形下,<variable>被設(shè)置為一個(gè)各個(gè)值之間由分號(hào)分隔的list。
<variable>可以是環(huán)境變量,比如:
set( ENV{PATH} /home/martink )在這種情形下,環(huán)境變量將會(huì)被設(shè)置。
CMD#67:?set_directory_properties??設(shè)置某個(gè)路徑的一種屬性。
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)為當(dāng)前的路徑及其子路徑設(shè)置一種屬性。如果該屬性不存在,CMake將會(huì)報(bào)告一個(gè)錯(cuò)誤。屬性包括:INCLUDE_DIRECTORIES, LINK_DIRECTORIES, INCLUDE_REGULAR_EXPRESSION, 以及ADDITIONAL_MAKE_CLEAN_FILES共四種。ADDITIONAL_MAKE_CLEAN_FILES是一個(gè)文件名的list,其中包含有"make clean"階段會(huì)被清除掉的文件。
CMD#68:?set_property??在給定的作用域內(nèi)設(shè)置一個(gè)命名的屬性。
set_property(<GLOBAL | DIRECTORY [dir] | TARGET [target1 [target2 ...]] | SOURCE [src1 [src2 ...]] | TEST [test1 [test2 ...]] | CACHE [entry1 [entry2 ...]]> [APPEND] PROPERTY <name> [value1 [value2 ...]])為作用域里的0個(gè)或多個(gè)對(duì)象設(shè)置一種屬性。第一個(gè)參數(shù)決定了屬性可以影響到的作用域。他必須是下述值之一:GLOBAL,全局作用域,唯一,并且不接受名字。DIRECTORY,路徑作用域,默認(rèn)為當(dāng)前路徑,但是也可以用全路徑或相對(duì)路徑指定其他值。TARGET,目標(biāo)作用域,可以命名0個(gè)或多個(gè)已有的目標(biāo)。SOURCE,源作用域,可以命名0個(gè)或多個(gè)源文件。注意,源文件屬性只對(duì)加到相同路徑(CMakeLists.txt)中的目標(biāo)是可見(jiàn)的。TEST 測(cè)試作用域可以命名0個(gè)或多個(gè)已有的測(cè)試。CACHE作用域必須指定0個(gè)或多個(gè)cache中已有的條目。
PROPERTY選項(xiàng)是必須的,并且要緊跟在待設(shè)置的屬性的后面。剩余的參數(shù)用來(lái)組成屬性值,該屬性值是一個(gè)以分號(hào)分隔的list。如果指定了APPEND選項(xiàng),該list將會(huì)附加在已有的屬性值之后。
CMD#69: set_source_files_properties?源文件有一些屬性來(lái)可以改變它們構(gòu)建的方式。
set_source_files_properties([file1 [file2 [...]]] PROPERTIES prop1 value1 [prop2 value2 [...]])以鍵/值對(duì)的方式設(shè)置與源文件相關(guān)的那些屬性值。那些CMake中的源文件屬性,參見(jiàn)關(guān)于屬性的相關(guān)文檔。不能被識(shí)別的屬性將會(huì)被忽略。源文件屬性只對(duì)同一路徑(CMakeLists.txt)中添加的目標(biāo)可見(jiàn)。
CMD#70:?set_target_properties??設(shè)置目標(biāo)的一些屬性來(lái)改變它們構(gòu)建的方式。
set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)為一個(gè)目標(biāo)設(shè)置屬性。該命令的語(yǔ)法是列出所有你想要變更的文件,然后提供你想要設(shè)置的值。你能夠使用任何你想要的屬性/值對(duì),并且在隨后的代碼中調(diào)用GET_TARGET_PROPERTY命令取出屬性的值。
影響一個(gè)目標(biāo)輸出文件的名字的屬性詳述如下。PREFIX和SUFFIX屬性覆蓋了默認(rèn)的目標(biāo)名前綴(比如lib)和后綴(比如.so)。IMPORT_PREFIX和IMPORT_SUFFIX是與之等價(jià)的屬性,不過(guò)針對(duì)的是DLL(共享庫(kù)目標(biāo))的導(dǎo)入庫(kù)。在構(gòu)建目標(biāo)時(shí),OUTPUT_NAME屬性設(shè)置目標(biāo)的真實(shí)名字,并且可以用來(lái)輔助創(chuàng)建兩個(gè)具有相同名字的目標(biāo),即使CMake需要唯一的邏輯目標(biāo)名。<CONFIG>_OUTPUT_NAME可以為不同的配置設(shè)置輸出的目標(biāo)名字。當(dāng)目標(biāo)在指定的配置名<CONFIG>(全部大寫(xiě),例如DEBUG_POSTFIX)下被構(gòu)建時(shí),<CONFIG>_POSTFIX為目標(biāo)的真實(shí)名字設(shè)置一個(gè)后綴。該屬性的值在目標(biāo)創(chuàng)建時(shí)被初始化為CMAKE_<CONFIG>_POSTFIX的值(可執(zhí)行目標(biāo)除外,因?yàn)檩^早的CMake版本不會(huì)為可執(zhí)行文件使用這個(gè)屬性。)
LINK_FLAGS屬性可以用來(lái)為一個(gè)目標(biāo)的鏈接階段添加額外的標(biāo)志。LINK_FLAGS_<CONFIG>將為配置<CONFIG>添加鏈接標(biāo)志,例如DEBUG,RELEASE,MINSIZEREL,RELWITHDEBINFO。DEFINE_SYMBOL屬性設(shè)置了編譯一個(gè)共享庫(kù)中的源文件時(shí)才會(huì)被定義的預(yù)處理器符號(hào)名。如果這個(gè)值沒(méi)有被設(shè)置的話,那么它會(huì)被設(shè)置為默認(rèn)值target_EXPORTS(如果目標(biāo)不是一個(gè)合法的C標(biāo)示符的話可以用一些替代標(biāo)志)。這對(duì)于檢測(cè)頭文件是包含在它們的庫(kù)以內(nèi)還是以外很有幫助,從而可以合理設(shè)置dllexport/dllimport修飾符(注意,只有在編譯到的時(shí)候,這個(gè)符號(hào)才會(huì)被定義;因此猜測(cè)在代碼中,判斷預(yù)處理符號(hào)是否被定義可以知道依賴庫(kù)是導(dǎo)入的還是導(dǎo)出的——譯注)。COMPILE_FLAGS屬性可以設(shè)置附加的編譯器標(biāo)志,它們會(huì)在構(gòu)建目標(biāo)內(nèi)的源文件時(shí)被用到。它也可以用來(lái)傳遞附加的預(yù)處理器定義。
LINKER_LANGUAGE屬性用來(lái)改變鏈接可執(zhí)行文件或共享庫(kù)的工具。默認(rèn)的值是設(shè)置與庫(kù)中的文件相匹配的語(yǔ)言。CXX和C是這個(gè)屬性的公共值。
對(duì)于共享庫(kù),VERSION和SOVERSION屬性分別可以用來(lái)指定構(gòu)建的版本號(hào)以及API版本號(hào)。當(dāng)構(gòu)建或者安裝時(shí),如果平臺(tái)支持符號(hào)鏈接并且鏈接器支持so名字,那么恰當(dāng)?shù)姆?hào)鏈接會(huì)被創(chuàng)建。如果只指定兩者中的一個(gè),缺失的另一個(gè)假定為具有相同的版本號(hào)。對(duì)于可執(zhí)行文件,VERSION可以被用來(lái)指定構(gòu)建版本號(hào)。當(dāng)構(gòu)建或者安裝時(shí),如果該平臺(tái)支持符號(hào)鏈接,那么合適的符號(hào)鏈接會(huì)被創(chuàng)建。對(duì)于在Windows系統(tǒng)而言,共享庫(kù)和可執(zhí)行文件的VERSION屬性被解析成為一個(gè)"major.minor"的版本號(hào)。這些版本號(hào)被用做該二進(jìn)制文件的鏡像版本。
還有一些屬性用來(lái)指定RPATH規(guī)則。INSTALL_RPATH是一個(gè)分號(hào)分隔的list,它指定了在安裝目標(biāo)時(shí)使用的rpath(針對(duì)支持rpath的平臺(tái)而言)(-rpath在gcc中用于在編譯時(shí)指定加載動(dòng)態(tài)庫(kù)的路徑;優(yōu)先級(jí)較系統(tǒng)庫(kù)路徑要高。詳情參見(jiàn)http://www.cmake.org/Wiki/CMake_RPATH_handling#What_is_RPATH_.3F——譯注)。INSTALL_RPATH_USE_LINK_PATH是一個(gè)布爾值屬性,如果它被設(shè)置為真,那么在鏈接器的搜索路徑中以及工程之外的目錄會(huì)被附加到INSTALL_RPATH之后。SKIP_BUILD_RPATH是一個(gè)布爾值屬性,它指定了是否跳過(guò)一個(gè)rpath的自動(dòng)生成過(guò)程,從而可以從構(gòu)建樹(shù)開(kāi)始運(yùn)行。BUILD_WITH_INSTALL_RPATH是一個(gè)布爾值屬性,它指定了是否將在構(gòu)建樹(shù)上的目標(biāo)與INSTALL_RPATH鏈接。該屬性要優(yōu)先于SKIP_BUILD_RPATH,因此避免了安裝之前的重新鏈接。INSTALL_NAME_DIR是一個(gè)字符串屬性,它用于在Mac OSX系統(tǒng)上,指定了被安裝的目標(biāo)中使用的共享庫(kù)的"install_name"域的目錄部分。如果目標(biāo)已經(jīng)被創(chuàng)建,變量CMAKE_INSTALL_RPATH, CMAKE_INSTALL_RPATH_USE_LINK_PATH, CMAKE_SKIP_BUILD_RPATH, CMAKE_BUILD_WITH_INSTALL_RPATH和CMAKE_INSTALL_NAME_DIR的值會(huì)被用來(lái)初始化這個(gè)屬性。
PROJECT_LABEL屬性可以用來(lái)在IDE環(huán)境,比如visual studio,中改變目標(biāo)的名字。?VS_KEYWORD可以用來(lái)改變visual studio的關(guān)鍵字,例如如果該選項(xiàng)被設(shè)置為Qt4VSv1.0的話,QT集成將會(huì)運(yùn)行得更好。
VS_SCC_PROJECTNAME, VS_SCC_LOCALPATH, VS_SCC_PROVIDER可以被設(shè)置,從而增加在一個(gè)VS工程文件中對(duì)源碼控制綁定的支持。
PRE_INSTALL_SCRIPT和POST_INSTALL_SCRIPT屬性是在安裝一個(gè)目標(biāo)之前及之后指定運(yùn)行CMake腳本的舊格式。只有當(dāng)使用舊式的INSTALL_TARGETS來(lái)安裝目標(biāo)時(shí),才能使用這兩個(gè)屬性。使用INSTALL命令代替這種用法。
EXCLUDE_FROM_DEFAULT_BUILD屬性被visual studio生成器使用。如果屬性值設(shè)置為1,那么當(dāng)你選擇"構(gòu)建解決方案"時(shí),目標(biāo)將不會(huì)成為默認(rèn)構(gòu)建的一部分。
CMD#71: set_tests_properties? ?設(shè)置若干個(gè)測(cè)試的屬性值。
set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2 value2)為若干個(gè)測(cè)試設(shè)置一組屬性。若屬性未被發(fā)現(xiàn),CMake將會(huì)報(bào)告一個(gè)錯(cuò)誤。這組屬性包括:WILL_FAIL, 如果設(shè)置它為true,那將會(huì)把這個(gè)測(cè)試的“通過(guò)測(cè)試/測(cè)試失敗”標(biāo)志反轉(zhuǎn)。PASS_REGULAR_EXPRESSION,如果它被設(shè)置,這個(gè)測(cè)試的輸出將會(huì)被檢測(cè)是否違背指定的正則表達(dá)式,并且至少要有一個(gè)正則表達(dá)式要匹配;否則測(cè)試將會(huì)失敗。
例子: PASS_REGULAR_EXPRESSION "TestPassed;All ok"FAIL_REGULAR_EXPRESSION: 如果該屬性被設(shè)置,那么只要輸出匹配給定的正則表達(dá)式中的一個(gè),那么測(cè)試失敗。
例子: PASS_REGULAR_EXPRESSION "[^a-z]Error;ERROR;Failed"PASS_REGULAR_EXPRESSION和FAIL_REGULAR_EXPRESSION屬性都期望一個(gè)正則表達(dá)式列表(list)作為其參數(shù)。
TIMEOUT: 設(shè)置該屬性將會(huì)限制測(cè)試的運(yùn)行時(shí)長(zhǎng)不超過(guò)指定的秒數(shù)。
CMD#72: site_name??將給定的變量設(shè)定為計(jì)算機(jī)名。
site_name(variable)CMD#73:?source_group??為Makefile中的源文件定義一個(gè)分組。
source_group(name [REGULAR_EXPRESSION regex] [FILES src1 src2 ...])為工程中的源文件中定義一個(gè)分組。這主要用來(lái)在Visual Studio中建立文件組按鈕(file tabs)。所有列出來(lái)的文件或者匹配正則表達(dá)式的文件都會(huì)被放到這個(gè)文件組中。如果一個(gè)文件匹配多個(gè)組,那么最后明確地列出這個(gè)文件的組將會(huì)包含這個(gè)文件,如果有這樣的組的話。如果沒(méi)有任何組明確地列出這個(gè)文件,那么最后那個(gè)其正則表達(dá)式與該文件名匹配的組,將會(huì)成為最終候選者。
組名中可以包含反斜杠,以指定子文件組:source_group(outer\\inner ...)
為了保持后向兼容性,這個(gè)命令也支持這種格式:source_group(name regex)
CMD#74:?string??字符串操作函數(shù)。
string(REGEX MATCH <regular_expression> <output variable> <input> [<input>...]) string(REGEX MATCHALL <regular_expression> <output variable> <input> [<input>...]) string(REGEX REPLACE <regular_expression> <replace_expression> <output variable> <input> [<input>...]) string(REPLACE <match_string> <replace_string> <output variable> <input> [<input>...]) string(COMPARE EQUAL <string1> <string2> <output variable>) string(COMPARE NOTEQUAL <string1> <string2> <output variable>) string(COMPARE LESS <string1> <string2> <output variable>) string(COMPARE GREATER <string1> <string2> <output variable>) string(ASCII <number> [<number> ...] <output variable>) string(CONFIGURE <string1> <output variable> [@ONLY] [ESCAPE_QUOTES]) string(TOUPPER <string1> <output variable>) string(TOLOWER <string1> <output variable>) string(LENGTH <string> <output variable>) string(SUBSTRING <string> <begin> <length> <output variable>) string(STRIP <string> <output variable>) string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>] [RANDOM_SEED <seed>] <output variable>)REGEX MATCH : 匹配正則表達(dá)式一次,然后將匹配的值存儲(chǔ)到輸出變量中。
REGEX MATCHALL : 盡可能多次地匹配正則表達(dá)式,然后將匹配的值以list的形勢(shì)存儲(chǔ)到輸出變量中。
REGEX REPLACE : 盡可能多次地匹配正則表達(dá)式,并且將匹配的值用replacement expression 替換掉,然后存儲(chǔ)到輸出變量中。這個(gè)replace expression 可以引用包含匹配字符串的子表達(dá)式,這些匹配的字符串用圓括號(hào)隔開(kāi)的\1,\2,...,\9等加以引用。注意:在CMake代碼里,如果要使用一個(gè)反斜杠,必須要用兩個(gè)反斜杠(\\1)轉(zhuǎn)義,才能通過(guò)參數(shù)解析。
REPLACE : 將輸入字符串內(nèi)所有出現(xiàn)match_string的地方都用replace_string代替,然后將結(jié)果存儲(chǔ)到輸出變量中。
COMPARE EQUAL/NOTEQUAL/LESS/GREATER : 將會(huì)比較兩個(gè)字符串,然后將比較的結(jié)果(true/false)存儲(chǔ)到輸出變量中。
ASCII : 將會(huì)把所有數(shù)字轉(zhuǎn)換為對(duì)應(yīng)的ASCII字符。
CONFIGURE : 將一個(gè)字符串進(jìn)行變換,這種變換與將一個(gè)FILE變換為CONFIGURE_FILE相似。
TOUPPER/TOLOWER : 將字符串轉(zhuǎn)換為大寫(xiě)/小寫(xiě)字符。
LENGTH : 返回給定字符串的長(zhǎng)度。
SUBSTRING : 返回給定字符串的子串。
STRIP : 返回一個(gè)給定字符串的子串,它會(huì)去掉原先字符串開(kāi)始和結(jié)尾的空格。
RANDOM : 將會(huì)返回一個(gè)給定長(zhǎng)度的隨機(jī)字符串,它由給定的字母表中的字母組成。默認(rèn)的長(zhǎng)度是5個(gè)字符,默認(rèn)的字母表是全部的大小寫(xiě)字母以及數(shù)字。如果指定了一個(gè)整數(shù)RANDOM_SEED,它的值將會(huì)被用做隨機(jī)數(shù)發(fā)生器的種子。
在正則表達(dá)式中,下述字符有特殊含義:
^ 在行首匹配。 $ 在行尾匹配。 . 匹配任意單個(gè)字符。 [ ] 匹配在中括號(hào)中的任意字符。 [^ ] 匹配不在中括號(hào)中的任意字符。 - 匹配任意在短橫線兩端字符閉區(qū)間中間的任意一個(gè)字符。 * 匹配先前模式零次或多次。 + 匹配先前模式一次或多次。 ? 匹配先前模式零次或一次。 | 匹配|兩側(cè)的任意一種模式。 () 保存一個(gè)匹配的子表達(dá)式,這個(gè)子表達(dá)式后續(xù)可以在REGEX REPLACE操作中以\n的方式引用。 它也會(huì)被所有正則表達(dá)式相關(guān)的命令所保存;包括,比如,如果用到if( MATCHES )命令的話,這些匹配的值被保存在變量CMAKE_MATCH_(0..9)中。CMD#75:?target_link_libraries??將給定的庫(kù)鏈接到一個(gè)目標(biāo)上。
target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)為給定的目標(biāo)設(shè)置連接時(shí)使用的庫(kù)或者標(biāo)志(flags)。如果一個(gè)庫(kù)名字與工程中的另外一個(gè)目標(biāo)相匹配,一個(gè)依賴關(guān)系會(huì)自動(dòng)添加到構(gòu)建系統(tǒng)中來(lái),這樣就可以在鏈接目標(biāo)之前,保證正在被鏈接的庫(kù)是最新的。以“-”開(kāi)始,但不是“-l”或“-framework”的那些項(xiàng),將會(huì)被當(dāng)作鏈接器標(biāo)志來(lái)處理。
關(guān)鍵字“debug”,“optimized”或者“general” 表示緊隨關(guān)鍵字之后的庫(kù)僅僅會(huì)被用到相應(yīng)的構(gòu)建配置上。“debug”關(guān)鍵字對(duì)應(yīng)于調(diào)試配置(或者,如果全局屬性DEBUG_CONFIGURATIONS被設(shè)置的話,就是DEBUG_CONFIGURATIONS中的名字所指定的配置)。“optimized”關(guān)鍵字對(duì)應(yīng)于所有其他的配置類型。“general”關(guān)鍵字對(duì)應(yīng)于所有的配置,并且純粹是可選的(它是默認(rèn)配置,可以省略)。通過(guò)創(chuàng)建并鏈接到導(dǎo)入庫(kù)目標(biāo),可以對(duì)每種配置規(guī)則進(jìn)行更細(xì)致的粒度控制。更多內(nèi)容參見(jiàn)add_library命令的IMPORTED模式。
默認(rèn)時(shí),庫(kù)之間的依賴性是可傳遞的。當(dāng)這個(gè)目標(biāo)被鏈接到其他目標(biāo)上時(shí),那么鏈接到這個(gè)目標(biāo)上的庫(kù)也會(huì)出現(xiàn)在其他目標(biāo)的鏈接依賴上。參見(jiàn)LINK_INTERFACE_LIBRARIES屬性的相關(guān)文檔,其中有關(guān)于如何覆蓋一個(gè)目標(biāo)的鏈接依賴性傳遞設(shè)置的介紹。
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES [[debug|optimized|general] <lib>] ...)對(duì)于LINK_INTERFACE_LIBRARIES模式,它將會(huì)把庫(kù)附加在LINK_INTERFACE_LIBRARIES以及LINK_INTERFACE_LIBRARIES在不同配置下的等價(jià)目標(biāo)屬性,而不是用這些庫(kù)去鏈接。指定為“debug”的庫(kù)將會(huì)被附加到LINK_INTERFACE_LIBRARIES_DEBUG屬性(或者是在DEBUG_CONFIGURATIONS全局屬性中列出的配置,如果DEBUG_CONFIGURATIONS被設(shè)置的話)。指定為“optimized”庫(kù)將會(huì)被附加到LINK_INTERFACE_LIBRARIES屬性上。指定為“general”的庫(kù)(或者沒(méi)有任何關(guān)鍵字的庫(kù)),將會(huì)被當(dāng)做即被指定為“debug”又被指定為“optimized”對(duì)待。
庫(kù)之間的依賴圖通常是非循環(huán)圖(DAG),但是如果出現(xiàn)互相依賴的靜態(tài)庫(kù),CMake會(huì)允許依賴圖中包含循環(huán)依賴(強(qiáng)連通分支)。當(dāng)其它目標(biāo)鏈接到這些庫(kù)中的一個(gè)時(shí),CMake會(huì)重復(fù)整個(gè)連通分支。例如,代碼:
| 1 2 3 4 5 6 | add_library(A STATIC a.c) add_library(B STATIC b.c) target_link_libraries(A B) target_link_libraries(B A) add_executable(main main.c) target_link_libraries(main A) |
將“main”鏈接到了“A B A B”。(雖然通常一次重復(fù)就足夠了,但是病態(tài)對(duì)象文件以及符號(hào)排布可能需要多次重復(fù)。你可以通過(guò)在上一次target_link_libraries調(diào)用中手動(dòng)重復(fù)該分支來(lái)處理這種情況。不過(guò),如果兩個(gè)歸檔文件確實(shí)是如此緊密的相互關(guān)聯(lián),它們可能會(huì)被合并為一個(gè)單一的歸檔文件。)?
CMD#76:?try_compile?嘗試編譯一些代碼。
try_compile(RESULT_VAR bindir srcdir projectName <targetname> [CMAKE_FLAGS <Flags>] [OUTPUT_VARIABLE var])嘗試編譯一個(gè)程序。在這種格式時(shí),srcdir路徑下應(yīng)該包含一個(gè)完整的CMake工程,包括CMakeLists.txt文件以及所有的源文件。在該命令運(yùn)行完之后,路徑bindir和srcdir不會(huì)被刪除。如果指定了<target name>,那么CMake將只構(gòu)建那個(gè)目標(biāo);否則,目標(biāo)all或ALL_BUILD將會(huì)被構(gòu)建。
try_compile(RESULT_VAR bindir srcfile[CMAKE_FLAGS <Flags>][COMPILE_DEFINITIONS <flags> ...][OUTPUT_VARIABLE var][COPY_FILE <filename> )嘗試編譯一個(gè)srcfile。在這種情況下,用戶僅僅需要提供源文件。CMake會(huì)創(chuàng)建合適的CMakeLists.txt文件來(lái)構(gòu)建源文件。如果使用了COPY_FILE選項(xiàng),編譯出的文件將會(huì)被拷貝到給定的文件那里。
在這個(gè)版本里,所有在bindir/CMakeFiles/CMakeTmp文件夾下的文件,將會(huì)被自動(dòng)清除;通過(guò)向CMake傳遞調(diào)試選項(xiàng)--debug-trycompile可以避免這個(gè)清除步驟。另外一些可以包含的額外標(biāo)志有:INCLUDE_DIRECTORIES, LINK_DIRECTORIES, 和LINK_LIBRARIES。COMPILE_DEFINITIONS是通過(guò)-Ddefinations選項(xiàng)設(shè)置的預(yù)定義符號(hào),這會(huì)傳遞到編譯器命令行。try_compile命令在構(gòu)建過(guò)程中伴隨創(chuàng)建出的CMakeLists.txt看起來(lái)像這樣:
add_definitions( <expanded COMPILE_DEFINITIONS from calling cmake>) include_directories(${INCLUDE_DIRECTORIES}) link_directories(${LINK_DIRECTORIES}) add_executable(cmTryCompileExec sources) target_link_libraries(cmTryCompileExec ${LINK_LIBRARIES})在該命令的這兩種版本里,如果指定了OUTPUT_VARIABLE,那么構(gòu)建過(guò)程的輸出會(huì)存儲(chǔ)到給定的變量里。編譯成功或失敗的結(jié)果,會(huì)通過(guò)RESULT_VAR返回。CMAKE_FLAGS可以用來(lái)向正在構(gòu)建的CMake傳遞-DVAR:TYPE = VALUE 符號(hào)。
CMD#77:?try_run??嘗試編譯并運(yùn)行某些代碼。
try_run(RUN_RESULT_VAR COMPILE_RESULT_VARbindir srcfile [CMAKE_FLAGS <Flags>][COMPILE_DEFINITIONS <flags>][COMPILE_OUTPUT_VARIABLE comp][RUN_OUTPUT_VARIABLE run][OUTPUT_VARIABLE var][ARGS <arg1> <arg2>...])嘗試編譯一個(gè)源文件srcfile。通過(guò)變量COMPILE_RESULT_VAR返回TRUE或者FALSE來(lái)反應(yīng)編譯是否失敗。如果構(gòu)建出了可執(zhí)行文件,但是不能運(yùn)行,那么RUN_RESULT_VAR會(huì)被設(shè)置為FAILED_TO_RUN。COMPILE_OUTPUT_VARIABLE變量指定了一個(gè)變量,這個(gè)變量存儲(chǔ)了構(gòu)建步驟輸出的信息。RUN_OUTPUT_VARIABLE指定了一個(gè)變量,這個(gè)變量存儲(chǔ)了運(yùn)行可執(zhí)行文件時(shí)的輸出。出于兼容性的考慮,OUTPUT_VARIABLE還會(huì)被支持,它包含了包含編譯和運(yùn)行階段的輸出信息。
交叉編譯相關(guān)問(wèn)題
當(dāng)運(yùn)行交叉編譯時(shí),第一步中編譯出的可執(zhí)行文件通常不能在編譯宿主機(jī)上直接運(yùn)行。try_run()函數(shù)會(huì)檢查CMAKE_CROSSCOMPILING變量來(lái)檢測(cè)CMake是否是交叉編譯模式。如果是的話,CMake還是會(huì)嘗試編譯可執(zhí)行文件,但是它不會(huì)嘗試運(yùn)行可執(zhí)行文件。相反,他會(huì)創(chuàng)建一些cache變量,這些變量必須由用戶填充,或者在某個(gè)CMake腳本中預(yù)先設(shè)置為那些在真實(shí)目標(biāo)機(jī)平臺(tái)上執(zhí)行的結(jié)果。這些變量有:RUN_RESULT_VAR (解釋參見(jiàn)上文),以及如果使用了RUN_OUTPUT_VARIABLE (或者OUTPUT_VARIABLE) ,還有一個(gè)附加的cache變量RUN_RESULT_VAR__COMPILE_RESULT_VAR__TRYRUN_OUTPUT。該變量是為了保存執(zhí)行過(guò)程中stdout和stderr的輸出。
為了讓交叉編譯更加容易些,必要時(shí)再使用try_run命令。如果你使用了try_run命令,那么只有必要時(shí)才使用RUN_OUTPUT_VARIABLE(或者OUTPUT_VARIABLE)變量。在交叉編譯時(shí),使用這些變量需要cache變量必須被手動(dòng)設(shè)置為可執(zhí)行文件的輸出。你也可以用if(CMAKE_CROSSCOMPILING)將try_run的調(diào)用“保護(hù)”起來(lái),同時(shí)還要為這種情形給定一個(gè)易于預(yù)先設(shè)置的備選方案。
CMD#78?unset??撤銷對(duì)一個(gè)變量,cache變量或者環(huán)境變量的設(shè)置。
unset(<variable> [CACHE])刪除一個(gè)指定的變量,讓它變成未定義的。如果指定了CACHE選項(xiàng),那么這個(gè)變量將會(huì)從cache中刪除而不是當(dāng)前作用域。<variable>可以是一個(gè)環(huán)境變量,比如:
unset(ENV{LD_LIBRARY_PATH})在這個(gè)例子中,這個(gè)變量將會(huì)從當(dāng)前的環(huán)境中被刪除。
CMD#79 : variable_watch??監(jiān)視CMake變量的改變。
variable_watch(<variable name> [<command to execute>])如果給定的變量發(fā)生了變化,關(guān)于正在被改寫(xiě)的變臉的消息會(huì)被打印出來(lái)。如果指定了command選項(xiàng),這條命令會(huì)被執(zhí)行。這條命令會(huì)接受這樣的參數(shù):COMMAND(<variable> <access> <value> <current list file> <stack>)
CMD#80:?while? 當(dāng)條件為真時(shí),評(píng)估(執(zhí)行)一組命令。
while(condition)COMMAND1(ARGS ...)COMMAND2(ARGS ...)...endwhile(condition)所有在while和與之配對(duì)的endwhile之間的命令將會(huì)被記錄,但并不會(huì)執(zhí)行。只有當(dāng)endwhile被評(píng)估,并且條件為真時(shí),這個(gè)命令列表的記錄才會(huì)被調(diào)用。條件值的評(píng)估與if命令使用相同的邏輯。
總結(jié)
以上是生活随笔為你收集整理的CMake 手册详解(二十二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 招行白金卡/无限卡怎么申请?申请条件是什
- 下一篇: Boost智能指针——scoped_pt