CMD#6:add_library
使用指定的源文件向工程中添加一個庫。
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
添加一個名為<name>的庫文件,該庫文件將會根據調用的命令里列出的源文件來創建。<name>對應於邏輯目標名稱,而且在一個工程的全局域內必須是唯一的。待構建的庫文件的實際文件名根據對應平台的命名約定來構造(比如lib<name>.a或者<name>.lib)。指定STATIC,SHARED,或者MODULE參數用來指定要創建的庫的類型。STATIC庫是目標文件的歸檔文件,在鏈接其它目標的時候使用。SHARED庫會被動態鏈接,在運行時被加載。MODULE庫是不會被鏈接到其它目標中的插件,但是可能會在運行時使用dlopen-系列的函數動態鏈接。如果沒有類型被顯式指定,這個選項將會根據變量BUILD_SHARED_LIBS的當前值是否為真決定是STATIC還是SHARED。
默認狀態下,庫文件將會在於源文件目錄樹的構建目錄樹的位置被創建,該命令也會在這里被調用。查閱ARCHIVE_OUTPUT_DIRECTORY,LIBRARY_OUTPUT_DIRECTORY,和RUNTIME_OUTPUT_DIRECTORY這三個目標屬性的文檔來改變這一位置。查閱OUTPUT_NAME目標屬性的文檔來改變最終文件名的<name>部分。
如果指定了EXCLUDE_FROM_ALL屬性,對應的一些屬性會在目標被創建時被設置。查閱EXCLUDE_FROM_ALL的文檔來獲取該屬性的細節。
使用下述格式,add_library命令也可以用來創建導入的庫目標:
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED)
導入的庫目標是引用了在工程外的一個庫文件的目標。沒有生成構建這個庫的規則。這個目標名字的作用域在它被創建的路徑及以下有效。他可以向任何在該工程內構建的目標一樣被引用。導入庫為類似於target_link_libraries命令中引用它提供了便利。關於導入庫細節可以通過指定那些以IMPORTED_的屬性設置來指定。其中最重要的屬性是IMPORTED_LOCATION(以及它的具體配置版本,IMPORTED_LOCATION_<CONFIG>),它指定了主庫文件在磁盤上的位置。查閱IMPORTED_*屬性的文檔獲取更多的信息。
CMD#7:add_subdirectory
為構建添加一個子路徑。
add_subdirectory(source_dir [binary_dir]
[EXCLUDE_FROM_ALL])
這條命令的作用是為構建添加一個子路徑。source_dir選項指定了CMakeLists.txt源文件和代碼文件的位置。如果source_dir是一個相對路徑,那么source_dir選項會被解釋為相對於當前的目錄,但是它也可以是一個絕對路徑。binary_dir選項指定了輸出文件的路徑。如果binary_dir是相對路徑,它將會被解釋為相對於當前輸出路徑,但是它也可以是一個絕對路徑。如果沒有指定binary_dir,binary_dir的值將會是沒有做任何相對路徑展開的source_dir,這也是通常的用法。在source_dir指定路徑下的CMakeLists.txt將會在當前輸入文件的處理過程執行到該命令之前,立即被CMake處理。
如果指定了EXCLUDE_FROM_ALL選項,在子路徑下的目標默認不會被包含到父路徑的ALL目標里,並且也會被排除在IDE工程文件之外。用戶必須顯式構建在子路徑下的目標,比如一些示范性的例子工程就是這樣。典型地,子路徑應該包含它自己的project()命令調用,這樣會在子路徑下產生一份完整的構建系統(比如VS IDE的solution文件)。注意,目標間的依賴性要高於這種排除行為。如果一個被父工程構建的目標依賴於在這個子路徑下的目標,被依賴的目標會被包含到父工程的構建系統中,以滿足依賴性的要求。
以指定的參數為工程添加一個測試。CMD#8:
add_test
add_test(testname Exename arg1 arg2 ... )
如果已經運行過了ENABLE_TESTING命令,這個命令將為當前路徑添加一個測試目標。如果ENABLE_TESTING還沒有運行過,該命令啥事都不做。測試是由測試子系統運行的,它會以指定的參數執行Exename文件。Exename或者是由該工程構建的可執行文件,也可以是系統上自帶的任意可執行文件(比如tclsh)。該測試會在CMakeList.txt文件的當前工作路徑下運行,這個路徑與二進制樹上的路相對應。
add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
COMMAND <command> [arg1 [arg2 ...]])
如果COMMAND選項指定了一個可執行目標(用add_executable創建),它會自動被在構建時創建的可執行文件所替換。如果指定了CONFIGURATIONS選項,那么該測試只有在列出的某一個配置下才會運行。
在COMMAND選項后的參數可以使用“生成器表達式”,它的語法是"$<...>"。這些表達式會在構建系統生成期間,以及構建配置的專有信息的產生期間被評估。合法的表達式是:
$<CONFIGURATION> = 配置名稱
$<TARGET_FILE:tgt> = 主要的二進制文件(.exe, .so.1.2, .a)
$<TARGET_LINKER_FILE:tgt> = 用於鏈接的文件(.a, .lib, .so)
$<TARGET_SONAME_FILE:tgt> = 帶有.so.的文件(.so.3)
其中,"tgt"是目標的名稱。目標文件表達式TARGET_FILE生成了一個完整的路徑,但是它的_DIR和_NAME版本可以生成目錄以及文件名部分:
$<TARGET_FILE_DIR:tgt>/$<TARGET_FILE_NAME:tgt>
$<TARGET_LINKER_FILE_DIR:tgt>/$<TARGET_LINKER_FILE_NAME:tgt>
$<TARGET_SONAME_FILE_DIR:tgt>/$<TARGET_SONAME_FILE_NAME:tgt>
用例:
1 add_test(NAME mytest 2 COMMAND testDriver --config $<CONFIGURATION>
3 --exe $<TARGET_FILE:myexe>)
這段代碼創建了一個名為mytest的測試,它執行的命令是testDriver工具,傳遞的參數包括配置名,以及由目標生成的可執行文件myexe的完整路徑。
CMD#9:aux_source_directory
查找在某個路徑下的所有源文件。
aux_source_directory(<dir> <variable>)
搜集所有在指定路徑下的源文件的文件名,將輸出結果列表儲存在指定的<variable>變量中。該命令主要用在那些使用顯式模板實例化的工程上。模板實例化文件可以存儲在Templates子目錄下,然后可以使用這條命令自動收集起來;這樣可以避免手工羅列所有的實例。
使用該命令來避免為一個庫或可執行目標寫源文件的清單,是非常具有吸引力的。但是如果該命令貌似可以發揮作用,那么CMake就不需要生成一個感知新的源文件何時被加進來的構建系統了(也就是說,新文件的加入,並不會導致CMakeLists.txt過時,從而不能引起CMake重新運行。——譯注)。正常情況下,生成的構建系統能夠感知它何時需要重新運行CMake,因為需要修改CMakeLists.txt來引入一個新的源文件。當源文件僅僅是加到了該路徑下,但是沒有修改這個CMakeLists.txt文件,使用者只能手動重新運行CMake來產生一個包含這個新文件的構建系統。
CMD#10:break
從一個包圍該命令的foreach或while循環中跳出。
break()
從包圍它的foreach循環或while循環中跳出。