CMake 3.6 发行说明

自 CMake 3.5 以来所做的更改包括以下内容。

新特性

生成器 (Generators)

  • Ninja 生成器学会了生成形如 sub/dir/all 的伪目标,以驱动子目录的构建。这等同于使用 Makefile 生成器时执行 cd sub/dir; make all

  • Ninja 生成器现在将在构建依赖项中包含系统头文件,以确保在系统包更新时能够正确地重新构建。

  • Visual Studio 14 2015 生成器学会了支持 Clang/C2 工具集,例如使用 -T v140_clang_3_7 选项。此功能为实验性的。

命令 (Commands)

  • add_custom_command() 和 add_custom_target() 命令学会了如何使用 CROSSCOMPILING_EMULATOR 目标属性。

  • install() 命令学会了一个新的 EXCLUDE_FROM_ALL 选项,用于排除安装规则不包含在默认安装中。

  • list() 命令增加了一个 FILTER 子命令,用于通过正则表达式过滤列表元素。

  • string(TIMESTAMP) 和 file(TIMESTAMP) 命令增加了对 %s 占位符的支持。这是自 UNIX Epoch 以来的秒数。

变量 (Variables)

  • 引入了 CMAKE_DEPENDS_IN_PROJECT_ONLY 变量,用于告知 Makefile 生成器仅将依赖项扫描限制在项目源文件和构建树中的文件。

  • 引入了新的 CMAKE_HOST_SOLARIS 变量,用于指示 CMake 何时在 Oracle Solaris 主机上运行。

  • 添加了 CMAKE__STANDARD_INCLUDE_DIRECTORIES 变量,供工具链文件使用,以指定要附加到所有编译器命令行中的系统 include 目录。

  • CMAKE__STANDARD_LIBRARIES 变量现在已记录。它供工具链文件使用,以指定要添加到所有链接器命令行中的系统库。

  • 引入了 CMAKE_NINJA_OUTPUT_PATH_PREFIX 变量,用于告知 Ninja 生成器配置生成的 build.ninja 文件以用作 subninja。

  • 添加了 CMAKE_TRY_COMPILE_PLATFORM_VARIABLES 变量,供工具链文件使用,以指定必须由 try_compile() 命令传播到测试项目中的特定于平台的变量。

  • 添加了 CMAKE_TRY_COMPILE_TARGET_TYPE 变量,用于可选地告知 try_compile() 命令构建一个静态库而不是可执行文件。这对于无法在没有自定义标志或脚本的情况下链接二进制文件的交叉编译工具链很有用。

属性 (Properties)

  • 引入了 DEPLOYMENT_REMOTE_DIRECTORY 目标属性,用于告知 Visual Studio 9 2008 和 Visual Studio 8 2005 生成器为 WinCE 项目部署和调试器设置生成“远程目录”。

  • 引入了 _CLANG_TIDY 目标属性和支持的 CMAKE__CLANG_TIDY 变量,用于告知 Makefile 生成器和 Ninja 生成器在编译 C 和 CXX 语言时与编译器一起运行 clang-tidy。

  • 引入了 TIMEOUT_AFTER_MATCH 测试属性,用于可选地告知 CTest 在匹配测试的某些输出后强制执行次要超时。

  • 引入了 VS_CONFIGURATION_TYPE 目标属性,用于为支持 VS 2010 及更高版本的 Visual Studio 生成器指定自定义项目文件类型。

  • 引入了 VS_STARTUP_PROJECT 目录属性,用于为 Visual Studio 生成器指定生成解决方案(.sln 文件)的默认启动项目。

