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 相當,但現在會顯示警告。

  • PREFIXTMP_DIRSTAMP_DIRLOG_DIRDOWNLOAD_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 中移除。