CMake 3.16 發行說明¶
自 CMake 3.15 以來所做的變更包括以下內容。
新功能¶
語言¶
CMake 學會支援 Objective C (
OBJC
) 和 Objective C++ (OBJCXX
) 語言。它們可以透過project()
和enable_language()
命令啟用。當啟用OBJC
或OBJCXX
時,副檔名為.m
或.mm
的原始檔將分別編譯為 Objective C 或 C++。否則,它們將像以前一樣被視為純 C++ 原始碼。
編譯器¶
現在
Clang
編譯器在Solaris
上受到支援。
平台¶
在 AIX 上,使用
ENABLE_EXPORTS
目標屬性的可執行檔現在除了可執行檔之外,還會產生一個副檔名為.imp
的連結器匯入檔。外掛程式(透過使用MODULE
選項的add_library()
建立)使用target_link_libraries()
連結到可執行檔以取得其符號,現在使用匯入檔進行連結。install(TARGETS)
命令現在將匯入檔安裝為ARCHIVE
成品。在 AIX 上,預設情況下不再啟用執行階段連結。CMake 為連結器提供足夠的資訊,以預先解析所有符號。可以透過將
-Wl,-G
新增至其連結旗標(例如在CMAKE_SHARED_LINKER_FLAGS
或CMAKE_MODULE_LINKER_FLAGS
變數中)來手動啟用共用程式庫和/或可載入模組的執行階段連結。可以透過將-Wl,-brtl
新增至其連結旗標(例如在CMAKE_EXE_LINKER_FLAGS
變數中)來手動啟用可執行檔的執行階段連結。
命令列¶
命令¶
add_test()
命令學習了COMMAND_EXPAND_LISTS
選項,該選項會導致COMMAND
參數中的列表展開,包括由產生器運算式建立的列表。file()
命令學習了一個新的子命令GET_RUNTIME_DEPENDENCIES
,它允許您遞迴取得可執行檔或程式庫連結的程式庫列表。此子命令旨在取代GetPrerequisites
。find_file()
、find_library()
、find_path()
、find_package()
和find_program()
命令已學會檢查以下變數,以控制搜尋位置群組的預設行為CMAKE_FIND_USE_PACKAGE_ROOT_PATH
- 控制搜尋<PackageName>_ROOT
變數的預設行為。CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH
- 控制搜尋 CMake 特定環境變數的預設行為。CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH
- 控制搜尋標準系統環境變數的預設行為。CMAKE_FIND_USE_CMAKE_PATH
- 控制搜尋 CMake 特定快取變數的預設行為。CMAKE_FIND_USE_CMAKE_SYSTEM_PATH
- 控制搜尋平台特定 CMake 變數的預設行為。
find_package()
命令已學會檢查CMAKE_FIND_USE_PACKAGE_REGISTRY
變數,以控制搜尋 CMake 使用者套件註冊表的預設行為,並檢查CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY
變數,以控制搜尋 CMake 系統套件註冊表的預設行為。message()
命令學習了使用新的CMAKE_MESSAGE_INDENT
變數進行縮排控制。新增了
target_precompile_headers()
命令,用於指定要預先編譯的標頭列表,以加快編譯速度。
變數¶
引入了
CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS
變數,以選擇性地初始化CUDA_RESOLVE_DEVICE_SYMBOLS
目標屬性。新增了
CMAKE_ECLIPSE_RESOURCE_ENCODING
變數,用於為Eclipse CDT4
額外產生器指定資源編碼。新增了
CMAKE_UNITY_BUILD
變數,用於初始化UNITY_BUILD
目標屬性,以告知產生器批次包含原始檔,以加快編譯速度。
屬性¶
BUILD_RPATH
和INSTALL_RPATH
目標屬性現在支援產生器運算式
。新增了
INSTALL_REMOVE_ENVIRONMENT_RPATH
目標屬性,以從目標中移除編譯器定義的RPATH
項目。此屬性由CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH
變數初始化。新增了
PRECOMPILE_HEADERS
目標屬性,用於指定要預先編譯的標頭列表,以加快編譯速度。使用target_precompile_headers()
命令進行設定。新增了
UNITY_BUILD
目標屬性,以告知產生器批次包含原始檔,以加快編譯速度。VS_CONFIGURATION_TYPE
目標屬性現在支援產生器運算式
。新增了
VS_DPI_AWARE
目標屬性,以告知 Visual Studio 產生器 在.vcxproj
檔案中設定EnableDpiAwareness
屬性。新增了
XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING
目標屬性,以告知Xcode
產生器設定Allow debugging when using document Versions Browser
綱要選項的值。
模組¶
FindDoxygen
模組doxygen_add_docs()
命令獲得了新的USE_STAMP_FILE
選項。當存在此選項時,命令建立的自訂目標僅在自上次成功執行以來任何原始檔發生變更時,才會重新執行 Doxygen。FindGnuTLS
模組現在提供一個匯入的目標。FindPackageHandleStandardArgs
模組find_package_handle_standard_args()
命令獲得了新的REASON_FAILURE_MESSAGE
選項,以指定給出失敗原因的訊息。FindPkgConfig
模組pkg_search_module()
巨集現在定義一個<prefix>_MODULE_NAME
結果變數,其中包含第一個符合的模組名稱。FindPython3
和FindPython
模組獲得了控制將搜尋哪些ABI
的選項。FindPython3
、FindPython2
和FindPython
模組現在支援透過快取項目直接指定成品。
Autogen¶
當使用
AUTOMOC
時,可以啟用新的CMAKE_AUTOMOC_PATH_PREFIX
變數或AUTOMOC_PATH_PREFIX
目標屬性,以產生moc
的-p
路徑前綴選項。這確保moc
輸出檔案在不同的建置設定上是相同的(假設由moc
編譯的標頭位於include 目錄
中)。此外,它還確保當原始碼和/或建置目錄是符號連結時,moc
輸出檔案將正確編譯。
CTest¶
新增了一個新的測試屬性
SKIP_REGULAR_EXPRESSION
。此屬性類似於FAIL_REGULAR_EXPRESSION
和PASS_REGULAR_EXPRESSION
,但具有與SKIP_RETURN_CODE
相同的含義。例如,在使用者無法控制測試傳回代碼的情況下,這非常有用。例如,在 Catch2 中,傳回值是斷言失敗的次數,因此不可能將其用於SKIP_RETURN_CODE
。
CPack¶
cpack(1)
學習了對-C
選項的多個組態的支援。CPack DEB 產生器
現在能夠根據 Debian Policy Manual 格式化通用文字(通常用作多個 CPack 產生器的描述)。請參閱CPACK_PACKAGE_DESCRIPTION_FILE
和CPACK_DEBIAN_<COMPONENT>_DESCRIPTION
變數。CPack Archive 產生器
學習了使用 Zstandard 壓縮產生.tar.zst
套件。
已棄用和移除的功能¶
為政策
CMP0067
新增了明確的棄用診斷訊息(CMP0066
及以下版本已棄用)。cmake-policies(7)
手冊說明,所有政策的 OLD 行為都已棄用,專案應移植到 NEW 行為。CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
變數已被棄用。請改用CMAKE_FIND_USE_PACKAGE_REGISTRY
變數。GetPrerequisites
模組已被棄用,因為它已被file(GET_RUNTIME_DEPENDENCIES)
取代。CPACK_INSTALL_SCRIPT
變數已被棄用,改用新的、名稱更準確的CPACK_INSTALL_SCRIPTS
變數。
其他變更¶
cmake(1)
-C <initial-cache>
選項現在使用設定為最上層原始碼和建置樹狀結構的CMAKE_SOURCE_DIR
和CMAKE_BINARY_DIR
來評估初始快取腳本。cmake(1)
-E remove_directory
命令列工具在給定目錄符號連結的路徑時,現在僅移除符號連結。它不再移除連結目錄的內容。ctest(1)
--build-makeprogram
命令列選項現在指定在使用Ninja
產生器或 Makefile 產生器 設定專案時使用的 make 程式。ExternalProject
模組和ExternalProject_Add()
命令已更新,現在GIT_SUBMODULES ""
將不會初始化子模組。請參閱政策CMP0097
。ExternalProject
模組ExternalProject_Add()
命令已更新,現在GIT_SUBMODULES ""
將不會初始化子模組。請參閱政策CMP0097
。FindGTest
模組已更新,以識別由 GTest 1.8.1 產生的 MSVC 建置樹。FindGTest
模組已更新,以識別由 GTest 1.8.1 產生的 MSVC 建置樹。project()
命令不再去除版本組件中的前導零。請參閱政策CMP0096
。project()
命令不再去除版本組件中的前導零。請參閱政策CMP0096
。Qt 壓縮說明檔案現在命名為
CMake.qch
,其檔案名稱不再包含發行版本。當 CMake 就地升級時,此檔案的名稱和位置將保持不變。IDE、說明檢視器等工具現在應該能夠在固定的位置參照此檔案,該位置在 CMake 升級後仍然有效。Qt Compressed Help file is now namedCMake.qch
, which no longer contains the release version in the file name. When CMake is upgraded in-place, the name and location of this file will remain constant. Tools such as IDEs, help viewers, etc. should now be able to refer to this file at a fixed location that remains valid across CMake upgrades.RPATH
條目在用於安裝的生成 CMake 腳本中已正確轉義。請參閱政策CMP0095
。RPATH
entries are properly escaped in the generated CMake scripts used for installation. See policyCMP0095
。在 Windows 上使用
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
時,現在只有在提供符號的目標文件更新時,才會更新自動生成的導出。When usingCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
on Windows the auto-generated exports are now updated only when the object files providing the symbols are updated.
更新¶Updates¶
自 CMake 3.16.0 以來所做的變更包括以下內容。Changes made since CMake 3.16.0 include the following.
3.16.2¶3.16.2¶
CMake 3.16.0 和 3.16.1 使用
AUTOMOC
處理.hh
檔案。這是與 CMake 3.15 及更早版本不同的行為變更,可能會破壞現有專案,因此已在 3.16.2 版本中還原。CMake 3.16.0 and 3.16.1 processed.hh
files withAUTOMOC
. This was a behavior change from CMake 3.15 and below that can break existing projects, so it has been reverted as of 3.16.2.
3.16.5¶3.16.5¶
FindPython
、FindPython2
和FindPython3
模組不再為Python{,2,3}_LIBRARY_RELEASE
和Python{,2,3}_LIBRARY_DEBUG
建立快取條目。這些值始終從其他結果計算得出,因此不應快取。這些條目由 CMake 3.16.0 到 3.16.4 建立,但始終為FORCE
設定,使用者無法有意義地編輯。TheFindPython
,FindPython2
, andFindPython3
modules no longer create cache entries forPython{,2,3}_LIBRARY_RELEASE
andPython{,2,3}_LIBRARY_DEBUG
. Those values are always computed from other results and so should not be cached. The entries were created by CMake 3.16.0 through 3.16.4 but were alwaysFORCE
-set and could not be meaningfully edited by users.此外,這些模組不再公開其內部的
_Python*
快取條目。CMake 3.16.0 到 3.16.4 意外地將它們顯示為進階快取條目。Additionally, the modules no longer expose their internal_Python*
cache entries publicly. CMake 3.16.0 through 3.16.4 accidentally made them visible as advanced cache entries.
3.16.7¶3.16.7¶
如果未設定
OBJC
或OBJCXX
環境變數,則 Objective C 或 C++ 編譯器的選擇現在會考慮CC
或CXX
環境變數。Selection of the Objective C or C++ compiler now considers theCC
orCXX
environment variable if theOBJC
orOBJCXX
environment variable is not set.FindPkgConfig
模組現在將以-isystem
為前綴的包含目錄提取到*_INCLUDE_DIRS
變數和INTERFACE_INCLUDE_DIRECTORIES
目標屬性中。以前,它們會被放置在*_CFLAGS_OTHER
變數和INTERFACE_COMPILE_OPTIONS
目標屬性中。TheFindPkgConfig
module now extracts include directories prefixed with-isystem
into the*_INCLUDE_DIRS
variables andINTERFACE_INCLUDE_DIRECTORIES
target properties. Previously they would be places in*_CFLAGS_OTHER
variables andINTERFACE_COMPILE_OPTIONS
target properties.
3.16.9¶3.16.9¶
CMAKE_AUTOMOC_PATH_PREFIX
的預設值已變更為OFF
,因為此功能可能會破壞在不同包含目錄中具有相同名稱標頭檔的現有專案。這恢復了與 CMake 3.15 及更早版本的行為的相容性。The default value ofCMAKE_AUTOMOC_PATH_PREFIX
was changed toOFF
because this feature can break existing projects that have identically named header files in different include directories. This restores compatibility with behavior of CMake 3.15 and below.