CMake 3.1 版本说明

自 CMake 3.0 以来的变更包括以下内容。

文档变更

新功能

生成器

Windows Phone 和 Windows Store

  • Visual Studio 11 (2012) 及更高版本的生成器学会了为 Windows Phone 和 Windows Store 生成项目。可以在 cmake(1) 命令行或 CMAKE_TOOLCHAIN_FILE 中将 CMAKE_SYSTEM_NAME 变量设置为 WindowsPhoneWindowsStore 来激活这些平台。还可以将 CMAKE_SYSTEM_VERSION 设置为 8.08.1 来指定目标 Windows 的版本。

NVIDIA Nsight Tegra

  • Visual Studio 10 (2010) 及更高版本的生成器学会了为 NVIDIA Nsight Tegra Visual Studio Edition 生成项目。可以在 cmake(1) 命令行或 CMAKE_TOOLCHAIN_FILE 中将 CMAKE_SYSTEM_NAME 变量设置为 Android 来激活此平台。

语法

命令

变量

  • Visual Studio 8 (2005) 及更高版本的 Visual Studio 生成器学会了在未在生成器名称中指定目标平台名称时,从新的 CMAKE_GENERATOR_PLATFORM 变量读取该名称。可以通过 cmake(1) 命令行上的 -A 选项指定平台名称,例如 -G "Visual Studio 12 2013" -A x64

  • 现在可以在通过 CMAKE_TOOLCHAIN_FILE 变量指定的工具链文件中初始化 CMAKE_GENERATOR_TOOLSET 变量。这对于使用 Xcode 或 Visual Studio 生成器进行交叉编译很有用。

  • 引入了 CMAKE_INSTALL_MESSAGE 变量,用于选择性地减少安装输出。

属性

模块

  • BundleUtilities 模块学会了在 OS X 上解析和替换 @rpath 占位符,以便正确捆绑使用它们的应用程序。

  • CMakePackageConfigHelpers 模块的 configure_package_config_file() 命令新增了 INSTALL_PREFIX 选项,用于生成非 CMAKE_INSTALL_PREFIX 的前缀的包配置文件。

  • 新增了 CheckFortranSourceCompiles 模块,提供 check_fortran_source_compiles() 命令。

  • ExternalData 模块学会了容忍对缺失源文件的 DATA{} 引用,并发出警告而不是报错拒绝。这有助于开发人员编写新的 DATA{} 引用来测试尚未创建的测试输出。

  • ExternalProject 模块学会了支持使用 .7z.tar.xz.txz 扩展名的 lzma 压缩源 tarball。

  • ExternalProject 模块的 ExternalProject_Add 命令新增了 BUILD_ALWAYS 选项,使外部项目构建步骤在每次构建宿主项目时都运行。

  • ExternalProject 模块的 ExternalProject_Add 命令新增了 EXCLUDE_FROM_ALL 选项,使外部项目目标设置 EXCLUDE_FROM_ALL 目标属性。

  • ExternalProject 模块的 ExternalProject_Add_Step 命令新增了 EXCLUDE_FROM_MAIN 选项,使该步骤不成为主外部项目目标的直接依赖项。

  • ExternalProject 模块的 ExternalProject_Add 命令新增了 DOWNLOAD_NO_PROGRESS 选项,用于在下载源 tarball 时禁用进度输出。

  • FeatureSummary 模块的 feature_summary API学会了接受 WHAT 选项的多个值,并适当地组合它们。

  • FindCUDA 模块学会了支持 fatbincubin 模块。

  • FindGTest 模块的 gtest_add_tests 宏新增了 AUTO 选项,可以自动读取测试可执行文件的 SOURCES 目标属性,并扫描源文件以添加测试。

  • FindGLEW 模块现在提供导入的目标。

  • FindGLUT 模块现在提供导入的目标。

  • FindHg 模块新增了 Hg_WC_INFO 命令,用于帮助运行 hg 以提取 Mercurial 工作副本的信息。

  • 引入了 FindOpenCL 模块。

  • FindOpenMP 模块学会了支持 Fortran。

  • FindPkgConfig 模块学会了将 PKG_CONFIG 环境变量的值用作 pkg-config 可执行文件,如果已设置。

  • 引入了 FindXercesC 模块。

  • FindZLIB 模块现在提供导入的目标。

  • GenerateExportHeader 模块的 generate_export_header 命令学会了允许与 对象库 一起使用。

  • InstallRequiredSystemLibraries 模块新增了 CMAKE_INSTALL_OPENMP_LIBRARIES 选项,用于安装 MSVC OpenMP 运行时库。

  • UseSWIG 模块学会了在可能的情况下从 .i 源文件检测模块名称,以避免需要显式设置 SWIG_MODULE_NAME 源文件属性。

  • 新增了 WriteCompilerDetectionHeader 模块,允许创建用于编译器可选功能检测的可移植头文件。

