CMake 手冊詳解(五)

2021-07-09 08:48:28 字數 2783 閱讀 8751

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([win32] [macosx_bundle]

[exclude_from_all]

source1 source2 ... sourcen)

引入乙個名為的可執行目標,該目標會由呼叫該命令時在原始檔列表中指定的原始檔來構建。對應於邏輯目標名字,並且在工程範圍內必須是全域性唯一的。被構建的可執行目標的實際檔名將根據具體的本地平台建立出來(比如.exe或者僅僅是)。

預設情況下,可執行檔案將會在構建樹的路徑下被建立,對應於該命令被呼叫的原始檔樹的路徑。如果要改變這個位置,檢視runtime_output_directory目標屬性的相關文件。如果要改變最終檔名的部分,檢視output_name目標屬性的相關文件。

如果指定了macosx_bundle選項,對應的屬性會附加在建立的目標上。檢視macosx_bundle目標屬性的文件可以找到更多的細節。

如果指定了exclude_from_all選項,對應的屬性將會設定在被建立的目標上。檢視exclude_from_all目標屬性的文件可以找到更多的細節。

使用下述格式,add_executable命令也可以用來建立匯入的(imported)可執行目標:

add_executable(imported)

乙個匯入的可執行目標引用了乙個位於工程之外的可執行檔案。該格式不會生成構建這個目標的規則。該目標名字的作用域在它被建立的路徑以及底層路徑有效。它可以像在該工程內的其他任意目標一樣被引用。匯入可執行檔案為類似於add_custom_command之類的命令引用它提供了便利。

關於匯入的可執行檔案的細節可以通過設定以imported_開頭的屬性來指定。這類屬性中最重要的是imported_location(以及它對應於具體配置的版本imported_location_);該屬性指定了執行檔案主檔案在磁碟上的位置。檢視imported_*屬性的文件來獲得更多資訊。

CMake手冊詳解 (九)

cmd 17 else 開始乙個if語句塊的else部分。else expression 參見if命令。cmd 18 elseif 開始if 塊的 elseif 部分。elseif expression 參見if命令。cmd 19 enable language 支援某種語言 cxx c fortr...

CMake手冊詳解 (十二)

find library name1 path1 path2 這是該命令的簡寫版本,在大多數場合下都已經夠用了。它與命令find library name1 paths path1 path2 等價。find library name names name1 name2 hints path1 pa...

CMake 手冊詳解(二十)

cmd 51 list列表操作命令。使用length選項時,該命令會返回給定list的長度。使用get選項時,該命令返回list中所有被index索引的元素構成的list。使用find選項時,該命令將返回list中指定的元素的索引 若果未找到,返回 1。使用insert選項時,該命令將在list中指...