CMake 3.10 發行說明¶
自 CMake 3.9 以來所做的變更包括以下內容。
新功能¶
平台¶
現在支援 flang Fortran 編譯器,編譯器 ID 為
Flang
。新增了適用於
Midipix
的新最小平台檔案。新增了對 MSVC ARM64 架構的支援。Visual Studio 2017 Update 4 及更高版本提供 ARM64 工具鏈。
改進了對 IAR ARM Compiler 的支援。
產生器¶
Makefile 產生器 和
Ninja
產生器學會了將編譯器啟動器工具(如 ccache)與CUDA
語言的編譯器一起新增(先前已支援C
和CXX
)。請參閱CMAKE_<LANG>_COMPILER_LAUNCHER
變數和<LANG>_COMPILER_LAUNCHER
目標屬性以了解詳細資訊。CodeBlocks
額外產生器學會了可選地從產生的專案中排除專案根目錄外部的檔案。請參閱CMAKE_CODEBLOCKS_EXCLUDE_EXTERNAL_FILES
變數。
命令¶
cmake_host_system_information()
命令學會了更多鍵來取得有關處理器功能和主機作業系統版本的資訊。configure_file()
命令學會了支援縮排的# cmakedefine
和# cmakedefine01
。現在可以理解並保留#
字元和cmakedefine
/cmakedefine01
字詞之間的空格和/或 Tab 字元。execute_process()
命令獲得了RESULTS_VARIABLE
選項,可在給定多個COMMAND
引數時,從程序管線中的所有子程序收集結果清單。引入了
include_guard()
命令,以防止 CMake 腳本被多次包含。此命令支援DIRECTORY
和GLOBAL
選項,以調整對應的包含保護範圍。如果未提供任何選項,則包含保護類似於基本的基於變數的檢查。string()
命令學會了新的PREPEND
子命令。string(TIMESTAMP)
命令現在支援%A
表示完整的工作日名稱,以及%B
表示完整的月份名稱。
變數¶
新增了
CMAKE_DIRECTORY_LABELS
變數,以指定目錄中所有測試的標籤。
屬性¶
引入了
<LANG>_CPPCHECK
目標屬性和支援的CMAKE_<LANG>_CPPCHECK
變數,以告知 Makefile 產生器 和Ninja
產生器使用cppcheck
以及C
和CXX
語言的編譯器執行。新增了
LABELS
目錄屬性,以指定目錄中所有目標和測試的標籤。新增了
TEST_INCLUDE_FILES
目錄屬性,以列出在使用ctest(1)
執行測試時要包含的任意數量的檔案。這概括了TEST_INCLUDE_FILE
屬性。新增了
VS_DOTNET_REFERENCEPROP_<refname>_TAG_<tagname>
目標屬性,以支援 C# 目標中參考組件的自訂 XML 標籤。新增了來源檔案屬性
VS_SHADER_OUTPUT_HEADER_FILE
和VS_SHADER_VARIABLE_NAME
,以在使用 Visual Studio 產生器 的.hlsl
來源中指定更多詳細資訊。
模組¶
FindCurses
模組獲得了CURSES_NEED_WIDE
選項,以請求寬字元變體。FindEXPAT
模組現在提供匯入的目標。FindFreetype
模組現在提供匯入的目標。FindMPI
獲得了許多新功能,包括已將特定於語言的組件新增至模組。
現在支援更多 MPI 環境。
改進了對 Fortran 的環境支援。
使用者現在可以精細控制 MPI 選擇過程,包括將自訂參數傳遞給 MPI 編譯器。
現在公開了已實作的 MPI 標準版本。
現在可以偵測到 MPI-2 C++ 綁定,如果需要,也可以抑制它。
現在正在偵測和驗證可用的 Fortran 綁定。
可以請求各種 MPI-3 資訊,包括程式庫版本和個別綁定的 Fortran 功能。
支援靜態連結的 MPI 實作。
新增了
FindOpenACC
模組,以偵測編譯器對 OpenACC 的支援。目前僅支援 PGI、GNU 和 Cray 編譯器。FindOpenGL
模組增加了對 Linux 上 GLVND 的支援。FindOpenMP
模組增加了對特定於語言的組件的支援。新增了
FindPatch
模組,以尋找patch
命令列可執行檔。FindProtobuf
模組protobuf_generate_cpp()
命令獲得了DESCRIPTORS
選項,以產生描述符檔案。GoogleTest
模組獲得了新命令gtest_discover_tests()
,實作動態(建置時)測試探索。與來源剖析方法不同,動態探索在建置時執行測試(在「列出可用測試」模式下)以探索測試。這對於標記測試的異常方式來說很穩健,為參數化測試等進階功能提供了更好的支援,並且不需要重新執行 CMake 即可探索測試可執行檔中新增或移除的測試。請注意,CMake 3.10.3 中進行了重大變更,以解決TIMEOUT
關鍵字的歧義(請參閱 3.10.3)。InstallRequiredSystemLibraries
模組增加了對安裝 Intel 編譯器執行階段程式庫的支援。
Autogen¶
當使用
AUTOMOC
或AUTOUIC
與多配置產生器(例如Xcode
)時,包含的*.moc
、moc_*.cpp
和ui_*.h
檔案會在<AUTOGEN_BUILD_DIR>/include_<CONFIG>
而不是<AUTOGEN_BUILD_DIR>/include
中產生。當使用
AUTOMOC
或AUTOUIC
時,GENERATED
的來源檔案也將被處理。它們在先前的版本中被AUTOMOC
和AUTOUIC
忽略。請參閱政策CMP0071
。當使用
AUTOMOC
時,CMake 會在來源檔案中搜尋字串Q_OBJECT
、Q_GADGET
或Q_NAMESPACE
,以判斷是否需要進行moc
處理。可以設定新的CMAKE_AUTOMOC_MACRO_NAMES
變數和AUTOMOC_MACRO_NAMES
目標屬性,以註冊要搜尋的其他字串(巨集名稱)。當使用
AUTOMOC
時,新的CMAKE_AUTOMOC_COMPILER_PREDEFINES
變數和AUTOMOC_COMPILER_PREDEFINES
目標屬性指定是否啟用或停用編譯器預定義檔案moc_predefs.h
的產生。
CTest¶
新增了
CTEST_LABELS_FOR_SUBPROJECTS
CTest 模組變數和 CTest 腳本變數,以指定應由 CDash 視為子專案的標籤清單。若要在 CTest 模組和 ctest 命令列 儀表板用戶端 模式(例如ctest -S
)中使用此值,請在CTestConfig.cmake
設定檔中設定它。
CPack¶
為 FreeBSD
pkg(8)
新增了CPack FreeBSD 產生器
。在 Windows 上啟用了
CPack DEB 產生器
。雖然功能不完整(由於缺少外部 UNIX 工具),但這將允許建置基本跨平台 Debian 套件。CPack DEB 產生器
學會了在Version
資訊屬性中設定套件發行版本。請參閱CPACK_DEBIAN_PACKAGE_RELEASE
變數。CPack DEB 產生器
學會了更嚴格的套件版本檢查,該檢查符合 Debian 規則。CPackIFW
模組cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令獲得了新的REPLACES
和CHECKABLE
選項。CPack IFW 產生器
獲得了新的CPACK_IFW_PACKAGE_FILE_EXTENSION
變數,以自訂目標二進位格式。CPack IFW 產生器
獲得了新的CPACK_IFW_REPOSITORIES_DIRECTORIES
變數,以指定將用於解析和重新封裝相依組件的其他儲存庫目錄。此功能僅在使用 QtIFW 3.1 或更高版本時可用。CPack RPM 產生器
和CPack DEB 產生器
學會了設定套件紀元版本。請參閱CPACK_RPM_PACKAGE_EPOCH
和CPACK_DEBIAN_PACKAGE_EPOCH
變數。
其他¶
cmake(1)
-E
模式增加了對sha1sum
、sha224sum
、sha256sum
、sha384sum
和sha512sum
的支援。graphviz 輸出現在區分了不同的相依性類型
PUBLIC
、PRIVATE
和INTERFACE
,並在輸出圖中將它們表示為實線、虛線和點線邊緣。
已棄用和移除的功能¶
已刪除使用 C++98 編譯器建置 CMake 本身的支援。CMake 現在使用 C++11 實作。
已刪除在 HP-UX 上建置 CMake 的支援,等待更好地支援 C++11 和 libuv 的移植。請參閱 CMake Issue 17137。對於 HP-UX 支援,請改用 CMake 3.9 或更低版本。
其他變更¶
在 FreeBSD 上,名為
c++
的 C++ 編譯器現在是首選預設編譯器。file(GENERATE)
命令現在分別針對呼叫者的目前二進位和來源目錄,解譯提供給其OUTPUT
和INPUT
引數的相對路徑。請參閱政策CMP0070
。get_filename_component()
PROGRAM
模式語意已修訂為不容忍程式路徑中未加引號的空格,同時也接受引數。雖然在技術上與舊行為不相容,但預計在使用正確加引號的命令列的典型用例下的行為沒有改變。
更新¶
自 CMake 3.10.0 以來所做的變更包括以下內容。
3.10.1¶
cmake-server(7)
codemodel
回應交叉參考欄位(由 3.10.0 新增)已因過度記憶體使用量而刪除。將需要另一種方法來提供回溯資訊。
3.10.3¶
CMake 3.10.1 為
gtest_discover_tests()
(來自GoogleTest
模組)新增了TIMEOUT
選項。該關鍵字與TIMEOUT
測試屬性衝突,後者是通常會使用命令的PROPERTIES
關鍵字設定的常見屬性之一,通常會導致合法但非預期的行為。在 CMake 3.10.3 中,關鍵字已變更為DISCOVERY_TIMEOUT
以解決此問題。gtest_discover_tests()
命令的TIMEOUT
關鍵字在 3.10.1 和 3.10.2 中的模糊行為未被保留。