cmake-policies(7)¶
簡介¶
CMake 政策在保留現有專案版本的相容性的同時,引入行為變更。政策是棄用機制,而不是功能切換。每項政策都記錄了已棄用的 OLD
行為和首選的 NEW
行為。專案必須隨著時間推移進行更新以使用 NEW
行為,但其現有版本將繼續使用 OLD
行為。
更新專案¶
當 CMake 版本新引入政策時,該版本及更高版本會立即棄用其 OLD
行為。專案應盡快更新以使用政策的 NEW
行為。
使用 cmake_minimum_required()
命令來記錄專案已更新的最新 CMake 版本。例如
cmake_minimum_required(VERSION 3.10...3.31)
這使用 <min>...<max>
語法來啟用 CMake 3.31 及更早版本中引入的政策的 NEW
行為,同時僅需要最低 CMake 3.10 版本。專案預計可以使用這些版本之間引入的政策的 OLD
和 NEW
行為。
轉換排程¶
為了幫助專案按照自己的排程移植到政策的 NEW
行為,CMake 提供了一個轉換期
如果專案未設定政策,CMake 會使用其
OLD
行為,但可能會警告尚未設定政策。執行 CMake 的使用者可以透過在
cmake(1)
命令列上將CMAKE_POLICY_DEFAULT_CMP<NNNN>
變數設定為快取條目來消除警告,而無需修改專案cmake -DCMAKE_POLICY_DEFAULT_CMP0990=OLD ...
專案可以透過使用
cmake_policy()
命令將政策明確設定為OLD
或NEW
行為來消除警告if(POLICY CMP0990) cmake_policy(SET CMP0990 NEW) endif()
注意
政策幾乎永遠不應設定為
OLD
,除非是為了消除在其他方面已凍結或穩定的程式碼庫中的警告,或暫時作為較大遷移路徑的一部分。
如果專案將政策設定為
OLD
,則在引入政策的版本之後至少 2 年發布的 CMake 版本可能會發出警告,指出該政策的OLD
行為將從未來版本的 CMake 中移除。如果專案未將政策設定為
NEW
,則在引入政策的版本之後至少 6 年發布,且主要版本號較高的 CMake 版本可能會發出錯誤,指出該政策的OLD
行為已移除。
支援的政策¶
以下政策受到支援。
CMake 4.0 導入的政策¶
CMake 3.31 導入的政策¶
- CMP0180:project() 始終將 <PROJECT-NAME>_* 設定為一般變數。
- CMP0179:連結行上靜態程式庫的重複資料刪除保留第一個出現的項目。
- CMP0178:測試命令列保留空白引數。
- CMP0177:install() DESTINATION 路徑已正規化。
- CMP0176:execute_process() ENCODING 預設為 UTF-8。
- CMP0175:add_custom_command() 拒絕無效的引數。
- CMP0174:cmake_parse_arguments(PARSE_ARGV) 為單值關鍵字後的空字串定義變數。
- CMP0173:CMakeFindFrameworks 模組已移除。
- CMP0172:CPack 模組在 CPack WIX 產生器中預設啟用每機器安裝。
- CMP0171:'codegen' 是保留的目標名稱。
CMake 3.30 導入的政策¶
- CMP0170:強制執行 FETCHCONTENT_FULLY_DISCONNECTED 需求。
- CMP0169:FetchContent_Populate(depName) 單一引數簽章已棄用。
- CMP0168:FetchContent 直接透過步驟而不是透過子建置實作步驟。
- CMP0167:FindBoost 模組已移除。
- CMP0166:TARGET_PROPERTY 遞移地評估靜態程式庫的私有相依性的連結屬性。
- CMP0165:enable_language() 不得在 project() 之前呼叫。
- CMP0164:當平台不支援時,add_library() 拒絕 SHARED 程式庫。
- CMP0163:GENERATED 原始檔屬性現在在所有目錄中都可見。
- CMP0162:Visual Studio 產生器預設新增 UseDebugLibraries 指示器。
CMake 3.29 導入的政策¶
CMake 3.28 導入的政策¶
CMake 3.27 導入的政策¶
- CMP0151:AUTOMOC 包含目錄預設為系統包含目錄。
- CMP0150:ExternalProject_Add 和 FetchContent_Declare 將相對 git 儲存庫路徑視為相對於父專案的遠端。
- CMP0149:Visual Studio 產生器預設選取最新的 Windows SDK。
- CMP0148:FindPythonInterp 和 FindPythonLibs 模組已移除。
- CMP0147:Visual Studio 產生器平行建置自訂命令。
- CMP0146:FindCUDA 模組已移除。
- CMP0145:Dart 和 FindDart 模組已移除。
- CMP0144:find_package 使用大寫的 PACKAGENAME_ROOT 變數。
CMake 3.26 導入的政策¶
CMake 3.25 導入的政策¶
CMake 3.24 導入的政策¶
- CMP0139:if() 命令支援使用 PATH_EQUAL 運算子的路徑比較。
- CMP0138:CheckIPOSupported 使用呼叫專案中的旗標。
- CMP0137:try_compile() 在專案模式中傳遞平台變數。
- CMP0136:Watcom 執行階段程式庫旗標由抽象化選取。
- CMP0135:ExternalProject 和 FetchContent 預設會針對 URL 下載方法忽略封存檔中的時間戳記。
- CMP0134:當 "TARGET" 檢視無法使用時,回退到 "HOST" Windows 登錄檢視。
- CMP0133:CPack 模組在 CPack DragNDrop 產生器中預設停用 SLA。
- CMP0132:請勿在第一次執行時設定編譯器環境變數。
- CMP0131:LINK_LIBRARIES 支援 LINK_ONLY 產生器運算式。
- CMP0130:while() 診斷條件評估錯誤。
CMake 3.23 導入的政策¶
CMake 3.22 導入的政策¶
CMake 3.21 導入的政策¶
CMake 3.20 導入的政策¶
CMake 3.19 導入的政策¶
CMake 3.18 導入的政策¶
CMake 3.17 導入的政策¶
CMake 3.16 導入的政策¶
CMake 3.15 導入的政策¶
CMake 3.14 導入的政策¶
CMake 3.13 導入的政策¶
CMake 3.12 導入的政策¶
CMake 3.11 導入的政策¶
CMake 3.10 導入的政策¶
CMake 3.9 導入的政策¶
CMake 3.8 導入的政策¶
CMake 3.7 導入的政策¶
不支援的政策¶
以下政策不再受到支援。專案對 cmake_minimum_required(VERSION)
或 cmake_policy(VERSION)
的呼叫必須將它們設定為 NEW
。它們的 OLD
行為已從 CMake 中移除。
CMake 3.4 導入的政策,CMake 4.0 移除¶
CMake 3.3 導入的政策,CMake 4.0 移除¶
CMake 3.2 導入的政策,CMake 4.0 移除¶
CMake 3.1 導入的政策,CMake 4.0 移除¶
CMake 3.0 導入的政策,CMake 4.0 移除¶
- CMP0050:不允許 add_custom_command SOURCE 簽章。
- CMP0049:請勿展開目標來源條目中的變數。
- CMP0048:project() 命令管理 VERSION 變數。
- CMP0047:針對 QNX 上的 qcc 驅動程式使用 QCC 編譯器 ID。
- CMP0046:add_dependencies 中不存在的相依性時發生錯誤。
- CMP0045:get_target_property 中不存在的目標時發生錯誤。
- CMP0044:區分大小寫的 Lang_COMPILER_ID 產生器運算式。
- CMP0043:忽略 COMPILE_DEFINITIONS_Config 屬性。
- CMP0042:預設啟用 MACOSX_RPATH。
- CMP0041:具有產生器運算式的相對包含時發生錯誤。
- CMP0040:add_custom_command() 的 TARGET 簽章中的目標必須存在。
- CMP0039:公用程式目標可能沒有連結相依性。
- CMP0038:目標可能無法直接連結到自身。
- CMP0037:目標名稱不應保留,且應符合有效性模式。
- CMP0036:不應呼叫 build_name 命令。
- CMP0035:不應呼叫 variable_requires 命令。
- CMP0034:不應呼叫 utility_source 命令。
- CMP0033:不應呼叫 export_library_dependencies 命令。
- CMP0032:不應呼叫 output_required_files 命令。
- CMP0031:不應呼叫 load_command 命令。
- CMP0030:不應呼叫 use_mangled_mesa 命令。
- CMP0029:不應呼叫 subdir_depends 命令。
- CMP0028:目標名稱中的雙冒號表示 ALIAS 或 IMPORTED 目標。
- CMP0027:有條件地連結具有遺失包含目錄的匯入目標。
- CMP0026:不允許使用 LOCATION 目標屬性。
- CMP0025:Apple Clang 的編譯器 ID 現在是 AppleClang。
- CMP0024:不允許包含匯出結果。
CMake 2.8 導入的政策,CMake 4.0 移除¶
- CMP0023:Plain 和關鍵字 target_link_libraries 簽章無法混合使用。
- CMP0022:INTERFACE_LINK_LIBRARIES 定義連結介面。
- CMP0021:INCLUDE_DIRECTORIES 目標屬性中的相對路徑時發生嚴重錯誤。
- CMP0020:在 Windows 上自動將 Qt 可執行檔連結到 qtmain 目標。
- CMP0019:請勿重新展開包含和連結資訊中的變數。
- CMP0018:忽略 CMAKE_SHARED_LIBRARY_Lang_FLAGS 變數。
- CMP0017:從 CMake 模組目錄包含時,偏好來自該目錄的檔案。
- CMP0016:如果 target_link_libraries() 的唯一引數不是目標,則報告錯誤。
- CMP0015:link_directories() 將路徑視為相對於來源目錄。
- CMP0014:輸入目錄必須具有 CMakeLists.txt。
- CMP0013:不允許重複的二進位目錄。
- CMP0012:if() 辨識數字和布林常數。
CMake 2.6 導入的政策,CMake 4.0 移除¶
- CMP0011:包含的腳本執行自動 cmake_policy PUSH 和 POP。
- CMP0010:錯誤的變數參考語法是錯誤。
- CMP0009:FILE GLOB_RECURSE 呼叫預設不應遵循符號連結。
- CMP0008:依完整路徑連結的程式庫必須具有有效的程式庫檔案名稱。
- CMP0007:list 命令不再忽略空白元素。
- CMP0006:安裝 MACOSX_BUNDLE 目標需要 BUNDLE DESTINATION。
- CMP0005:預處理器定義值現在會自動逸出。
- CMP0004:連結的程式庫可能沒有前導或尾隨空白。
- CMP0003:透過完整路徑連結的程式庫不再產生連結器搜尋路徑。
- CMP0002:邏輯目標名稱必須是全域唯一的。
- CMP0001:不應再使用 CMAKE_BACKWARDS_COMPATIBILITY。
- CMP0000:必須指定最低要求的 CMake 版本。