CMake 3.8 發行說明¶
自 CMake 3.7 以來所做的變更包括以下內容。
新功能¶
程式語言¶
C#¶
CMake 學習支援
CSharp
(C#) 作為一級語言,可透過project()
和enable_language()
指令啟用。目前 Visual Studio 產生器 支援 VS 2010 及以上版本。C# 組件和程式可以像使用
add_library()
和add_executable()
指令的常見 C++ 目標一樣加入。相同來源樹中 C# 目標之間的參考可以使用target_link_libraries()
指定,就像 C++ 一樣。對系統或協力廠商組件的參考可以使用目標屬性VS_DOTNET_REFERENCE_<refname>
和VS_DOTNET_REFERENCES
指定。可以使用目標和原始程式檔屬性來更精細地調整 C# 目標。特別是與 Visual Studio 相關的目標屬性 (
VS_*
) 值得一看 (用於設定工具集版本、根命名空間、組件圖示等)。
CUDA¶
CMake 學習支援
CUDA
作為一級語言,可透過project()
和enable_language()
指令啟用。CUDA
目前由 Linux、macOS 和 Windows 上的 Makefile 產生器 和Ninja
產生器支援。對 Visual Studio IDE 的支援正在開發中,但不包含在此版本中。支援 NVIDIA CUDA 工具組編譯器 (
nvcc
)。
C & C++¶
編譯 功能
功能現在提供 meta-features,用於請求特定語言標準層級的編譯器模式 (例如cxx_std_11
)。請參閱CMAKE_C_KNOWN_FEATURES
和CMAKE_CXX_KNOWN_FEATURES
。編譯 功能
功能現在知道 C++ 17。除了cxx_std_17
meta-feature 之外,尚未列舉任何特定功能。編譯 功能
功能現在知道自 3.4 版本以來 gcc 中 C99 的可用性。
平台¶
新增了一個用於
Fuchsia
的新最小平台檔案。
產生器¶
現在可以使用
CodeBlocks
額外產生器搭配NMake Makefiles JOM
產生。VS 2013 及以上版本的 Visual Studio 產生器 學習支援在
CMAKE_GENERATOR_TOOLSET
值中加入host=x64
選項 (例如透過cmake(1)
-T
選項),以請求在 64 位元主機上使用 VS 64 位元工具鏈。Visual Studio 產生器 學習將傳遞給
target_link_libraries()
的檔案名稱以.targets
結尾視為 MSBuild「targets」檔案,以便匯入產生的專案檔案中。
指令¶
add_custom_command()
和add_custom_target()
指令學習了COMMAND_EXPAND_LISTS
選項,該選項會導致展開COMMAND
引數中的清單,包括由產生器運算式建立的清單。execute_process()
指令取得ENCODING
選項,以便在 Windows 上指定子處理序的輸出使用哪種編碼。math(EXPR)
指令支援一元+
和-
運算子。source_group()
指令取得TREE
和PREFIX
選項,以便依照原始程式檔樹狀目錄結構新增群組。string(TIMESTAMP)
指令學習將%%
視為編碼一般%
的方式。string(TIMESTAMP)
指令現在會遵守SOURCE_DATE_EPOCH
環境變數,並使用其值而非目前時間。try_compile()
指令原始程式檔簽章取得新選項,用於指定在產生的測試專案中使用的語言標準。現在
try_compile()
命令的原始碼檔案簽章會採用語言標準變數,如CMAKE_CXX_STANDARD
。請參閱政策CMP0067
。
變數¶
新增了
CMAKE_CODELITE_USE_TARGETS
變數,以告知CodeLite
額外產生器,變更產生的專案以具有以目標為中心的組織結構。CodeLite
中的build
、rebuild
和clean
操作將作用於選定的目標,而不是整個工作區。(請注意,Ninja
在目標上的清理操作會包含其相依性。)新增了
CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS
變數,以告知Sublime Text 2
額外產生器,將指定的環境變數放置在產生的.sublime-project
中。新增了
CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE
變數,以告知Sublime Text 2
額外產生器,當建置樹位於原始碼樹內時,是否要從.sublime-project
中排除建置樹。新增了
CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD
變數,以告知 VS 2010 及更高版本的 Visual Studio 產生器 在預設建置中包含PACKAGE
目標,類似於現有的CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
變數,適用於INSTALL
目標。
屬性¶
新增了
BUILD_RPATH
目標屬性和對應的CMAKE_BUILD_RPATH
變數,以支援將自訂RPATH
位置新增至建置樹中的二進位檔。COMPILE_FLAGS
原始碼檔案屬性已學會支援產生器 表達式
。FRAMEWORK
目標屬性現在也可以套用於 Apple 目標上的靜態程式庫。它將產生一個正確的 Framework,但內部有一個靜態程式庫。已匯入 介面程式庫 學到了新的
IMPORTED_LIBNAME
和IMPORTED_LIBNAME_<CONFIG>
目標屬性,以指定連結程式庫名稱,因為介面程式庫不會建置自己的程式庫檔案。引入了
<LANG>_CPPLINT
目標屬性和支援的CMAKE_<LANG>_CPPLINT
變數,以告知 Makefile 產生器 和Ninja
產生器,針對C
和CXX
語言,在編譯器執行時同時執行cpplint
樣式檢查器。新增了
MANUALLY_ADDED_DEPENDENCIES
目標屬性。它提供了一個唯讀的相依性清單,這些相依性是使用add_dependencies()
命令新增的。MAP_IMPORTED_CONFIG_<CONFIG>
目標屬性學會將空清單元素解讀為參考由IMPORTED_LOCATION
指定的無組態匯入位置。現在 已匯入 介面程式庫 支援
NO_SYSTEM_FROM_IMPORTED
目標屬性。新增了新的原始碼檔案屬性
SKIP_AUTOMOC
、SKIP_AUTOUIC
、SKIP_AUTORCC
和SKIP_AUTOGEN
,以允許原始碼檔案不被AUTOMOC
、AUTOUIC
和AUTORCC
目標屬性處理。新增了
VS_COPY_TO_OUT_DIR
原始碼檔案屬性,以告知 VS 2010 及更高版本的 Visual Studio 產生器 是否應將檔案複製到輸出目錄。新增了
VS_DEBUGGER_WORKING_DIRECTORY
目標屬性,以告知 VS 2010 及更高版本的 Visual Studio 產生器 應為目標設定哪個偵錯工具的工作目錄。新增了
VS_DOTNET_REFERENCES_COPY_LOCAL
目標屬性,以指定是否將參考的組件複製到輸出目錄。新增了一個
VS_DOTNET_REFERENCE_<refname>
目標屬性,用於告知 Visual Studio 產生器(適用於 VS 2010 及更高版本)新增具有指定提示路徑的 .NET 參考。新增了一個
VS_INCLUDE_IN_VSIX
原始碼檔案屬性,用於告知 Visual Studio 產生器(適用於 VS 2010 及更高版本)是否將檔案包含在 Visual Studio 擴充套件包中。新增了一個
VS_RESOURCE_GENERATOR
原始碼檔案屬性,用於為 Visual Studio 產生器(適用於 VS 2010 及更高版本)提供資源產生器的設定(僅限C#
)。新增了一個
VS_USER_PROPS
目標屬性,用於告知 Visual Studio 產生器(適用於 VS 2010 及更高版本)使用自訂的 MSBuild 使用者.props
檔案。新增了一個
XCODE_EMIT_EFFECTIVE_PLATFORM_NAME
全域屬性,用於告知Xcode
產生器是否要發出EFFECTIVE_PLATFORM_NAME
變數。當並行使用多個 SDK(例如macosx
和iphoneos
)進行建置時,這很有用。建立了新的
XCODE_PRODUCT_TYPE
和XCODE_EXPLICIT_FILE_TYPE
目標屬性,用於告知Xcode
產生器在產生的 Xcode 專案中使用目標的對應屬性的自訂值。
模組¶
新增了一個
CSharpUtilities
模組,以協助 Visual Studio C# 目標的參數化。它提供了函式來自動設定原始碼檔案屬性,以根據需要支援 Windows Forms、WPF/XAML 或其他技術。ExternalData
模組學會了使用不同的雜湊值來支援一個資料檔案的多個內容連結,例如img.png.sha256
和img.png.sha1
。這允許從以不同雜湊演算法索引的來源擷取物件。ExternalProject
模組獲得了GIT_PROGRESS
選項,以強制 Git 在複製儲存庫時顯示進度。ExternalProject
模組獲得了GIT_CONFIG
選項,以在複製儲存庫時將--config
選項傳遞給 Git。FeatureSummary
模組的feature_summary()
命令現在接受新的QUIET_ON_EMPTY
選項,當屬於選定類別的套件清單為空時,該選項會抑制輸出。FeatureSummary
模組的add_feature_info()
命令現在接受相依性清單,以決定是否啟用某個功能。FeatureSummary
模組接受的套件類型現在可以透過變更FeatureSummary_PKG_TYPES
、FeatureSummary_REQUIRED_PKG_TYPES
和FeatureSummary_DEFAULT_PKG_TYPE
全域屬性進行調整。FindOpenGL
模組現在在找到程式庫時,會提供匯入的目標OpenGL::GL
和OpenGL::GLU
。UseSWIG
模組獲得了swig_add_library
命令,以便在舊的swig_add_module
命令之上提供更大的彈性。UseSWIG
模組的swig_add_source_to_module
命令學會了一個新的SWIG_OUTFILE_DIR
選項,以控制輸出檔案位置(swig -o
)。WriteCompilerDetectionHeader
模組獲得了ALLOW_UNKNOWN_COMPILERS
和ALLOW_UNKNOWN_COMPILER_VERSIONS
選項,這些選項允許建立標頭,這些標頭也可以與未知或舊編譯器一起使用,只需假設它們不支援任何要求的功能即可。
CTest¶
ctest_memcheck()
命令獲得了DEFECT_COUNT <var>
選項,以擷取偵測到的記憶體缺陷數量。ctest_memcheck()
命令學會了從CTEST_MEMORYCHECK_SUPPRESSIONS_FILE
變數中讀取消毒器抑制檔案的位置。ctest_memcheck()
命令學會了獨立於AddressSanitizer
支援LeakSanitizer
。ctest_update()
命令的CDASH_UPLOAD
簽名已學習尊重RETRY_COUNT
、RETRY_DELAY
和QUIET
選項。
CPack¶
新增了
CPackIFWConfigureFile
模組,以定義新的cpack_ifw_configure_file()
命令,以設定以 QtIFW/SDK/Creator 風格準備的檔案範本。CPackIFW
模組的cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令新增了DEFAULT
、VIRTUAL
、FORCED_INSTALLATION
、REQUIRES_ADMIN_RIGHTS
、DISPLAY_NAME
、UPDATE_TEXT
、DESCRIPTION
、RELEASE_DATE
、AUTO_DEPEND_ON
和TRANSLATIONS
選項,以進行更精確的配置。CPackIFW
模組的cpack_ifw_configure_component()
命令新增了DEPENDENCIES
作為DEPENDS
選項的別名。CPackIFW
模組的cpack_ifw_configure_component_group()
命令新增了DEPENDS
選項。也新增了DEPENDENCIES
別名。CPackIFW
模組的cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令的PRIORITY
選項現在已棄用,並將在未來版本的 CMake 中移除。請改用新的SORTING_PRIORITY
選項。CPack IFW 產生器
新增了CPACK_IFW_PACKAGE_WATERMARK
、CPACK_IFW_PACKAGE_BANNER
、CPACK_IFW_PACKAGE_BACKGROUND
、CPACK_IFW_PACKAGE_WIZARD_STYLE
、CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH
、CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT
和CPACK_IFW_PACKAGE_TITLE_COLOR
變數,以自訂 QtIFW 安裝程式的外觀。CPack productbuild 產生器
新增了簽署套件的選項。請參閱變數CPACK_PRODUCTBUILD_IDENTITY_NAME
、CPACK_PRODUCTBUILD_KEYCHAIN_PATH
、CPACK_PKGBUILD_IDENTITY_NAME
和CPACK_PKGBUILD_KEYCHAIN_PATH
。CPack RPM 產生器
學會了省略提供的rpmbuild
工具不支援的標籤。如果設定了不支援的標籤,它們將會被忽略並印出開發人員警告。CPack RPM 產生器
學會了產生主要元件套件,該套件會強制為已定義的元件產生 RPM,而檔案名稱和套件名稱中沒有元件後綴。請參閱CPACK_RPM_MAIN_COMPONENT
變數。CPack RPM 產生器
學會了根據需求產生單一debuginfo
套件,即使使用了元件封裝。請參閱CPACK_RPM_DEBUGINFO_SINGLE_PACKAGE
變數。CPack RPM 產生器
學會了在使用CPACK_RPM_USER_FILELIST
變數時,支援每個檔案多個指令。
其他¶
使用密碼雜湊的 CMake 功能現在支援 SHA-3 演算法。
新增了新的產生器表達式
$<IF:cond,true-value,false-value>
。如果條件為1
,則解析為 true-value;如果條件為0
,則解析為 false-value。
已棄用和移除的功能¶
FeatureSummary
模組命令set_package_info()
、set_feature_info()
、print_enabled_features()
和print_disabled_features()
現在已棄用。UseSWIG
模組的swig_add_module
命令現在已棄用,建議改用swig_add_library
。
其他變更¶
如果
<LANG>_CLANG_TIDY
目標屬性指定的命令在建置時傳回非零值,現在會被視為錯誤,而不是默默地忽略。ctest_memcheck()
命令不再自動將leak_check=1
加入AddressSanitizer
使用的選項中。AddressSanitizer
的預設行為是執行 LeakSanitizer 來檢查記憶體洩漏,除非指定leak_check=0
。ctest_memcheck()
命令已修正,能正確地將從CTEST_MEMORYCHECK_SANITIZER_OPTIONS
變數讀取的額外 sanitizers 選項附加到 sanitizers 內部使用的環境變數中。FeatureSummary
模組的set_package_properties()
命令,在未明確設定類型時,不再強制將套件類型設定為OPTIONAL
。編譯功能
功能現在能識別 Intel C++ 編譯器 12.1 到 17.0 版本在 UNIX 和 Windows 平台上支援的功能。在成功呼叫後,呼叫
FindPkgConfig
模組的pkg_check_modules()
命令,學會了在變更該前綴的命令參數後,重新評估給定前綴的快取值。當使用
AUTOMOC
或AUTOUIC
時,產生的moc_*
、*.moc
和ui_*
會放置在<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include
目錄中,該目錄會自動新增到目標的INCLUDE_DIRECTORIES
中。 因此,不再需要在目標的INCLUDE_DIRECTORIES
中包含CMAKE_CURRENT_BINARY_DIR
。Sublime Text 2
產生器不再以啟用詳細建置輸出的方式執行原生建置命令 (例如,ninja
或make
)。try_compile()
命令的原始檔簽名現在會在產生的測試專案中遵循CMAKE_WARN_DEPRECATED
變數值。用於 VS 2010 及更高版本的 Visual Studio 產生器 現在會將每個原始檔的旗標放置在目標範圍旗標之後,當它們被分類為沒有專案檔案設定的原始旗標 (
AdditionalOptions
) 時。 此行為與其他產生器產生的旗標順序更加一致,並允許更特定屬性(每個原始檔)上的旗標覆蓋更一般屬性(每個目標)上的旗標。在
cmake.org
上提供的預先編譯的 Windows 二進位 MSI 套件現在會在 Windows 登錄中的HKLM\Software\Kitware\CMake
機碼下,使用名為InstallDir
的值記錄安裝目錄。