生成器表达式

  • 新的 COMPILE_FEATURES 生成器表达式 允许基于可用的编译器特性设置构建属性。

CTest

  • ctest_coverage() 命令学会了读取变量 CTEST_COVERAGE_EXTRA_FLAGS 来设置 CoverageExtraFlags

  • ctest_coverage() 命令学会了使用 codecov 工具支持 Intel 覆盖文件。

  • ctest_memcheck() 命令学会了支持 sanitizer 模式,包括 AddressSanitizerMemorySanitizerThreadSanitizerUndefinedBehaviorSanitizer。可以通过新的 CTEST_MEMORYCHECK_SANITIZER_OPTIONS 变量设置选项。

CPack

其他

  • cmake(1)-E 选项新增了 env 命令。

  • cmake(1)-E tar 命令学会了支持 lzma 压缩文件。

  • 现在 对象库 可以包含不会编译成对象文件的额外源文件,只要它们不会影响普通库的链接(例如,.dat 是可以的,但 .def 不可以)。

  • Visual Studio 8 及更高版本的 Visual Studio 生成器学会了支持 ASM_MASM 语言。

  • Visual Studio 生成器学会了将 .hlsl 源文件视为 High Level Shading Language 源文件(在 .vcxproj 文件中使用 FXCompile)。新增了源文件属性 VS_SHADER_TYPEVS_SHADER_MODELVS_SHADER_ENTRYPOINT,用于指定着色器类型、模型和入口点名称。

新的诊断

已弃用和移除的功能

  • 在 CMake 3.0 中,target_link_libraries() 命令意外地允许未引用的参数使用 生成器表达式,这些表达式包含一个(以 ; 分隔的)列表。例如:

    set(libs B C)
    target_link_libraries(A PUBLIC $<BUILD_INTERFACE:${libs}>)
    

    这等同于编写:

    target_link_libraries(A PUBLIC $<BUILD_INTERFACE:B C>)
    

    在 CMake 2.8.12 中从未打算这样工作。此类生成器表达式应放在引用的参数中:

    set(libs B C)
    target_link_libraries(A PUBLIC "$<BUILD_INTERFACE:${libs}>")
    

    CMake 3.1 再次要求使用引号才能正确工作。

  • 在 CMake 3.1 之前,Makefile 生成器在生成的 makefile 中使用的 make 变量赋值中没有正确转义 #,导致它们被视为注释。这使得像

    add_compile_options(-Wno-#pragma-messages)
    

    这样的代码在 Makefile 生成器中无法工作,但在其他生成器中可以工作。现在它被正确转义了,使得跨生成器的行为一致。然而,一些项目可能尝试使用像

    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-\\#pragma-messages")
    

    这样的代码来规避原始错误。这添加了 Makefile 生成器所需的转义,但也导致其他生成器将 -Wno-\#pragma-messages 传递给 shell,而这仅在 POSIX shell 中有效。不幸的是,转义修复无法以兼容的方式进行,因此这种特定于平台和生成器的解决方法不再有效。项目代码可以测试 CMAKE_VERSION 变量的值,使其解决方法也仅限于特定版本。

  • variable_watch() 命令建立的回调将不再接收 ALLOWED_UNKNOWN_READ_ACCESS 访问类型,当未记录的 CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS 变量被设置时。未初始化变量的访问将始终报告为 UNKNOWN_READ_ACCESS

  • CMakeDetermineVSServicePack 模块现在会警告它已弃用,不再应该使用。请改用 CMAKE_<LANG>_COMPILER_VERSION 变量。

  • FindITK 模块已被完全移除。它是一个简单的包装器,围绕 find_package(ITK ... NO_MODULE)。当找不到 ITK 时,这会产生更清晰的错误消息。

  • FindVTK 模块已被完全移除。它是一个简单的包装器,围绕 find_package(VTK ... NO_MODULE)。当找不到 VTK 时,这会产生更清晰的错误消息。

    该模块还提供了查找 VTK 4.0 的兼容性支持。此功能已被弃用。

其他更改

  • cmake-gui(1) 学会了捕获由 execute_process() 命令启动的子进程的输出,并在输出窗口中显示。

  • cmake-language(7) 的生成器表达式和列表展开解析器的内部实现得到了优化,并在大型项目上显示了非平凡的速度提升。

  • Makefile 生成器学会了在 Windows 上的 GNU 工具中使用响应文件,将库目录和名称传递给链接器。

  • 在生成链接器命令行时,CMake 现在避免重复对应于 SHARED 库目标的项。

  • 对 Open Watcom 编译器的支持已得到改进。 CMAKE_<LANG>_COMPILER_ID 现在是 OpenWatcom,而 CMAKE_<LANG>_COMPILER_VERSION 现在使用 Open Watcom 的外部版本号。外部版本号比内部版本号低 11。

  • Makefile 生成器学会了在 Windows 上的 GNU 工具中使用响应文件,将库目录和名称传递给链接器。