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。
