CMake 3.2 发行说明

自 CMake 3.1 以来的更改包括以下内容。

新特性

语法

  • CMake 学会在 Windows 上支持 Unicode 字符 编码为 UTF-8。这在系统 API 接受 UTF-8 编码字符串的平台上已经支持。Unicode 字符现在可以用于 CMake 代码、源文件路径、配置文件(如 .h.in 文件)以及 CMake 读取和写入的其他文件中。请注意,由于 CMake 与许多其他工具交互操作,因此在使用某些 Unicode 字符时可能仍然存在一些限制。

命令

  • add_custom_command()add_custom_target() 命令学习了一个新的 BYPRODUCTS 选项,用于指定作为自定义命令的副作用生成的文件。这些不是输出,因为它们不一定总是比输入新。

  • add_custom_command()add_custom_target() 命令学习了一个新的 USES_TERMINAL 选项,用于请求尽可能直接访问终端的命令。Ninja 生成器会将此类命令放在 console pool 中。CMake 提供的旨在供个人交互使用的构建目标(例如 install)现在也放在此池中。

  • 添加了一个新的 continue() 命令,可以在循环上下文中调用该命令以结束当前迭代并在循环块的顶部开始下一次迭代。

  • 创建了 file(LOCK) 子命令,以允许 CMake 进程通过文件和目录锁进行同步。

  • file(STRINGS) 现在支持 UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE 作为 ENCODING 选项。

  • install(EXPORT) 命令现在可以与绝对 DESTINATION 一起使用,即使导出集中目标安装的目标或 用法要求 相对于安装前缀指定也是如此。CMAKE_INSTALL_PREFIX 变量的值被硬编码到已安装的导出文件中,作为相对引用的基础。

  • try_compile() 命令源文件签名现在遵循生成的测试项目中的链接标志(例如 CMAKE_EXE_LINKER_FLAGS)。请参阅策略 CMP0056

  • try_run() 命令学会像 try_compile() 已经做的那样遵循 LINK_LIBRARIES 选项。

  • file(GENERATE) 命令现在生成输出文件,其权限与输入文件(如果已设置)相同。

  • file(GENERATE) 命令现在可以生成用作构建系统目标源文件的文件。生成的文件会自动将其 GENERATED 属性设置为 TRUE

变量

属性

  • 引入了 ANDROID_API_MIN 目标属性,用于指定工具链要定位的最低版本。

  • 添加了 VS_SHADER_FLAGS 源文件属性,用于为 Visual Studio 生成器中的 .hlsl 文件指定附加的着色器标志。

模块

  • ExternalData 模块学习了支持 自定义获取脚本。这允许项目指定自定义 .cmake 脚本,用于在构建期间获取数据对象。

  • ExternalProject 模块学习了创建独立外部项目步骤目标的选项,这些目标不依赖于内置步骤。

  • ExternalProject 模块 ExternalProject_Add() 命令学习了一个新的 CMAKE_CACHE_DEFAULT_ARGS 选项,用于初始化外部项目中的缓存值,而无需在未来的构建中设置它们。

  • ExternalProject 模块 ExternalProject_Add() 命令学习了一个新的 TEST_EXCLUDE_FROM_MAIN 选项,用于从主构建中排除测试。

  • ExternalProject 模块 ExternalProject_Add() 命令学习了一个新的 UPDATE_DISCONNECTED 选项,以避免从版本控制自动更新源代码树检出。

  • FindCUDA 模块了解了 CUDA 7.0 中的 cusolver 库。

  • FindGit 模块学习了查找随 GitHub for Windows 一起安装在用户主目录中的 git 命令行工具。

  • 引入了 FindGSL 模块来查找 GNU 科学库。

  • 引入了 FindIntl 模块来查找 Gettext libintl 库。

  • FindLATEX 模块学习了支持组件。

  • FindMPI 模块学习了在 Windows 上查找 MS-MPI。

  • FindOpenSSL 模块现在分别在 OPENSSL_CRYPTO_LIBRARYOPENSSL_SSL_LIBRARY 中报告 cryptossl 库,以允许应用程序链接到一个库而无需另一个库。

  • WriteCompilerDetectionHeader 模块学习了为 cxx_thread_local 特性的可移植性创建一个定义。该定义扩展为 C++11 thread_local 关键字或预标准化编译器特定的等效项(如果适用)。

  • WriteCompilerDetectionHeader 模块学习了为每个编译器和每种语言创建多个输出文件,而不是创建一个大型文件。

