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