CMake 3.30 發行說明¶
自 CMake 3.29 以來所做的變更包括以下內容。
新功能¶
預設集¶
cmake-presets(7)
檔案現在支援結構描述版本9
。include
欄位現在展開除了$env{}
和預設集特定巨集之外的所有巨集,即那些從預設集定義內欄位衍生的巨集。
基於檔案的 API¶
cmake-file-api(7)
"cmakeFiles" 版本 1 物件的version
欄位已更新至 1.1。它新增了globsDependent
欄位,以報告使用CONFIGURE_DEPENDS
的file(GLOB)
呼叫。
產生器¶
Visual Studio 產生器 現在將
UseDebugLibraries
指示器新增至.vcxproj
檔案,以表示哪些組態是偵錯組態。請參閱政策CMP0162
。
語言¶
編譯功能
功能現在實作了對cxx_std_26
和cuda_std_26
元功能的支援,以指示編譯器模式必須至少為 C++26。這些元功能最早在 CMake 3.25 中記錄,但尚未完全實作。
命令¶
add_library()
命令在不支援共享程式庫的平台上,現在會拒絕建立共享程式庫,而不是自動將它們轉換為靜態程式庫。請參閱政策CMP0164
。enable_language()
命令現在會在第一次project()
呼叫之前呼叫時失敗並出現錯誤。請參閱政策CMP0165
。file(DOWNLOAD)
和file(UPLOAD)
命令新增了TLS_VERSION <min>
選項,以指定連線到https://
URL 的最低 TLS 版本。
變數¶
新增了
CMAKE_<LANG>_STANDARD_LATEST
變數,以描述所選編譯器支援的最新<LANG>
語言標準。新增了
CMAKE_TLS_VERIFY
環境變數,作為現有CMAKE_TLS_VERIFY
變數的後備方案。它指定預設是否驗證https://
URL 的伺服器憑證。新增了
CMAKE_TLS_VERSION
變數和CMAKE_TLS_VERSION
環境變數,以指定file(DOWNLOAD)
和file(UPLOAD)
命令連線到https://
URL 的預設最低 TLS 版本。新增了
CMAKE_VS_USE_DEBUG_LIBRARIES
變數和對應的VS_USE_DEBUG_LIBRARIES
目標屬性,以明確控制.vcxproj
檔案中的UseDebugLibraries
指示器。
屬性¶
GENERATED
原始檔屬性現在在所有目錄中都可見。請參閱政策CMP0163
。政策CMP0118
的文件已修訂,以描述其實際效果。PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE
全域屬性可用於將CMAKE_PROJECT_TOP_LEVEL_INCLUDES
傳播到使用 完整專案簽章 的try_compile()
呼叫中。這主要旨在作為在這種try_compile()
呼叫中啟用依賴性提供者的方式。新增了
VS_FILTER_PROPS
目標屬性,以告知 Visual Studio 產生器 使用自訂 MSBuild 篩選器.props
檔案。
模組¶
ExternalProject
模組的ExternalProject_Add()
命令新增了TLS_VERSION <min>
選項,以及對CMAKE_TLS_VERSION
變數和CMAKE_TLS_VERSION
環境變數的支援,以指定連線到https://
URL 的最低 TLS 版本。FindBacktrace
模組現在提供匯入的目標。FindBLAS
和FindLAPACK
模組新增了對libblastrampoline
的支援。FindCUDAToolkit
模組現在為libnvfatbin
和libnvfatbin_static
(如果找到)提供目標。FindCUDAToolkit
模組現在即使在未啟用CUDA
語言的情況下,也會搜尋CMAKE_CUDA_COMPILER
變數和CUDACXX
環境變數。FindOpenMP
模組新增了OpenMP_RUNTIME_MSVC
選項,以控制與 MSVC 一起使用的 OpenMP 執行階段。FindPython
和FindPython3
模組新增了對自由執行緒 Python 版本的支援。在 Windows 上,
FindPython
、FindPython2
和FindPython3
模組現在為 Python 偵錯變體提供更好的支援新變數
Python_EXECUTABLE_DEBUG
Python_INTERPRETER
Python_DEBUG_POSTFIX
新目標
Python::InterpreterDebug
Python::InterpreterMultiConfig
python_add_library()
命令現在根據Python_DEBUG_POSTFIX
變數的值管理DEBUG_POSTFIX
目標屬性。
產生器表達式¶
新增了
<LANG>_COMPILER_FRONTEND_VARIANT
產生器表達式系列,以存取相關聯的CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT
變數的值。與
LINK_LIBRARY
產生器表達式一起使用的連結功能,透過指定CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES
或CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES
變數,獲得了擁有描述其行為的屬性的能力。新增了
QUOTE
產生器表達式,其評估結果為"
。TARGET_PROPERTY
產生器表達式學習評估由新的TRANSITIVE_COMPILE_PROPERTIES
和TRANSITIVE_LINK_PROPERTIES
目標屬性定義的 自訂遞移屬性。TARGET_PROPERTY
產生器表達式現在透過追蹤靜態程式庫的私有依賴性,正確地評估目標屬性INTERFACE_LINK_OPTIONS
、INTERFACE_LINK_DIRECTORIES
和INTERFACE_LINK_DEPENDS
。請參閱政策CMP0166
。
CTest¶
ctest_submit()
命令和ctest -T Submit
步驟新增了TLSVersion
和TLSVerify
選項,以控制與https://
URL 的協商。請參閱CTEST_TLS_VERSION
和CTEST_TLS_VERIFY
變數。
CPack¶
CPack Inno Setup 產生器
現在可在非 Windows 主機上使用。CPack NuGet 產生器
新增了CPACK_NUGET_PACKAGE_README
、CPACK_NUGET_PACKAGE_REPOSITORY_URL
、CPACK_NUGET_PACKAGE_REPOSITORY_TYPE
、CPACK_NUGET_PACKAGE_REPOSITORY_BRANCH
和CPACK_NUGET_PACKAGE_REPOSITORY_COMMIT
變數。CPack NuGet 產生器
現在可以為特定框架的依賴性產生依賴性群組。新增了CPACK_NUGET_PACKAGE_TFMS
變數,以指定應為其產生群組的目標框架 Moniker (TFM) 清單。CPack WIX 產生器
新增了對 WiX Toolset v4 的支援。請參閱CPACK_WIX_VERSION
變數。
已棄用和移除的功能¶
FindBoost
模組已由政策CMP0167
移除。將專案移植到上游 Boost 的BoostConfig.cmake
套件組態檔,find_package(Boost)
現在會搜尋該檔案。呼叫僅使用依賴性名稱的
FetchContent_Populate()
現在已棄用。專案應改為呼叫FetchContent_MakeAvailable()
。請參閱政策CMP0169
。使用完整填充詳細資訊而不是僅使用依賴性名稱呼叫FetchContent_Populate()
仍然完全受支援。Visual Studio 9 2008
產生器已移除。
其他變更¶
ctest(1)
現在會拒絕帶有錯誤的未知命令列引數。以前它們會被靜默忽略。在 cmake.org 上提供的預先編譯 Windows
.msi
安裝程式在執行全新安裝時,現在預設會修改系統範圍的PATH
。當取代現有的 3.30 或更高版本安裝時,預設會保留PATH
修改偏好設定。在 cmake.org 上提供的官方
.zip
原始碼封存現在使用 LF 換行符號,而不是 CRLF 換行符號,以與現代慣例保持一致。在 "Configuring done" 和 "Generating done" 訊息後列印的持續時間現在反映了在產生器特定步驟中花費的時間,以及在產生開始時未先前捕獲的程式碼模型評估步驟中花費的時間。列印的持續時間可能看起來比以前版本的 CMake 更長,但更準確。
FetchContent
現在傾向於直接填充內容,而不是使用單獨的子建置。這可能會顯著改善某些系統上的組態時間(尤其是 Windows,但在使用 Xcode 產生器時在 macOS 上也是如此)。cmake --fresh
也會強制重新執行直接填充依賴性的下載、更新和修補步驟。政策CMP0168
為仍然依賴使用子建置來填充內容的專案提供向後相容性。當
FETCHCONTENT_FULLY_DISCONNECTED
設定為 true 時,FetchContent_MakeAvailable()
和FetchContent_Populate()
的單一引數形式要求依賴性的原始碼目錄已填充。CMake 3.29 及更早版本未檢查此要求,但現在強制執行,但須遵守政策CMP0170
。
更新¶
自 CMake 3.30.0 以來所做的變更包括以下內容。
3.30.1, 3.30.2¶
這些版本未對已記錄的功能或介面進行任何變更。進行了一些實作更新以支援生態系統變更和/或修復回歸。
3.30.3¶
project(<PROJECT-NAME>)
命令現在將<PROJECT-NAME>_SOURCE_DIR
、<PROJECT-NAME>_BINARY_DIR
和<PROJECT-NAME>_IS_TOP_LEVEL
設定為一般變數,以及將它們設定為快取條目。這是為了在政策CMP0169
的 NEW 行為下,保留對某些FetchContent
用例的支援。現在,
FindPython
和FindPython3
模組分別定義了 Windows 上的Python_DEFINITIONS
和Python3_DEFINITIONS
變數,以支援使用 Python 的自由執行緒版本進行開發。INTERFACE_COMPILE_DEFINITIONS
目標屬性也為這些模組提供的各種目標定義。
3.30.4¶
現在,
project(<PROJECT-NAME>)
命令僅在project()
被調用時,如果<PROJECT-NAME>_SOURCE_DIR
、<PROJECT-NAME>_BINARY_DIR
和<PROJECT-NAME>_IS_TOP_LEVEL
已經設定為快取或非快取變數,才會將它們設定為普通變數。與之前一樣,同名的快取條目始終會被設定。此舉改進了 3.30.3 的行為變更,以恢復呼叫具有相同專案名稱的project()
的巢狀目錄的行為,但此版本中的實作存在缺陷(此版本說明已追溯更新)。它可能會導致首次執行和後續執行之間出現不同的行為。如果您的專案包含使用相同專案名稱巢狀呼叫project()
,並且您使用這些變數,請勿使用 CMake 3.30.4。
3.30.5¶
現在,
project(<PROJECT-NAME>)
命令僅在project()
被調用時,如果<PROJECT-NAME>_SOURCE_DIR
、<PROJECT-NAME>_BINARY_DIR
和<PROJECT-NAME>_IS_TOP_LEVEL
已經設定為非快取變數,才會將它們設定為非快取變數。與之前一樣,同名的快取條目始終會被設定。此舉改進了 3.30.3 的行為變更,以恢復呼叫具有相同專案名稱的project()
的巢狀目錄的行為,並解決了 3.30.4 中引入的實作錯誤。
3.30.6, 3.30.7, 3.30.8¶
這些版本未對已記錄的功能或介面進行任何變更。進行了一些實作更新以支援生態系統變更和/或修復回歸。