CMake 3.2 发行说明¶
自 CMake 3.1 以来进行了一些更改,包括以下内容。
新特性¶
语法¶
CMake 在 Windows 上学会了支持 编码为 UTF-8 的 unicode 字符。这在系统 API 接受 UTF-8 编码字符串的平台上已经支持。Unicode 字符现在可以在 CMake 代码、源文件路径、配置文件(如
.h.in文件)以及 CMake 读取和写入的其他文件中使用。请注意,由于 CMake 与许多其他工具进行互操作,因此在使用某些 unicode 字符时可能仍然存在一些限制。
命令 (Commands)¶
add_custom_command()和add_custom_target()命令新增了BYPRODUCTS选项,用于指定自定义命令的副作用生成的文件。这些不是输出,因为它们不一定比输入更新。add_custom_command()和add_custom_target()命令新增了USES_TERMINAL选项,用于请求命令在可能的情况下直接访问终端。Ninja生成器会将此类命令放入console池。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。
变量 (Variables)¶
引入了
CMAKE_MATCH_COUNT变量,用于记录在if()命令或string()命令中上一次正则表达式匹配的匹配数。
属性 (Properties)¶
引入了
ANDROID_API_MIN目标属性,用于指定工具链的目标最低版本。新增了
VS_SHADER_FLAGS源文件属性,用于为 Visual Studio 生成器指定.hlsl文件的额外着色器标志。
模块 (Modules)¶
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 Scientific Library。引入了
FindIntl模块,用于查找 Gettextlibintl库。FindLATEX模块学会了支持组件。FindMPI模块学会了在 Windows 上查找 MS-MPI。FindOpenSSL模块现在分别在OPENSSL_CRYPTO_LIBRARY和OPENSSL_SSL_LIBRARY中报告crypto和ssl库,以便应用程序可以只链接其中一个。WriteCompilerDetectionHeader模块学会了为cxx_thread_local特性创建可移植性宏。该宏将展开为 C++11 的thread_local关键字,或者根据情况的标准化前的编译器特定等效项。WriteCompilerDetectionHeader模块学会了为每个编译器和每种语言创建多个输出文件,而不是创建一个大文件。
CTest¶
ctest_coverage()命令学会了支持 Delphi 覆盖率。ctest_coverage()命令学会了支持 Javascript 覆盖率。引入了
CTestCoverageCollectGCOV模块,作为ctest_coverage()命令收集gcov结果以提交到 CDash 的替代方案。
CPack¶
CPack RPM Generator学会了设置每个组件的描述和摘要的选项。请参阅CPACK_RPM_<component>_PACKAGE_DESCRIPTION和CPACK_RPM_<component>_PACKAGE_SUMMARY变量。CPack RPM Generator学会了设置安装前和安装后脚本的依赖项的选项。请参阅CPACK_RPM_PACKAGE_REQUIRES_PRE和CPACK_RPM_PACKAGE_REQUIRES_POST变量。CPack RPM Generator学会了设置卸载前和卸载后脚本的依赖项的选项。请参阅CPACK_RPM_PACKAGE_REQUIRES_PREUN和CPACK_RPM_PACKAGE_REQUIRES_POSTUN变量。CPack RPM Generator学会了一个新的CPACK_RPM_<COMPONENT>_PACKAGE_PREFIX变量,用于指定一个特定组件的值来替代CPACK_PACKAGING_INSTALL_PREFIX。CPack RPM Generator学会了一个新的CPACK_RPM_RELOCATION_PATHS变量,用于为单个 rpm 包指定多个重定位前缀。
其他¶
cmake(1)的-E tar命令现在支持使用J标志创建.xz压缩的存档。cmake(1)的-E tar命令新增了--files-from=<file>选项,用于通过文件中的行指定文件名,以克服命令行长度限制。cmake(1)的-E tar命令新增了--mtime=<date>选项,用于指定 tarball 条目中记录的修改时间。编译功能 现在能够识别更多编译器支持的功能,包括:
Apple Clang (
AppleClang) for Xcode versions 4.4 through 6.1。GNU 编译器版本 4.4 到 5.0(在 UNIX 和 Apple 上,
GNU)。Microsoft Visual Studio (
MSVC) for versions 2010 through 2015。Oracle SolarisStudio (
SunPro) version 12.4。
AUTORCC 功能现在将
.qrc文件中列出的文件跟踪为依赖项。如果rcc工具的输入文件发生更改,该工具将自动重新运行。
新诊断¶
已弃用和移除的功能 (Deprecated and Removed Features)¶
现在要求使用 UTF-8 编码来写入
cmake-language(7)(如CMakeLists.txt或*.cmake文件)。如果文件已经是 ASCII 编码,则兼容。如果文件使用其他编码(包括 Latin 1),则需要进行转换。FindOpenGL模块不再通过FindX11模块显式搜索对 X11 库的任何依赖。这类依赖项不应显式指定。使用 X11 API 的应用程序本身应显式查找并链接到 X11 库。CMake 的实现现在依赖于一些 C++ 编译器功能,而这些功能不被某些旧编译器支持。因此,这些旧编译器不能再用于构建 CMake 本身。然而,CMake 仍然能够为这些旧编译器的用户生成 Makefiles 和项目文件。已知不再能构建 CMake 的编译器有:
Visual Studio 6 和 7.0 — 已被 VisualStudio 7.1 及更高版本取代。
GCC 2.95 — 已被 GCC 3 及更高版本编译器取代。
Borland 编译器 — 已被其他 Windows 编译器取代。
Compaq 编译器 — 已被其他编译器取代。
SGI 编译器 — IRIX 已被弃用为主机平台。
其他更改 (Other Changes)¶
在 Windows 和 OS X 上,支持通过
https进行网络通信的命令(如file(DOWNLOAD)、file(UPLOAD)和ctest_submit())现在即使 CMake 未构建 OpenSSL 也支持 SSL/TLS。默认使用 Windows 或 OS X 的原生 SSL/TLS 实现。操作系统配置的证书颁发机构将自动被信任。在其他平台上,当 CMake 使用 OpenSSL 构建时,这些命令现在会在几个
/etc路径中搜索操作系统配置的证书颁发机构以自动信任。在 OS X 上使用 Makefile 和 Ninja 生成器时,如果在
/usr/bin中找到编译器,现在会将其映射到 Xcode 应用程序文件夹中的相应编译器(如果存在)。这使得此类构建树即使在xcode-select切换到不同的 Xcode 安装时也能继续使用其原始编译器。Visual Studio 生成器现在使用 UTF-8 而不是 Windows-1252 写入解决方案和项目文件。Windows-1252 支持北美的南美和西欧等地区使用的拉丁语。使用 UTF-8,现在支持更多语言。
Xcode生成器不再需要在前端定位CMAKE_MAKE_PROGRAM变量。它现在在构建时按需定位xcodebuild。当使用 SolarisStudio 12 构建 CMake 本身时,默认的
libCStd标准库不足以构建 CMake。SolarisStudio 发行版支持使用STLPort4或libstdc++的编译器选项。在用 SolarisStudio 编译器构建 CMake 时,现在会自动添加一个适当的选项来选择标准库。