模块 (Modules)

  • CMakePushCheckState 模块现在会推送/弹出/重置 CheckTypeSize 中使用的 CMAKE_EXTRA_INCLUDE_FILES 变量。

  • ExternalProject 模块学会了 GIT_SHALLOW 1 选项,用于执行 Git 仓库的浅克隆。

  • ExternalProject 模块学会了递归初始化 Git 子模块,并在更新时初始化新子模块。使用 GIT_SUBMODULES 选项来限制要初始化和更新的子模块。

  • ExternalProject 模块学会了 DOWNLOAD_NO_EXTRACT 1 参数,用于跳过提取下载的文件(例如,用于自解压 shell 安装程序或 .msi 文件)。

  • ExternalProject 模块现在在从 Git 仓库获取时使用 TLS_VERIFY。

  • FindBLAS 和 FindLAPACK 模块学会了支持 OpenBLAS。

  • FindCUDA 模块学会了查找 cublas_device 库。

  • FindGTest 模块的 gtest_add_tests 函数现在会导致 CMake 在测试源更改时自动重新运行,以便可以重新扫描它们。

  • 引入了 FindLTTngUST 模块,用于查找 LTTng-UST 库。

  • FindPkgConfig 模块学会了为它找到的库可选地创建导入目标。

  • FindProtobuf 模块学会了提供 Protobuf_VERSION 变量,并在 find_package() 调用中检查请求的版本号。

  • InstallRequiredSystemLibraries 模块学会了一个新的 CMAKE_INSTALL_UCRT_LIBRARIES 选项,用于在使用 Visual Studio 2015 时启用 Windows Universal CRT 库的应用程序本地部署。

平台

  • Clang 编译器现在在 CYGWIN 上受支持。

  • 添加了对 Bruce C 编译器(编译器 ID为 Bruce)的支持。

CTest

  • ctest_update() 命令现在会查看 CTEST_GIT_INIT_SUBMODULES 变量,以确定在更新之前是否应更新子模块。

  • ctest_update() 命令现在将在更新时同步子模块。添加子模块或更改子模块 URL 的更新现在将正确提取。

CPack

  • CPack DEB 生成器学会了在 CMAKE_INSTALL_RPATH 中处理 $ORIGIN,当使用 CPACK_DEBIAN_PACKAGE_SHLIBDEPS 进行依赖项自动检测时。

  • CPack DEB 生成器学会了在包包含共享库时生成 DEBIAN/shlibs 控制文件。

  • CPack DEB 生成器学会了在包安装库到 ldconfig 控制的位置(例如 /lib/,/usr/lib/)时生成 DEBIAN/postinst 和 DEBIAN/postrm 文件。

  • CPack DEB 生成器学会了在使用了多组件设置并设置了 CPACK_COMPONENT__DEPENDS 变量时,生成 Debian 包之间的依赖关系。为了向后兼容,此功能默认禁用。请参阅 CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS。

  • CPack DEB 生成器学会了设置自定义包文件名,包括如何生成命名正确的 Debian 包。

    <PackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb
    

    为了向后兼容,此功能默认禁用。请参阅 CPACK_DEBIAN_FILE_NAME 和 CPACK_DEBIAN__FILE_NAME。

  • CPack DEB 生成器学会了设置包发布号(在使用 DEB-DEFAULT 值结合 CPACK_DEBIAN_FILE_NAME 时,包文件名称中的 DebianRevisionNumber)。请参阅 CPACK_DEBIAN_PACKAGE_RELEASE。

  • CPack DEB 生成器学会了为每个组件设置包架构。请参阅 CPACK_DEBIAN__PACKAGE_ARCHITECTURE。

  • CPack DragNDrop 生成器学会了一个新选项,用于跳过 /Applications 符号链接。请参阅 CPACK_DMG_DISABLE_APPLICATIONS_SYMLINK 变量。

  • CPackIFW 模块增加了一个新的 cpack_ifw_update_repository() 命令,用于从远程存储库更新 QtIFW 特定存储库。

  • CPack RPM 生成器学会了在启用时将 RPM dist 标签设置为 RPM Release: 标签的一部分(例如在 Fedora 上,这对于某些 Linux 发行版是强制的)。请参阅 CPACK_RPM_PACKAGE_RELEASE_DIST。

  • CPack RPM 生成器学会了设置包内容的所有者用户/组和文件/目录权限的默认值。请参阅 CPACK_RPM_DEFAULT_USER、CPACK_RPM_DEFAULT_GROUP、CPACK_RPM_DEFAULT_FILE_PERMISSIONS、CPACK_RPM_DEFAULT_DIR_PERMISSIONS 以及它们的每个组件的对应项。

  • CPack RPM 生成器学会了设置用户定义的包文件名,如何指定 rpmbuild 应决定文件名格式,以及如何处理由单个用户定义的 spec 文件生成的多个 rpm 包。请参阅 CPACK_RPM_FILE_NAME 和 CPACK_RPM__FILE_NAME。

  • CPack RPM 生成器学会了如何正确处理指向生成包外部的符号链接。

