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 版本学习了为其生成项目的技能。可以设置 CMAKE_SYSTEM_NAME 变量为 Androidcmake(1) 命令行或 CMAKE_TOOLCHAIN_FILE 中以激活此平台。

语法

命令

Variables

  • Visual Studio 8 (2005) 及更高版本生成器从新的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 了解如何支持 lzma 压缩源 tar 包,包括 .7z.tar.xz.txz 扩展。

  • 模块 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 选项,用于在下载源 tar 包时禁用进度输出。

  • 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 现在提供了导入的 target。

  • 模块 GenerateExportHeader 的函数 generate_export_header 学会允许与 对象库 一起使用。

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

  • 模块 UseSWIG 学会从 .i 源文件中检测模块名称(如果可能),以避免需要显式设定 SWIG_MODULE_NAME 源文件属性。

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

生成器表达式

  • 新增 COMPILE_FEATURES 生成器 表达式 允许根据可用的编译器功能设定构建属性。

CTest

CPack

其他

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

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

  • 对象库 现在可以拥有只要在链接普通库时不影响链接的其它来源,而不用编译为对象文件(例如 .dat 可以,而 .def 则不行)。

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

  • Visual Studio 生成器学会将 .hlsl 源文件作为高级着色语言来源处理(在 .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() 命令建立的回调函数在设置未记录的 CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS variable 时,将不再接收 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 会避免重复与共享库目标相对应的项目。

  • 对 Open Watcom 编译器的支持已全面修订。CMAKE_<LANG>_COMPILER_ID 现为 OpenWatcom,而 CMAKE_<LANG>_COMPILER_VERSION 现在使用 Open Watcom 外部版本编号。外部版本号比内部版本号低 11。

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