CMD#2: add_custom_target
添加一個目標,它沒有輸出;這樣它就總是會被構建。
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM]
[SOURCES src1 [src2...]])
用Name選項給定的名字添加一個目標,這個目標會引發給定的那些命令。這個目標沒有輸出文件,並且總是被認為是過時的,即使那些命令試圖去創建一個與該目標同名的文件。使用ADD_CUSTOM_COMMAND命令可以生成一個帶有依賴性的文件。默認情況下,沒有目標會依賴於自定義目標。使用ADD_DEPENDENCIES命令可以添加依賴於該目標或者被該目標依賴的目標。如果指定了ALL選項,這表明這個目標應該被添加到默認的構建目標中,這樣它每次都會被構建(命令的名字不能是ALL)。命令和選項是可選的;如果它們沒有被指定,將會產生一個空目標。如果設定了WORKING_DIRECTORY參數,該命令會在它指定的路徑下執行。如果指定了COMMENT選項,后跟的參數將會在構件的時候,在命令執行之前,被顯示出來。DEPENDS選項后面列出來的依賴目標可以引用add_custom_command命令在相同路徑下(CMakeLists.txt)生成的輸出和文件。
如果指定了VERBATIM選項,所有傳遞到該命令的選項將會被合適地轉義;這樣,該命令調用的構建工具會接收到未經改變的參數。注意,CMake語言處理器會在add_custom_target命令在看到這些參數之前對它們進行一層轉義。推薦使用該參數,因為它保證了正確的行為。當未指定該參數時,轉義的行為依賴於平台,因為CMake沒有針對於特定工具中特殊字符的保護措施。
SOURCES選項指定了會被包含到自定義目標中的附加的源文件。指定的源文件將會被添加到IDE的工程文件中,方便在沒有構建規則的情況下能夠編輯。
CMD#3:add_definitions
為源文件的編譯添加由-D引入的define flag。
add_definitions(-DFOO -DBAR ...)
在編譯器的命令行上,為當前路徑以及下層路徑的源文件加入一些define flag。這個命令可以用來引入任何flag,但是它的原意是用來引入預處理器的定義。那些以-D或/D開頭的、看起來像預處理器定義的flag,會被自動加到當前路徑的COMPILE_DEFINITIONS屬性中。為了后向兼容,非簡單值(non-trival,指的是什么?——譯注)的定義會被留在flags組(flags set)里,而不會被轉換。關於在特定的域以及配置中增加預處理器的定義,參考路徑、目標以及源文件的COMPILE_DEFINITIONS屬性來獲取更多的細節。
CMD#4:add_dependencies
為頂層目標引入一個依賴關系。
add_dependencies(target-name depend-target1
depend-target2 ...)
讓一個頂層目標依賴於其他的頂層目標。一個頂層目標是由命令ADD_EXECUTABLE,ADD_LIBRARY,或者ADD_CUSTOM_TARGET產生的目標。為這些命令的輸出引入依賴性可以保證某個目標在其他的目標之前被構建。查看ADD_CUSTOM_TARGET和ADD_CUSTOM_COMMAND命令的DEPENDS選項,可以了解如何根據自定義規則引入文件級的依賴性。查看SET_SOURCE_FILES_PROPERTIES命令的OBJECT_DEPENDS選項,可以了解如何為目標文件引入文件級的依賴性。
CMD#5:add_executable
: 使用給定的源文件,為工程引入一個可執行文件。
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
引入一個名為<name>的可執行目標,該目標會由調用該命令時在源文件列表中指定的源文件來構建。<name>對應於邏輯目標名字,並且在工程范圍內必須是全局唯一的。被構建的可執行目標的實際文件名將根據具體的本地平台創建出來(比如<name>.exe或者僅僅是<name>)。
默認情況下,可執行文件將會在構建樹的路徑下被創建,對應於該命令被調用的源文件樹的路徑。如果要改變這個位置,查看RUNTIME_OUTPUT_DIRECTORY目標屬性的相關文檔。如果要改變最終文件名的<name>部分,查看OUTPUT_NAME目標屬性的相關文檔。
如果指定了MACOSX_BUNDLE選項,對應的屬性會附加在創建的目標上。查看MACOSX_BUNDLE目標屬性的文檔可以找到更多的細節。
如果指定了EXCLUDE_FROM_ALL選項,對應的屬性將會設置在被創建的目標上。查看EXCLUDE_FROM_ALL目標屬性的文檔可以找到更多的細節。
使用下述格式,add_executable命令也可以用來創建導入的(IMPORTED)可執行目標:
add_executable(<name> IMPORTED)
一個導入的可執行目標引用了一個位於工程之外的可執行文件。該格式不會生成構建這個目標的規則。該目標名字的作用域在它被創建的路徑以及底層路徑有效。它可以像在該工程內的其他任意目標一樣被引用。導入可執行文件為類似於add_custom_command之類的命令引用它提供了便利。
關於導入的可執行文件的細節可以通過設置以IMPORTED_開頭的屬性來指定。這類屬性中最重要的是IMPORTED_LOCATION(以及它對應於具體配置的版本IMPORTED_LOCATION_<CONFIG>);該屬性指定了執行文件主文件在磁盤上的位置。查看IMPORTED_*屬性的文檔來獲得更多信息。