CMake 3.8 发行说明¶
自 CMake 3.7 以来所做的更改包括以下内容。
新功能¶
语言¶
C#¶
CMake 学会了支持
CSharp(C#) 作为一流的语言,可以通过project()和enable_language()命令启用。 VS 2010 及更高版本的 Visual Studio 生成器 目前支持它。可以使用
add_library()和add_executable()命令像添加普通 C++ 目标一样添加 C# 程序集和程序。同一源代码树中 C# 目标之间的引用可以像 C++ 一样由 target_link_libraries 指定。对系统或第 3 方程序集的引用可以由目标属性VS_DOTNET_REFERENCE_<refname>和VS_DOTNET_REFERENCES指定。可以使用目标和源文件属性对 C# 目标进行更精细的调整。具体来说,与 Visual Studio (
VS_*) 相关的目标属性值得一看(用于设置工具集版本、根命名空间、程序集图标……)。
CUDA¶
CMake 学会了支持 CUDA 作为一流语言,可以通过
project()和enable_language()命令启用。Linux、macOS 和 Windows 上的 Makefile Generators 和 Ninja 生成器目前支持
CUDA。对 Visual Studio IDE 的支持正在开发中,但未包含在此版本中。支持 NVIDIA CUDA 工具包编译器 (
nvcc)。
C与C++¶
Compile Features功能现在提供元特性,请求特定语言标准级别的编译器模式(例如``cxx_std_11``)。请参阅CMAKE_C_KNOWN_FEATURES和CMAKE_CXX_KNOWN_FEATURES。Compile Features功能现在可以识别 C++ 17。除了cxx_std_17元功能外,尚未列举任何具体功能。Compile Features功能现在知道 gcc 3.4 版以来 C99 的可用性。
平台¶
为“Fuchsia”添加了一个新的最小平台文件。
生成器¶
CodeBlocks额外的生成器现在可以用于生成NMake Makefiles JOM。VS 2013 及更高版本的 Visual Studio Generators 学会了在 CMAKE_GENERATOR_TOOLSET 值中支持 host=x64 选项(例如通过 cmake(1) `` -T`` 选项)请求在 64 位主机上使用 VS 64 位工具链。
Visual Studio 生成器 学会了将传递给
target_link_libraries()且名称以.targets结尾的文件视为要导入到生成的项目文件中的 MSBuild“目标”文件。
命令¶
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。请参阅政策:policy:CMP0067。
变量¶
添加了一个
CMAKE_CODELITE_USE_TARGETS变量来告诉CodeLite额外的生成器将生成的项目更改为具有以目标为中心的组织。CodeLite中的``build``、rebuild和``clean`` 操作然后作用于选定的目标而不是整个工作区。 (不过请注意,目标上的Ninjaclean 操作包括其依赖项。)添加了
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 Generators 在默认构建中包含 PACKAGE` 目标,类似于现有的 CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 变量对于
INSTALL目标。
特性¶
添加了
BUILD_RPATH目标属性和相应的CMAKE_BUILD_RPATH变量以支持要添加到构建树中的二进制文件的自定义RPATH位置。COMPILE_FLAGS源文件属性学会了支持generator expressions。FRAMEWORK目标属性现在也可以应用于 Apple 目标上的静态库。它将产生一个适当的框架,但内部有一个静态库。Imported 接口库 学习了新的
IMPORTED_LIBNAME和IMPORTED_LIBNAME_<CONFIG>目标属性指定链接库名称,因为接口库不构建它们的自己的库文件。<LANG>_CPPLINT目标属性和支持CMAKE_<LANG>_CPPLINT变量被引入来告诉 Makefile 生成器 和Ninja生成器运行 ` cpplint` 样式检查器以及用于C和CXX语言的编译器。添加了
MANUALLY_ADDED_DEPENDENCIES目标属性。它提供了一个只读的依赖项列表,这些依赖项已使用add_dependencies()命令添加。MAP_IMPORTED_CONFIG_<CONFIG>目标属性学会了将空列表元素解释为引用IMPORTED_LOCATION指定的无配置导入位置。NO_SYSTEM_FROM_IMPORTED目标属性现在在 Imported 接口库 上受支持。添加了新的源文件属性
SKIP_AUTOMOC、SKIP_AUTOUIC、SKIP_AUTORCC和SKIP_AUTOGEN以允许源文件从AUTOMOC 的处理中排除, :prop_tgt:`AUTOUIC和AUTORCC目标属性。添加了一个
VS_COPY_TO_OUT_DIR源文件属性来告诉 Visual Studio 生成器 适用于 VS 2010 及更高版本的文件是否应该复制到输出目录。添加了一个
VS_DEBUGGER_WORKING_DIRECTORY目标属性来告诉 Visual Studio 生成器 for VS 2010 及更高版本应该为目标设置什么调试器工作目录。添加了
VS_DOTNET_REFERENCES_COPY_LOCAL目标属性以指定是否将引用的程序集复制到输出目录。添加了
VS_DOTNET_REFERENCE_<refname>目标属性以告诉 Visual Studio 生成器 for VS 2010 及更高版本添加具有给定提示路径的 .NET 引用。添加了一个
VS_INCLUDE_IN_VSIX源文件属性来告诉 Visual Studio 生成器 适用于 VS 2010 及更高版本是否将该文件包含在 Visual Studio 扩展包中。添加了一个
VS_RESOURCE_GENERATOR源文件属性,以便为 VS 2010 及更高版本的 Visual Studio Generators 提供资源生成器的设置(仅适用于``C#`)。添加了一个
VS_USER_PROPS目标属性来告诉 Visual Studio 生成器 for VS 2010 及更高版本使用自定义 MSBuild 用户.props文件。添加了:prop_gbl:XCODE_EMIT_EFFECTIVE_PLATFORM_NAME 全局属性以告知:generator:Xcode 生成器是否发出
EFFECTIVE_PLATFORM_NAME变量。这在并行构建多个 SDK(如macosx和iphoneos)时非常有用。新的
XCODE_PRODUCT_TYPE和XCODE_EXPLICIT_FILE_TYPE目标属性被创建来告诉Xcode生成器使用生成的 Xcode 项目中目标的相应属性的自定义值。
模块¶
添加了一个
CSharpUtilities模块以帮助 Visual Studio C# 目标的参数化。它提供允许自动设置源文件属性的功能,以根据需要支持 Windows 窗体、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_PKG_TYPES、FeatureSummary_REQUIRED_PKG_TYPES 和 FeatureSummary_DEFAULT_PKG_TYPE 全局属性来调整 FeatureSummary 模块接受的包类型。
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` 选项,这些选项允许创建标头,这些标头也可以与未知或旧的编译器一起工作,只需假设它们不支持任何请求的功能。
C测试¶
ctest_memcheck()命令获得了DEFECT_COUNT <var>选项来捕获检测到的内存缺陷数量。ctest_memcheck()命令学会了从CTEST_MEMORYCHECK_SUPPRESSIONS_FILE变量中读取消毒剂抑制文件的位置。ctest_memcheck()命令学会了独立于AddressSanitizer来支持LeakSanitizer。ctest_update()命令CDASH_UPLOAD签名被教导要遵守RETRY_COUNT、RETRY_DELAY和QUIET选项。
包装¶
添加了
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()命令为DEPENDS选项获得了一个新的DEPENDENCIES别名。CPackIFW模块cpack_ifw_configure_component_group()命令获得了一个新的DEPENDS选项。还添加了DEPENDENCIES别名。CPackIFW模块cpack_ifw_configure_component()和cpack_ifw_configure_component_group()命令PRIORITY选项现已弃用,并将在未来版本的 CMake 中删除。请改用新的SORTING_PRIORITY选项。CPack IFW Generator获得了新的CPACK_IFW_PACKAGE_WATERMARK,CPACK_IFW_PACKAGE_BANNER,CPACK_IFW_PACKAGE_BACKGROUND,CPACK_IFW_PACKAGE_WIZARD_STYLE, :variable:` CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH`, :variable:` CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT` 和CPACK_IFW_PACKAGE_TITLE_COLOR变量来自定义 QtIFW 安装程序外观。CPack productbuild Generator获得了对包进行签名的选项。请参阅变量CPACK_PRODUCTBUILD_IDENTITY_NAME、CPACK_PRODUCTBUILD_KEYCHAIN_PATH、CPACK_PKGBUILD_IDENTITY_NAME和CPACK_PKGBUILD_KEYCHAIN_PATH。CPack RPM Generator学会了忽略所提供的rpmbuild工具不支持的标签。如果设置了不受支持的标签,它们将被忽略并打印出开发人员警告。CPack RPM Generator学会了生成主要组件包,它强制为定义的组件生成 rpm,文件名和包名称中没有组件后缀。请参阅CPACK_RPM_MAIN_COMPONENT变量。CPack RPM Generator学会了按需生成单个debuginfo包,即使使用组件打包也是如此。请参阅CPACK_RPM_DEBUGINFO_SINGLE_PACKAGE变量。CPack RPM Generator学会了在使用CPACK_RPM_USER_FILELIST变量时支持每个文件的多个指令。
其他¶
使用加密哈希的 CMake 功能现在支持 SHA-3 算法。
添加了一个新的生成器表达式“$<IF:cond,true-value,false-value>”。如果条件为“1”,则解析为真值;如果条件为“0”,则解析为假值。
弃用和删除的功能¶
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 变量读取的额外消毒剂选项附加到消毒剂内部使用的环境变量中。FeatureSummary模块set_package_properties()命令在未明确设置类型时不再强制包类型为“可选”。Compile Features功能现在可以识别 UNIX 和 Windows 平台上英特尔 C++ 编译器版本 12.1 到 17.0 支持的功能。调用:module: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。