cmake-policies(7)¶
簡介¶
CMake 中的政策用於在多個版本中保持向後相容的行為。當引入新政策時,較新的 CMake 版本將開始警告關於向後相容的行為。可以使用 cmake_policy()
命令明確請求 OLD 或向後相容的行為來停用警告。也可以請求 NEW
或非向後相容的政策行為,以避免警告。每個政策也可以使用 CMAKE_POLICY_DEFAULT_CMP<NNNN>
變數在命令列上明確設定為 NEW
或 OLD
行為。
政策是一種棄用機制,而不是可靠的功能切換。除了在其他方面凍結或穩定的程式碼庫中靜音警告,或暫時作為較大遷移路徑的一部分外,幾乎永遠不應將政策設定為 OLD
。每個政策的 OLD
行為都是不希望的,並且在未來的版本中將被錯誤條件取代。
如果使用太舊的 CMake 版本來建置專案,cmake_minimum_required()
命令不僅會回報錯誤。它還會將該 CMake 版本或更早版本中引入的所有政策設定為 NEW
行為。若要在不增加最低要求的 CMake 版本的情況下管理政策,可以使用 if(POLICY)
命令。
if(POLICY CMP0990)
cmake_policy(SET CMP0990 NEW)
endif()
這具有使用較新 CMake 版本中的 NEW
行為的效果,使用者可能會使用這些版本,而不會發出相容性警告。
在某些情況下,政策的設定被限制為不會傳播到父範圍。例如,如果 include()
命令或 find_package()
命令讀取的檔案包含 cmake_policy()
的使用,則該政策設定預設不會影響呼叫者。這兩個命令都接受可選的 NO_POLICY_SCOPE
關鍵字來控制此行為。
也可以使用 CMAKE_MINIMUM_REQUIRED_VERSION
變數來判斷是否回報使用已棄用的巨集或函式的錯誤。
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:當「目標」檢視無法使用時,回復為「主機」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 3.4 導入的策略¶
CMake 3.3 導入的策略¶
CMake 3.2 導入的策略¶
CMake 3.1 導入的策略¶
CMake 3.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 導入的策略¶
- CMP0023:純文字和關鍵字 target_link_libraries 簽名不能混合使用。
- CMP0022:INTERFACE_LINK_LIBRARIES 定義連結介面。
- CMP0021:在 INCLUDE_DIRECTORIES 目標屬性中使用相對路徑會發生嚴重錯誤。
- CMP0020:自動將 Qt 可執行檔連結至 Windows 上的 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 導入的策略¶
- 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 版本。