CTest

CPack

其他

  • cmake(1) -E tar 命令现在支持使用 J 标志创建 .xz 压缩的归档文件。

  • cmake(1) -E tar 命令学习了一个新的 --files-from=<file> 选项,用于使用文件中的行指定文件名,以克服命令行长度限制。

  • cmake(1) -E tar 命令学习了一个新的 --mtime=<date> 选项,用于指定 tarball 条目中记录的修改时间。

  • 编译特性 功能现在可以识别更多编译器支持的特性,包括

    • 适用于 Xcode 版本 4.4 至 6.1 的 Apple Clang (AppleClang)。

    • UNIX 和 Apple 上的 GNU 编译器版本 4.4 至 5.0 (GNU)。

    • 适用于 2010 年至 2015 年版本的 Microsoft Visual Studio (MSVC)。

    • Oracle SolarisStudio (SunPro) 版本 12.4。

  • AUTORCC 功能现在将 .qrc 文件中列出的文件作为依赖项进行跟踪。如果 rcc 工具的输入文件已更改,则该工具将自动重新运行。

新的诊断信息

  • break() 命令现在拒绝在循环上下文之外或将参数传递给命令的调用。请参阅策略 CMP0055

已弃用和移除的特性

  • cmake-language(7) 编写的文件(例如 CMakeLists.txt*.cmake 文件)现在应编码为 UTF-8。如果文件已经是 ASCII,则它们将兼容。如果文件采用不同的编码(包括 Latin 1),则需要进行转换。

  • FindOpenGL 模块不再使用 FindX11 模块显式搜索对 X11 库的任何依赖项。此类依赖项不应需要显式。使用 X11 API 本身的应用程序应显式查找并链接到 X11 库。

  • CMake 的实现现在依赖于某些较旧的编译器不支持的某些 C++ 编译器特性。因此,这些旧编译器不再可用于构建 CMake 本身。但是,CMake 继续能够为这些旧编译器的用户生成 Makefile 和项目文件。已知不再能够构建 CMake 的编译器是

    • Visual Studio 6 和 7.0 -- 已被 VisualStudio 7.1 及更高版本取代。

    • GCC 2.95 -- 已被 GCC 3 和更新的编译器取代。

    • Borland 编译器 -- 已被其他 Windows 编译器取代。

    • Compaq 编译器 -- 已被其他编译器取代。

    • SGI 编译器 -- IRIX 已被删除作为主机平台。

其他更改

  • 在 Windows 和 OS X 上,通过 https 支持网络通信的命令(例如 file(DOWNLOAD), file(UPLOAD), 和 ctest_submit())即使 CMake 不是针对 OpenSSL 构建的,现在也支持 SSL/TLS。默认情况下使用 Windows 或 OS X 本机 SSL/TLS 实现。操作系统配置的证书颁发机构将被自动信任。

    在其他平台上,当 CMake 使用 OpenSSL 构建时,这些命令现在会在一些 /etc 路径中搜索操作系统配置的证书颁发机构以自动信任。

  • 在使用 Makefile 和 Ninja 生成器的 OS X 上,如果在 /usr/bin 中找到编译器,则现在将其映射到 Xcode 应用程序文件夹内的相应编译器(如果有)。即使 xcode-select 切换到不同的 Xcode 安装,这也允许此类构建树继续使用其原始编译器。

  • Visual Studio 生成器现在以 UTF-8 而不是 Windows-1252 写入解决方案和项目文件。Windows-1252 支持拉丁语 1 语言,例如在北美、南美和西欧发现的那些语言。使用 UTF-8,现在支持其他语言。

  • Xcode 生成器不再需要预先找到 CMAKE_MAKE_PROGRAM 变量的值。它现在在构建时需要时查找 xcodebuild

  • 当使用 SolarisStudio 12 构建 CMake 本身时,默认的 libCStd 标准库不足以构建 CMake。SolarisStudio 发行版支持使用 STLPort4libstdc++ 的编译器选项。现在,在使用 SolarisStudio 编译器构建 CMake 时,会自动添加选择标准库的适当选项。