CMake 3.8 发行说明¶
自 CMake 3.7 以来的更改包括以下内容。
新特性¶
语言¶
C#¶
CMake 现在支持将
CSharp(C#) 作为一等语言,可以通过project()和enable_language()命令启用。目前,它由 VS 2010 及以上版本的 Visual Studio 生成器 支持。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 Toolkit 编译器 (
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功能现在支持从 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对目标的 clean 操作会包含其依赖项。)添加了
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源文件属性现在支持生成器表达式。在 Apple 目标上,
FRAMEWORK目标属性现在也可以应用于静态库。它将生成一个合适的 Framework,但其中包含一个静态库。导入 接口库 现在具有新的目标属性
IMPORTED_LIBNAME和IMPORTED_LIBNAME_<CONFIG>,用于指定链接库名称,因为接口库不构建自己的库文件。引入了
<LANG>_CPPLINT目标属性和支持的CMAKE_<LANG>_CPPLINT变量,用于告知 Makefile 生成器 和Ninja生成器在编译 C 和 C++ 语言时运行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>目标属性,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 添加带有给定提示路径的 .NET 引用。添加了
VS_INCLUDE_IN_VSIX源文件属性,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 是否将文件包含在 Visual Studio 扩展包中。添加了
VS_RESOURCE_GENERATOR源文件属性,用于为 VS 2010 及以上版本的 Visual Studio 生成器 提供资源生成器设置(仅限 C#)。添加了
VS_USER_PROPS目标属性,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 使用自定义的 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_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选项,允许创建对于未知或旧编译器也能工作的头文件,只需假定它们不支持任何请求的功能。
CTest¶
ctest_memcheck()命令增加了DEFECT_COUNT <var>选项,用于捕获检测到的内存缺陷数量。ctest_memcheck()命令现在可以从CTEST_MEMORYCHECK_SUPPRESSIONS_FILE变量读取 sanitizer 的抑制文件位置。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 Generator增加了新的变量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 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,则解析为 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()命令不再自动向AddressSanitizer使用的选项中添加leak_check=1。AddressSanitizer的默认行为是运行LeakSanitizer来检查泄漏,除非设置了leak_check=0。ctest_memcheck()命令已修复,可以正确地将从CTEST_MEMORYCHECK_SANITIZER_OPTIONS变量读取的额外 sanitizer 选项追加到 sanitizer 内部使用的环境变量中。FeatureSummary模块的set_package_properties()命令在未显式设置类型时,不再强制将包类型设置为OPTIONAL。Compile Features功能现在支持 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。