CMP0168

在版本 3.30 中新增。

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