CMake 3.2 发布说明¶
自 CMake 3.1 以来进行的变更包括以下内容。
新功能¶
语法¶
CMake 能够在 Windows 上支持 用 UTF-8 编码的 unicode 字符。此前已对系统 API 接受 UTF-8 编码字符串的平台提供此支持。现在可以在 CMake 代码、源文件路径、
.h.in
文件等已配置的文件以及 CMake 读取和写入的其他文件中使用 unicode 字符。注意,由于 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
即使导出的集合中的目标通过相对于安装前缀指定的 destination 或 usage requirements 来安装。变量CMAKE_INSTALL_PREFIX
的值被硬编码到已安装的 export 文件中,作为相对参考的基础。try_compile()
命令源文件签名现在允许在生成的测试项目中链接标志(例如,CMAKE_EXE_LINKER_FLAGS
)。请参见策略CMP0056
。try_run()
命令已经学会与try_compile()
已经完成一样,尊重LINK_LIBRARIES
选项。file(GENERATE)
命令现在生成输出文件,并带有与输入文件相同的权限(如果已设置)。file(GENERATE)
命令现在可以生成用作构建系统目标的源文件的文件。生成的文件会自动获取其GENERATED
属性设置为TRUE
。
变量¶
变量
CMAKE_MATCH_COUNT
引入,用于记录在if()
命令或string()
命令中匹配的最后一个正则表达式中匹配次数。
属性¶
目标属性
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
模块,用于查找 Gettextlibintl
库。FindLATEX
模块学会了支持组件。FindMPI
模块学会了在 Windows 上查找 MS-MPI。FindOpenSSL
模块现在会在OPENSSL_CRYPTO_LIBRARY
和OPENSSL_SSL_LIBRARY
中分别单独报告crypto
和ssl
库,以便应用程序无需同时链接到这两个库。WriteCompilerDetectionHeader
模块学会了创建cxx_thread_local
特性的可移植性定义。该定义将扩展为 C++11thread_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 条目中记录的修改时间。Compile Features
新增对更多编译器所支持的功能的识别,包括Xcode 4.4 到 6.1 版本的 Apple Clang(
AppleClang
)。UNIX 和 Apple 中的 4.4 到 5.0 版本的 GNU 编译器(
GNU
)。2010 到 2015 版本的 Microsoft Visual Studio(
MSVC
)。12.4 版本的 Oracle SolarisStudio(
SunPro
)。
现在,AUTORCC 特性将
.qrc
文件中列出的文件作为依赖项进行跟踪。如果rcc
工具的输入文件发生改变,则该工具将自动运行。
新诊断¶
弃用和删除的特性¶
现在,以
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 发行版支持使用STLPort4
或libstdc++
的编译器选项。现在使用 SolarisStudio 编译器构建 CMake 时,会自动添加一个选项来选择标准库。