CMake 3.7 发布说明

CMake 3.6 以来的更改包括:

新特性

平台

  • CMake 现在支持使用简单的工具链文件进行交叉编译 Android

  • AIX 现在支持 Clang 编译器。

生成器

  • 当使用具有必要功能的 `ninja` 工具时,Ninja 生成器学会了有条件地支持 Fortran。有关详细信息,请参阅生成器文档。

  • Ninja 生成器学会了生成类似 `sub/dir/{test,install,package}` 形式的伪目标,以驱动子目录安装、测试或打包目标的构建。这相当于与Makefile 生成器一起执行 `cd sub/dir; make {test,install,package}`。

  • 添加了Visual Studio 15 2017 生成器。这是实验性的,基于“Visual Studio 2017 RC”,因为此版本的 VS 尚未发布。

  • VS 2010 及以上版本的Visual Studio 生成器学会了将 `.natvis` 源文件正确放置到 VS 项目文件中。

  • Xcode 生成器初步的 Swift 语言支持学会了遵循新的CMAKE_Swift_LANGUAGE_VERSION 变量,以告知 Xcode 源文件使用的 Swift 版本。

  • CodeLite 生成器获得了一个新的CMAKE_CODELITE_USE_TARGETS 选项,以将项目创建从项目更改为目标。

命令

  • `add_custom_command()` 命令获得了一个新的 `DEPFILE` 选项,该选项与Ninja 生成器配合使用,为构建工具提供隐式依赖信息。

  • `cmake_parse_arguments()` 命令获得了一个新的 `PARSE_ARGV` 模式,用于在 `function()` 函数体中直接从 `ARGC` 和 `ARGV#` 变量读取参数。

  • `export()` 命令获得了一个 `ANDROID_MK` 选项,用于生成 `Android.mk` 文件,这些文件将 CMake 构建的库作为预构建文件引用到 Android NDK 构建系统中。

  • `file(DOWNLOAD)` 和 `file(UPLOAD)` 命令获得了 `HTTPHEADER ` 和 `USERPWD :` 选项。

  • `find_library()` 和 `find_package()` 命令学会了在目标为 32 位架构时搜索 `lib32/` 目录。请参阅全局属性 `FIND_LIBRARY_USE_LIB32_PATHS`。

  • `find_package()` 命令通过设置新的变量 `CMAKE_FIND_PACKAGE_SORT_ORDER` 和 `CMAKE_FIND_PACKAGE_SORT_DIRECTION`,可以按 `NAME` 或 `NATURAL` 排序方式对兼容库进行排序。

  • `if()` 命令获得了新的布尔比较操作符 `LESS_EQUAL`、`GREATER_EQUAL`、`STRLESS_EQUAL`、`STRGREATER_EQUAL`、`VERSION_LESS_EQUAL` 和 `VERSION_GREATER_EQUAL`。

  • `install()` 命令获得了一个 `EXPORT_ANDROID_MK` 子命令,用于安装 `Android.mk` 文件,这些文件将安装的库作为预构建文件引用到 Android NDK 构建系统中。

  • `string(TIMESTAMP)` 和 `file(TIMESTAMP)` 命令增加了对 `%a` 和 `%b` 占位符的支持。它们分别是缩写的星期几和月份名称。

  • `try_compile()` 命令的源文件签名现在可以遵循生成测试项目中的特定配置标志(例如 `CMAKE__FLAGS_DEBUG`)。之前只使用了当前工具链的默认标志。请参阅策略 `CMP0066`。

变量

  • 添加了变量 `CMAKE_FIND_PACKAGE_SORT_ORDER` 来控制 `find_package()` 命令的排序模式。

  • 添加了变量 `CMAKE_FIND_PACKAGE_SORT_DIRECTION` 来控制 `find_package()` 命令的排序方向。

  • 工具链文件现在可以设置 `CMAKE__FLAGS_INIT` 变量,以在构建树中首次启用语言时初始化 `CMAKE__FLAGS` 缓存条目。

  • 工具链文件现在可以设置 `CMAKE_EXE_LINKER_FLAGS_INIT`、`CMAKE_SHARED_LINKER_FLAGS_INIT` 和 `CMAKE_MODULE_LINKER_FLAGS_INIT` 变量,以在构建树中首次启用语言时初始化 `CMAKE_EXE_LINKER_FLAGS`、`CMAKE_SHARED_LINKER_FLAGS` 和 `CMAKE_MODULE_LINKER_FLAGS` 缓存条目。