其他 (Other)

  • Compile Features 功能现在了解 Intel C++ 编译器版本 12.1 到 16.0 在 UNIX 平台上的支持情况。

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

  • CMakeForceCompiler 模块及其宏现在已弃用。请参阅模块文档以获取说明。

  • find_library()、find_path() 和 find_file() 命令不再在非 Windows 平台上搜索从 PATH 环境变量派生的安装前缀。此行为已在 CMake 3.3 中添加以支持 Windows 主机,但在 UNIX 主机上已被证明存在问题。用户将一些 /bin 目录保留在 PATH 中仅用于其工具,但他们不一定希望搜索任何支持的 /lib 目录。可以使用 CMAKE_PREFIX_PATH 环境变量指定一个分号分隔的前缀列表来搜索。

  • Visual Studio 7 .NET 2003 生成器现已弃用,将在 CMake 的未来版本中移除。

  • Visual Studio 7 生成器(针对 VS .NET 2002)已被移除。它自 CMake 3.3 起已弃用。

  • Visual Studio 6 生成器已被移除。它自 CMake 3.3 起已弃用。

其他更改 (Other Changes)

  • 在 cmake.org 上提供的预编译 OS X 二进制文件现在需要 OS X 10.7 或更高版本。

  • 在 Linux 和 FreeBSD 平台上,当从源代码构建 CMake 本身而不使用系统提供的 libcurl 时,如果系统上找到 OpenSSL,则默认使用 OpenSSL。这使得支持通过 https 进行网络通信的命令(例如 file(DOWNLOAD)、file(UPLOAD) 和 ctest_submit())具有 SSL/TLS 支持。

  • cmake(1) --build 命令行工具现在会拒绝多个 --target 选项,并报错而不是静默忽略除最后一个之外的所有选项。

  • AUTOMOC 现在可以诊断名称冲突,当不同目录中的多个源文件使用相同的名称进行 #include 时(因为生成的 moc_foo.cpp 文件会发生冲突)。

  • FindBISON 模块的 bison_target() 命令现在通过将 VERBATIM 选项传递给内部 add_custom_command() 调用来支持特殊字符。这可能会破坏手动添加转义以解决此 bug 的客户端。

  • FindFLEX 模块的 flex_target() 命令现在通过将 VERBATIM 选项传递给内部 add_custom_command() 调用来支持特殊字符。这可能会破坏手动添加转义以解决此 bug 的客户端。

  • FindProtobuf 模块的输入和输出变量已全部从 PROTOBUF_ 重命名为 Protobuf_,以与其他查找模块保持一致。如果提供了旧大小写的输入变量,它们仍然会被识别,并且旧大小写的输出变量始终会提供。

  • CPack RPM 生成器现在支持每个组件的 CPackRPM 特定变量中的大写组件名称。例如,名为 foo 的组件现在期望组件特定的变量为 CPACK_RPM_FOO_PACKAGE_NAME,而之前它期望 CPACK_RPM_foo_PACKAGE_NAME。变量中大写组件名称部分与其他 CPack 变量使用的约定兼容。为了向后兼容,旧格式的变量仍然有效,并且如果设置了两种变量,则首选旧格式,但未来首选使用大写组件名称的变量。将来添加到 CPackRPM 的新变量将仅支持大写组件变量格式。

  • CPack NSIS 生成器的配置文件模板已修复,以引用 CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL 选项使用的卸载程序工具的路径。这避免了依赖于不安全的 Windows 功能来运行带有路径中包含空格的卸载程序工具。