CMake 3.1 发行说明

自 CMake 3.0 以来所做的更改包括以下内容。

文档更改

新功能

生成器

Windows Phone 和 Windows 应用商店

  • Visual Studio 11 (2012) 及更高版本的生成器学会了为 Windows Phone 和 Windows Store 生成项目。可以在 cmake(1) 命令行或 CMAKE_TOOLCHAIN_FILE 中将 CMAKE_SYSTEM_NAME 变量设置为 ``WindowsPhone`WindowsStore 来激活这些平台.同时将 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 以激活该平台。

句法

  • 变量引用转义序列cmake-language(7) 语法得到了简化,以便实现更快的实现。请参阅政策:policy:CMP0053

  • if() 命令不再自动取消引用在引号或括号参数中命名的变量。请参阅政策:policy:CMP0054

命令

变量

  • 版本 8 (2005) 及更高版本的 Visual Studio 生成器学会了从新的 CMAKE_GENERATOR_PLATFORM 变量中读取目标平台名称(当它未指定为生成器名称的一部分时)。平台名称可以在 cmake(1) 命令行中使用 -A 选项指定,例如``-G“Visual Studio 12 2013”​​-A x64``。

  • CMAKE_GENERATOR_TOOLSET 变量现在可以在由 CMAKE_TOOLCHAIN_FILE 变量指定的工具链文件中初始化。这在使用 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 generator expression 允许根据可用的编译器功能设置构建属性。

C测试

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

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

  • ctest_memcheck() 命令学会了支持清理器模式,包括 AddressSanitizerMemorySanitizerThreadSanitizerUndefinedBehaviorSanitizer。可以使用新的 CTEST_MEMORYCHECK_SANITIZER_OPTIONS 变量设置选项。

包装

其他

  • cmake(1) -E` 选项学习了一个新的 env 命令。

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

  • 对象库 现在可能有额外的源代码,只要它们不影响普通库的链接就不会编译成目标文件(例如 .dat 可以,但 .def 不行) .

  • VS 8 的 Visual Studio 生成器和后来学习支持“ASM_MASM”语言。

  • Visual Studio 生成器学会了将“.hlsl”源文件视为高级着色语言源(在“.vcxproj”文件中使用“FXCompile”)。添加了源文件属性:prop_sf:VS_SHADER_TYPEVS_SHADER_MODELVS_SHADER_ENTRYPOINT 以指定着色器类型、模型和入口点名称。

新诊断

  • 引入策略:policy:CMP0052 以控制导出目标的:prop_tgt:INTERFACE_INCLUDE_DIRECTORIES 中的目录。

弃用和删除的功能

  • 在 CMake 3.0 中, target_link_libraries() 命令意外开始允许不带引号的参数使用 generator expressions 其中包含一个(; 分隔)列表。例如::

    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 变量值以使解决方法也特定于版本。

  • 当设置未记录的 CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS 变量时,由 variable_watch() 命令建立的回调将不再接收 ALLOWED_UNKNOWN_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。

  • cmake-mode.el 主要 Emacs 编辑模式不再将 _ 视为单词的一部分,使其与其他主要模式更加一致。