属性

  • 在 Apple 平台上,`BUNDLE_EXTENSION` 目标属性现在也适用于 Frameworks 和 App Bundles。

  • 添加了一个 `BINARY_DIR` 目录属性,用于获取与读取属性的源目录对应的二进制目录的绝对路径。

  • 添加了一个 `BUILDSYSTEM_TARGETS` 目录属性,用于获取项目在目录中添加的逻辑构建系统目标的列表。

  • 引入了 `LINK_WHAT_YOU_USE` 目标属性和支持变量 `CMAKE_LINK_WHAT_YOU_USE`,用于检测(在 UNIX 上)链接但未被使用的共享库,通过运行 `ldd -r -u`。

  • 添加了一个 `SOURCE_DIR` 目录属性,用于获取与目录关联的源目录的绝对路径。

  • 添加了一个 `SUBDIRECTORIES` 目录属性,用于获取项目在目录中添加的子目录列表。

  • 添加了一个 `VS_SDK_REFERENCES` 目标属性,用于告知Visual Studio 生成器引用指定的 SDK。

  • 创建了一个 `VS_TOOL_OVERRIDE` 源文件属性,用于告知Visual Studio 生成器为源文件使用哪个工具。

  • 当 `ENABLE_EXPORTS` 属性设置为真时,`WINDOWS_EXPORT_ALL_SYMBOLS` 目标属性现在也适用于可执行目标。

  • 添加了一个 `XCODE_FILE_ATTRIBUTES` 源文件属性,用于告知 Xcode 生成器为该文件在 Xcode 项目属性中生成自定义内容。

模块

  • 添加了一个 `AndroidTestUtilities` 模块,用于管理测试数据到 Android 设备的传输。

  • `CheckFortranSourceCompiles` 模块命令 `check_fortran_source_compiles()` 获得了 `SRC_EXT` 选项,用于指定自定义测试 Fortran 源文件扩展名。

  • `ExternalProject` 模块获得了 `HTTP_USERNAME` 和 `HTTP_PASSWORD` 选项,用于设置 HTTP 下载凭据。

  • `ExternalProject` 模块获得了 `HTTP_HEADER` 选项,用于添加 HTTP 下载头。

  • `FindBISON` 模块命令 `bison_target()` 学会了一个新的 `REPORT_FILE` 选项,用于指定 bison 的 `--report-file=` 选项。

  • `FindBZip2` 模块现在提供导入的目标。

  • 引入了一个 `FindICU` 模块,用于查找 International Components for Unicode (ICU) 库和程序。

  • `FindMatlab` 模块学会了查找 SIMULINK 和 MAT 组件。

  • `FindMatlab` 模块命令 `matlab_add_mex()` 学会了添加可执行文件和模块。

  • `FindMatlab` 模块命令 `matlab_add_unit_test()` 学会了支持内联 Matlab 测试代码。

  • `FindOpenCL` 模块现在提供导入的目标。

  • `FindOpenMP` 模块学会了从编译器检测 OpenMP 版本(规格日期)。

  • 添加了一个 `FindVulkan` 模块。

  • `GenerateExportHeader` 模块获得了一个新的 `CUSTOM_CONTENT_FROM_VARIABLE` 选项,用于指定一个包含自定义内容的变量,以包含在生成的头文件中。

  • `GNUInstallDirs` 模块获得了一个新的 `GNUInstallDirs_get_absolute_install_dir()` 命令。

  • `UseJava` 模块获得了 API,用于“导出”jar 目标供外部 CMake 项目使用。请参阅 `install_jar_exports` 和 `export_jars` 函数。

CTest

  • CTest 现在通过新的测试属性 `FIXTURES_SETUP`、`FIXTURES_CLEANUP` 和 `FIXTURES_REQUIRED` 支持测试套件。当使用正则表达式或 `--rerun-failed` 来限制要运行的测试时,如果任何测试需要该测试套件,其设置和清理测试将自动添加到执行集中。

  • `ctest_configure()`、`ctest_build()`、`ctest_test()`、`ctest_coverage()` 和 `ctest_upload()` 命令获得了一个新的 `CAPTURE_CMAKE_ERROR` 选项,用于将命令运行过程中发生的任何错误捕获到一个变量中,并避免影响 `ctest(1)` 进程的返回码。

