CMP0168¶
在 3.30 版本新增。
FetchContent
模組直接實現步驟,而非透過子建置。
CMake 3.29 及更早版本將 FetchContent 實作為獨立的子建置。這需要設定該獨立專案並使用建置工具。對於某些產生器和作業系統,這種方法可能非常緩慢。CMake 3.30 及更高版本傾向於將下載、更新和修補步驟直接作為主專案的一部分來實作。
NEW
行為具有以下特性
不使用子建置。所有操作都直接從主專案的 CMake 設定步驟實作。在 CMake 腳本模式下執行時,不需要有可用的建置工具。
不支援
$(SOMEVAR)
形式的產生器表達式和 GNU Make 變數。它們不應在任何給FetchContent_Declare()
或FetchContent_Populate()
的引數中使用。所有
LOG_...
和USES_TERMINAL_...
選項、QUIET
選項和FETCHCONTENT_QUIET
變數都會被忽略。FetchContent
的輸出始終是主專案設定輸出的一部分。這也表示它現在會遵守訊息記錄層級(請參閱CMAKE_MESSAGE_LOG_LEVEL
和--log-level
)。預設訊息記錄層級應與使用OLD
政策設定的QUIET
相當,但現在會顯示警告。PREFIX
、TMP_DIR
、STAMP_DIR
、LOG_DIR
和DOWNLOAD_DIR
選項及其相關的目錄屬性都會被忽略。FetchContent
模組會在內部控制這些位置。cmake --fresh
將會移除用於追蹤和填入依賴項的戳記和腳本檔案。這將強制重新執行依賴項的下載、更新和修補步驟。用於下載的目錄不受cmake --fresh
的影響,因此URL
下載方法先前下載的任何檔案仍然可以重複使用。
OLD
行為具有以下特性
始終使用子建置來實作下載、更新和修補步驟。即使在 CMake 腳本模式下使用
FetchContent_Populate()
,也必須有可用的建置工具。可以使用
$(SOMEVAR)
形式的產生器表達式和 GNU Make 變數,但這種使用方式幾乎總是不恰當。它們會在子建置中評估,因此它們看不到來自主建置的任何資訊。支援所有與下載、更新或修補步驟相關的記錄、終端控制和目錄選項。
如果使用
QUIET
選項,或將FETCHCONTENT_QUIET
變數設定為 true,則不會在輸出中顯示警告。cmake --fresh
對依賴項的戳記或腳本檔案沒有任何影響。只有在依賴項的詳細資訊發生變更時,才會重新執行先前執行的步驟。
使用者有相當高的機率可以將 CMAKE_POLICY_DEFAULT_CMP0168
變數設定為 NEW
,以便在等待專案及其依賴項更新以預設使用 NEW
政策設定時,全域切換為 NEW
行為。專案通常不會使用 NEW
行為不再支援的功能,即使那些專案會使用,當忽略這些選項時,通常仍然可以正常運作。在全域設定此行為之前,請檢查是否有任何 FetchContent_Declare()
或 FetchContent_Populate()
呼叫以會變更可觀察行為的方式使用了被忽略的選項,而不是將暫存或內部產生的檔案放在不同的位置。
此政策在 CMake 3.30 版本中引入。可以使用 cmake_policy()
或 cmake_minimum_required()
進行設定。如果未設定,CMake 不會發出警告,並使用 OLD
行為。
注意
政策的 OLD
行為根據定義已棄用
,並可能會在未來版本的 CMake 中移除。