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 <HTTP-header>和USERPWD <username>:<password>选项。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_<LANG>_FLAGS_DEBUG)。以前只使用了当前工具链的默认此类标志。请参阅策略CMP0066。
变量¶
添加了变量
CMAKE_FIND_PACKAGE_SORT_ORDER来控制find_package()命令的排序模式。添加了变量
CMAKE_FIND_PACKAGE_SORT_DIRECTION来控制find_package()命令的排序方向。工具链文件现在可以设置CMAKE_<LANG>_FLAGS_INIT变量,以在构建树中首次启用语言时初始化CMAKE_<LANG>_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 生成器 为源文件使用的工具。WINDOWS_EXPORT_ALL_SYMBOLS目标属性现在适用于具有ENABLE_EXPORTS属性设置为可执行目标。添加了一个
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模块获得了用于“导出”jar 目标以供外部 CMake 项目使用的 API。请参阅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_<compName>_INSTALL_DIRECTORY。这可用于设置特定组件的安装目录。CPack WIX Generator现在支持CPACK_WIX_SKIP_PROGRAM_FOLDER,以允许指定 ProgramFiles 文件夹以外的自定义绝对安装前缀。CPack WIX Generator现在支持CPACK_COMPONENT_<compName>_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=<file>选项。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 一起分发。