CPack

  • CPack 在 OS X 上获得了 `CPack productbuild Generator`。

  • CPack 获得了一个新的 `CPACK_PACKAGE_CHECKSUM` 变量,用于为每个包文件生成校验和文件。

  • `CPack DEB Generator` 学会了在存档格式设置为 GNU tar 时支持长文件名。请参阅 `CPACK_DEBIAN_ARCHIVE_TYPE`。

  • `CPackIFW` 模块获得了一个新的 `cpack_ifw_add_package_resources()` 命令,用于在安装程序二进制文件中包含其他资源。

  • `CPackIFW` 模块的 `cpack_ifw_configure_component()` 和 `cpack_ifw_configure_component_group()` 命令获得了一个新的 `USER_INTERFACES` 选项,用于向 IFW 安装程序添加一个额外的页面列表。

  • `CPack RPM Generator` 学会了按需生成 debuginfo 包。请参阅 `CPACK_RPM_DEBUGINFO_PACKAGE` 及其每个组件的版本。

  • `CPack RPM Generator` 学会了按需生成源代码 RPM (SRPM) 包。请参阅 `CPACK_RPM_PACKAGE_SOURCES`、`CPACK_RPM_SOURCE_PKG_BUILD_PARAMS` 和 `CPACK_RPM_SOURCE_PKG_PACKAGING_INSTALL_PREFIX`。

  • `CPack NSIS Generator` 现在支持 `CPACK_NSIS__INSTALL_DIRECTORY`。这可用于设置特定组件的安装目录。

  • `CPack WIX Generator` 现在支持 `CPACK_WIX_SKIP_PROGRAM_FOLDER`,以允许指定 ProgramFiles 文件夹之外的自定义绝对安装前缀。

  • `CPack WIX Generator` 现在支持 `CPACK_COMPONENT__DISABLED`。这可以用于默认情况下取消选择一个组件的安装。

  • `CPack WIX Generator` 现在支持 Feature 元素的 `CPACK_WIX_PATCH_FILE` 片段。

  • `CPack WIX Generator` 现在支持 `CPACK_WIX_ROOT_FEATURE_TITLE` 和 `CPACK_WIX_ROOT_FEATURE_DESCRIPTION`,以允许为根 Feature 元素指定自定义标题和描述。

其他 (Other)

  • `cmake(1)` 获得了一个 `-E capabilities` 选项,用于提供 CMake 工具功能(可用生成器等)的可机读(JSON)描述。

  • 添加了一个新的 `cmake-server(7)` 模式,通过 JSON 协议为客户端提供关于 CMake 生成的构建系统的语义信息。目前所有协议都处于实验阶段,可能会发生变化。

  • `cmake(1)` 命令学会了一个 `--trace-source=` 选项。

  • `ccmake(1)` 学会了支持类似 vim 的导航绑定。

  • `cmake-gui(1)` 增加了一个按钮,用于打开为Visual Studio 生成器和 Xcode 生成器生成的项目文件。

已弃用和移除的功能 (Deprecated and Removed Features)

  • 我们不再从 `cmake.org` 提供 Linux i386 二进制文件供下载新版本的 CMake。

  • Vim 支持文件 `cmake-indent.vim`、`cmake-syntax.vim` 和 `cmake-help.vim` 已被移除,取而代之的是现已从 `vim-cmake-syntax` 项目提供的文件。

  • 放弃了使用某些编译器构建 CMake 本身的支持

    • Visual Studio 7.1 和 2005 — 已被 VS 2008 及更高版本取代

    • MinGW.org mingw32 — 已被 MSYS2 mingw32 和 mingw64 取代

    CMake 仍然支持使用这些编译器为其他项目生成构建系统。

其他更改 (Other Changes)

  • Fortran 依赖扫描器学会了支持Fortran Submodules的语法。

  • 来自 `vim-cmake-syntax` 项目的 Vim 支持文件 `indent/cmake.vim` 和 `syntax/cmake.vim` 现在随 CMake 分发。