CMake 3.16 發行說明

自 CMake 3.15 以來所做的變更包括以下內容。

新功能

語言

  • CMake 學會支援 Objective C (OBJC) 和 Objective C++ (OBJCXX) 語言。它們可以透過 project()enable_language() 命令啟用。當啟用 OBJCOBJCXX 時,副檔名為 .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_FLAGSCMAKE_MODULE_LINKER_FLAGS 變數中)來手動啟用共用程式庫和/或可載入模組的執行階段連結。可以透過將 -Wl,-brtl 新增至其連結旗標(例如在 CMAKE_EXE_LINKER_FLAGS 變數中)來手動啟用可執行檔的執行階段連結。

命令列

  • cmake(1) -E 現在支援 truefalse 命令,它們在傳回退出代碼 0 和 1 時不執行任何操作。

  • cmake(1) 獲得了 --trace-redirect=<file> 命令列選項,可用於將 --trace 輸出重新導向到檔案而不是 stderr

  • cmake(1) --loglevel 命令列選項已重新命名為 --log-level,使其與其他命令列選項的命名保持一致。--loglevel 選項仍然受到支援,以保持向後相容性。

命令

變數

屬性

模組

Autogen

  • 當使用 AUTOMOC 時,可以啟用新的 CMAKE_AUTOMOC_PATH_PREFIX 變數或 AUTOMOC_PATH_PREFIX 目標屬性,以產生 moc-p 路徑前綴選項。這確保 moc 輸出檔案在不同的建置設定上是相同的(假設由 moc 編譯的標頭位於 include 目錄 中)。此外,它還確保當原始碼和/或建置目錄是符號連結時,moc 輸出檔案將正確編譯。

CTest

CPack

已棄用和移除的功能

其他變更

  • cmake(1) -C <initial-cache> 選項現在使用設定為最上層原始碼和建置樹狀結構的 CMAKE_SOURCE_DIRCMAKE_BINARY_DIR 來評估初始快取腳本。

  • cmake(1) -E remove_directory 命令列工具在給定目錄符號連結的路徑時,現在僅移除符號連結。它不再移除連結目錄的內容。

  • ctest(1) --build-makeprogram 命令列選項現在指定在使用 Ninja 產生器或 Makefile 產生器 設定專案時使用的 make 程式。

  • ExternalProject 模組和 ExternalProject_Add() 命令已更新,現在 GIT_SUBMODULES "" 將不會初始化子模組。請參閱政策 CMP0097ExternalProject 模組 ExternalProject_Add() 命令已更新,現在 GIT_SUBMODULES "" 將不會初始化子模組。請參閱政策 CMP0097

  • FindGTest 模組已更新,以識別由 GTest 1.8.1 產生的 MSVC 建置樹。FindGTest 模組已更新,以識別由 GTest 1.8.1 產生的 MSVC 建置樹。

  • project() 命令不再去除版本組件中的前導零。請參閱政策 CMP0096project() 命令不再去除版本組件中的前導零。請參閱政策 CMP0096

  • Qt 壓縮說明檔案現在命名為 CMake.qch,其檔案名稱不再包含發行版本。當 CMake 就地升級時,此檔案的名稱和位置將保持不變。IDE、說明檢視器等工具現在應該能夠在固定的位置參照此檔案,該位置在 CMake 升級後仍然有效。Qt Compressed Help file is now named CMake.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 腳本中已正確轉義。請參閱政策 CMP0095RPATH entries are properly escaped in the generated CMake scripts used for installation. See policy CMP0095

  • 在 Windows 上使用 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 時,現在只有在提供符號的目標文件更新時,才會更新自動生成的導出。When using CMAKE_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.23.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 with AUTOMOC. 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.53.16.5

  • FindPythonFindPython2FindPython3 模組不再為 Python{,2,3}_LIBRARY_RELEASEPython{,2,3}_LIBRARY_DEBUG 建立快取條目。這些值始終從其他結果計算得出,因此不應快取。這些條目由 CMake 3.16.0 到 3.16.4 建立,但始終為 FORCE 設定,使用者無法有意義地編輯。The FindPython, FindPython2, and FindPython3 modules no longer create cache entries for Python{,2,3}_LIBRARY_RELEASE and Python{,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 always FORCE-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.73.16.7

  • 如果未設定 OBJCOBJCXX 環境變數,則 Objective C 或 C++ 編譯器的選擇現在會考慮 CCCXX 環境變數。Selection of the Objective C or C++ compiler now considers the CC or CXX environment variable if the OBJC or OBJCXX environment variable is not set.

  • FindPkgConfig 模組現在將以 -isystem 為前綴的包含目錄提取到 *_INCLUDE_DIRS 變數和 INTERFACE_INCLUDE_DIRECTORIES 目標屬性中。以前,它們會被放置在 *_CFLAGS_OTHER 變數和 INTERFACE_COMPILE_OPTIONS 目標屬性中。The FindPkgConfig module now extracts include directories prefixed with -isystem into the *_INCLUDE_DIRS variables and INTERFACE_INCLUDE_DIRECTORIES target properties. Previously they would be places in *_CFLAGS_OTHER variables and INTERFACE_COMPILE_OPTIONS target properties.

3.16.93.16.9

  • CMAKE_AUTOMOC_PATH_PREFIX 的預設值已變更為 OFF,因為此功能可能會破壞在不同包含目錄中具有相同名稱標頭檔的現有專案。這恢復了與 CMake 3.15 及更早版本的行為的相容性。The default value of CMAKE_AUTOMOC_PATH_PREFIX was changed to OFF 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.