CMake 3.16 發行說明¶
自 CMake 3.15 以來所做的變更包括以下內容。
新功能¶
程式語言¶
CMake 學會支援 Objective C (
OBJC
) 和 Objective C++ (OBJCXX
) 程式語言。它們可以透過project()
和enable_language()
命令啟用。當啟用OBJC
或OBJCXX
時,分別帶有.m
或.mm
副檔名的原始程式碼檔案將會被編譯為 Objective C 或 C++。否則,它們將會像以前一樣被視為純 C++ 原始程式碼。
編譯器¶
現在在
Solaris
上支援Clang
編譯器。
平台¶
在 AIX 上,使用
ENABLE_EXPORTS
目標屬性的可執行檔現在除了可執行檔之外,還會產生一個帶有.imp
副檔名的連結器匯入檔。使用add_library()
與MODULE
選項建立的外掛程式,使用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 directory
中)。此外,它還確保當原始碼和/或建置目錄是符號連結時,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 封存 產生器
學習產生使用 Zstandard 壓縮的.tar.zst
套件。
已棄用和移除的功能¶
為政策
CMP0067
新增了明確的棄用診斷(CMP0066
及以下已棄用)。cmake-policies(7)
手冊解釋說,所有政策的舊行為都已棄用,專案應移植到新行為。已棄用
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
。已更新
FindGTest
模組以識別由 GTest 1.8.1 產生的 MSVC 建置樹。Qt 壓縮說明檔案現在命名為
CMake.qch
,其中不再包含檔案名稱中的發行版本。當 CMake 就地升級時,此檔案的名稱和位置將保持不變。IDE、說明檢視器等工具現在應該能夠在一個固定的位置引用此檔案,該位置在 CMake 升級時仍然有效。RPATH
條目在用於安裝的產生 CMake 指令碼中會正確逸出。請參閱政策CMP0095
。在 Windows 上使用
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
時,僅當提供符號的物件檔案更新時,才會更新自動產生的匯出。
更新¶
自 CMake 3.16.0 以來進行的變更包括下列內容。
3.16.2¶
CMake 3.16.0 和 3.16.1 使用
AUTOMOC
處理.hh
檔案。這是與 CMake 3.15 及更低版本相比的行為變更,可能會破壞現有專案,因此已在 3.16.2 中還原。
3.16.5¶
FindPython
、FindPython2
和FindPython3
模組不再為Python{,2,3}_LIBRARY_RELEASE
和Python{,2,3}_LIBRARY_DEBUG
建立快取項目。這些值始終從其他結果計算得出,因此不應快取。這些項目由 CMake 3.16.0 至 3.16.4 建立,但始終為FORCE
設定,且使用者無法有意義地編輯。此外,這些模組不再公開其內部
_Python*
快取項目。CMake 3.16.0 至 3.16.4 意外地使其顯示為進階快取項目。
3.16.7¶
現在,選擇 Objective C 或 C++ 編譯器時,如果未設定
OBJC
或OBJCXX
環境變數,則會考慮CC
或CXX
環境變數。FindPkgConfig
模組現在會將以-isystem
為前綴的包含目錄提取到*_INCLUDE_DIRS
變數和INTERFACE_INCLUDE_DIRECTORIES
目標屬性中。 之前它們會被放置在*_CFLAGS_OTHER
變數和INTERFACE_COMPILE_OPTIONS
目標屬性中。
3.16.9¶
CMAKE_AUTOMOC_PATH_PREFIX
的預設值已變更為OFF
,因為此功能可能會破壞在不同包含目錄中具有相同名稱的標頭檔的現有專案。 這恢復了與 CMake 3.15 及更早版本的行為的相容性。