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()
命令新增了BYPRODUCTS
选项,用于指定自定义命令的副产品文件。这些不是输出文件,因为它们不一定比输入文件更新。add_custom_command()
和add_custom_target()
命令新增了USES_TERMINAL
选项,用于在可能的情况下请求命令直接访问终端。Ninja
生成器会将此类命令放置在console
池
中。CMake 提供的用于单独交互式使用的构建目标(例如install
)现在已放置在此池中。add_custom_command()
和add_custom_target()
命令新增了USES_TERMINAL
选项,用于在可能的情况下请求命令直接访问终端。Ninja
生成器会将此类命令放置在console
池
中。CMake 提供的用于单独交互式使用的构建目标(例如install
)现在已放置在此池中。新增了
continue()
命令,可以在循环上下文中调用,以结束当前迭代并开始循环块顶部的下一次迭代。continue()
命令新增了,可以在循环上下文中调用,以结束当前迭代并开始循环块顶部的下一次迭代。file(LOCK)
子命令被创建,以允许 CMake 进程通过文件和目录锁进行同步。file(LOCK)
子命令被创建,以允许 CMake 进程通过文件和目录锁进行同步。file(STRINGS)
现在支持 UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE 作为ENCODING
选项。file(STRINGS)
现在支持 UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE 作为ENCODING
选项。install(EXPORT)
命令现在可以与绝对DESTINATION
一起使用,即使导出集中的目标以相对于安装前缀的目的地或 使用要求 进行安装。CMAKE_INSTALL_PREFIX
变量的值会被硬编码到安装的导出文件中,作为相对引用的基础。install(EXPORT)
命令现在可以与绝对DESTINATION
一起使用,即使导出集中的目标以相对于安装前缀的目的地或 使用要求 进行安装。CMAKE_INSTALL_PREFIX
变量的值会被硬编码到安装的导出文件中,作为相对引用的基础。try_compile()
命令的源文件签名现在会考虑生成测试项目中的链接标志(例如CMAKE_EXE_LINKER_FLAGS
)。请参阅策略CMP0056
。try_compile()
命令的源文件签名现在会考虑生成测试项目中的链接标志(例如CMAKE_EXE_LINKER_FLAGS
)。请参阅策略CMP0056
。try_run()
命令现在会像try_compile()
一样,支持LINK_LIBRARIES
选项。try_run()
命令现在会像try_compile()
一样,支持LINK_LIBRARIES
选项。file(GENERATE)
命令现在会以与输入文件相同的权限生成输出文件(如果已设置)。file(GENERATE)
命令现在会以与输入文件相同的权限生成输出文件(如果已设置)。file(GENERATE)
命令现在可以生成用作构建系统目标的源文件的文件。生成的文件的GENERATED
属性会自动设置为TRUE
。file(GENERATE)
命令现在可以生成用作构建系统目标的源文件的文件。生成的文件的GENERATED
属性会自动设置为TRUE
。
变量 (Variables)¶
引入了
CMAKE_MATCH_COUNT
变量,用于记录在if()
命令或string()
命令的最后一次正则表达式匹配中找到的匹配项数量。
属性 (Properties)¶
引入了
ANDROID_API_MIN
目标属性,用于指定工具链的目标最低版本。为
.hlsl
文件添加了VS_SHADER_FLAGS
源文件属性,用于指定 Visual Studio 生成器的附加着色器标志。
模块 (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()
命令学习了支持 Delphi 覆盖率。ctest_coverage()
命令学习了支持 Javascript 覆盖率。ctest_coverage()
命令学习了支持 Javascript 覆盖率。引入了
CTestCoverageCollectGCOV
模块,作为ctest_coverage()
命令收集gcov
结果以提交到 CDash 的替代方案。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
命令现在支持使用J
标志创建.xz
压缩的存档。cmake(1)
-E tar
命令新增了--files-from=<file>
选项,用于通过文件中的行来指定文件名,以克服命令行长度限制。cmake(1)
-E tar
命令新增了--files-from=<file>
选项,用于通过文件中的行来指定文件名,以克服命令行长度限制。cmake(1)
-E tar
命令新增了--mtime=<date>
选项,用于指定 tarball 条目中记录的修改时间。cmake(1)
-E tar
命令新增了--mtime=<date>
选项,用于指定 tarball 条目中记录的修改时间。现在 编译功能 已支持更多编译器,包括:
Apple Clang (
AppleClang
),适用于 Xcode 4.4 至 6.1 版本。GNU 编译器版本 4.4 至 5.0(UNIX 和 Apple 平台,
GNU
)。Microsoft Visual Studio (
MSVC
),适用于 2010 至 2015 版本。Oracle SolarisStudio (
SunPro
) 版本 12.4。
AUTORCC 功能现在将
.qrc
文件中列出的文件作为依赖项进行跟踪。如果rcc
工具的输入文件发生更改,该工具将自动重新运行。
新的诊断¶
已弃用和移除的功能 (Deprecated and Removed Features)¶
使用 cmake-language(7) 编写的文件(例如
CMakeLists.txt
或*.cmake
文件)现在预期编码为 UTF-8。如果文件已经是 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()
)现在支持 SSL/TLS,即使 CMake 未与 OpenSSL 链接。默认使用 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 时,会自动添加一个适当的选项来选择标准库。