CMake 3.14 发行说明¶
自 CMake 3.13 以来的更改包括以下内容。
新功能¶
生成器¶
添加了
Visual Studio 16 2019生成器。此生成器处于实验阶段,基于“Visual Studio 2019 Preview 4”,因为此版本的 VS 尚未发布。VS 2019 生成器与早期版本的生成器不同之处在于,它不提供在生成器名称中指定目标平台的变体。相反,必须使用
CMAKE_GENERATOR_PLATFORM,例如通过-A命令行选项。此外,默认目标平台(架构)现在基于 *宿主* 平台。VS 宿主工具集选择也基于宿主架构。已更新
Green Hills MULTI生成器现在支持 对象库。
现在会警告不支持的项目类型,例如共享库。
现在,对于每个调用
project()命令的目录,都会生成一个顶层<PROJECT-NAME>.top.gpj文件。不再创建顶层项目文件default.gpj。现在会遵守目标重命名和目标输出控制属性,例如
RUNTIME_OUTPUT_DIRECTORY和OUTPUT_NAME。这也修复了install()生成的安装规则的支持。现在会遵守源文件属性
INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS和COMPILE_OPTIONS。现在支持未通过
GHS_INTEGRITY_APP集成文件并设置目标链接标志-dynamic的动态下载完整性应用程序。项目文件的内容现在按名称对源文件组和文件进行排序。将
GHS_NO_SOURCE_GROUP_FILE目标属性设置为ON,以生成目标单个项目文件,而不是为每个源文件组生成项目文件。将CMAKE_GHS_NO_SOURCE_GROUP_FILE变量设置为ON,以启用所有目标的此功能。
基于文件的 API¶
已添加用于客户端获取语义构建系统信息的基于文件的 API。请参阅
cmake-file-api(7)手册。这旨在替换 IDE 的cmake-server(7)模式。
平台¶
CMake 现在支持使用简单的工具链文件进行 交叉编译 iOS、tvOS 或 watchOS。
命令行¶
cmake(1)构建工具模式(cmake --build)添加了--verbose和-v选项以指定详细的构建输出。某些生成器(如 Xcode)目前不支持此选项。cmake(1)-E compare_files命令新增了--ignore-eol选项,用于指定在比较文件时忽略行尾差异(例如 LF 与 CRLF)。cmake-gui(1)对话框新增了-S和-B参数,以显式指定源目录和构建目录。
命令¶
file()命令新增了子命令CREATE_LINK,可用于创建硬链接或符号链接。file()命令新增了子命令READ_SYMLINK,可用于确定符号链接指向的路径。file()命令新增了SIZE模式,用于获取磁盘上文件的大小。find_package()命令新增了可选解析包配置文件路径中符号链接的功能。请参阅CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS变量。get_filename_component()命令新增了LAST_EXT和NAME_WLE变体,用于处理名称中最后一个.之后的部分。if()命令新增了对使用DEFINED CACHE{VAR}语法检查缓存变量是否已定义的と支持。install(CODE)和install(SCRIPT)命令新增了对生成器表达式的支持。请参阅策略CMP0087。install(TARGETS)命令新增了根据GNUInstallDirs模块中的变量和内置默认值,为给定目标类型安装到适当的默认目录的功能,而不是使用DESTINATION参数。install(FILES)和install(DIRECTORY)命令新增了一组参数,用于将文件作为文件类型安装,根据GNUInstallDirs中的相应变量和内置默认值设置目标目录,而不是使用DESTINATION参数。list()操作REMOVE_ITEM、REMOVE_DUPLICATES、SORT、REVERSE和FILTER现在都接受不存在的变量作为列表,因为对空列表执行这些操作的结果也是空列表。list()操作REMOVE_AT现在指示给定的索引对于不存在的变量或空列表是无效的。try_compile()和try_run()命令新增了LINK_OPTIONS选项。
变量¶
添加了
CMAKE_BUILD_RPATH_USE_ORIGIN变量和相应的BUILD_RPATH_USE_ORIGIN目标属性,以启用相对运行时路径(RPATHs)的使用。这有助于实现可重定位和可重复的构建,这些构建不受构建目录的影响。添加了
CMAKE_VS_PLATFORM_NAME_DEFAULT变量,用于 Visual Studio 生成器,以报告当CMAKE_GENERATOR_PLATFORM未显式设置时使用的默认平台。
属性¶
添加了
CMAKE_ROLE全局属性,允许脚本确定它们是在项目模式、脚本模式、查找包模式、CTest 还是 CPack 中运行。CUDA_RESOLVE_DEVICE_SYMBOLS目标属性现在支持共享库、模块库和可执行目标。以前仅在静态库上生效。创建了
EXCLUDE_FROM_ALL目标属性来覆盖其目录的设置。现在,即使目标所在的目录被标记为EXCLUDE_FROM_ALL,如果其EXCLUDE_FROM_ALL属性设置为OFF,它仍将作为“all”的一部分进行构建。INTERFACE_POSITION_INDEPENDENT_CODE目标属性获得了对生成器表达式的支持。
模块¶
用于检查功能的模块系列(如
CheckCSourceCompiles)获得了管理LINK_OPTIONS的能力。添加了
CheckFortranSourceRuns模块,提供check_fortran_source_runs()命令,用于检查 Fortran 源片段是否可以编译和运行。CMakePackageConfigHelpers 模块的
write_basic_package_version_file()命令新增了ARCH_INDEPENDENT选项,用于支持与架构无关的包。ExternalProject 模块的
ExternalProject_Add()命令新增了LOG_DIR和LOG_MERGED_STDOUTERR选项来控制日志记录。ExternalProject 模块的
ExternalProject_Add()命令新增了LOG_PATCH,以可选地记录补丁步骤。ExternalProject 模块的
ExternalProject_Add()命令在同时使用SOURCE_SUBDIR和BUILD_IN_SOURCE时,学会了应用SOURCE_SUBDIR。BUILD_COMMAND在SOURCE_DIR的给定SOURCE_SUBDIR中运行。FetchContent 模块新增了
FetchContent_MakeAvailable()命令。它接受一个依赖项名称列表,然后遍历这些名称,使用标准模式填充并添加到主构建中。这大大减少了项目中所需的样板代码。FindBISON 模块的
bison_target()命令现在将bison作为一个工作目录来执行CMAKE_CURRENT_BINARY_DIR。请参阅策略CMP0088。FindCURL 模块新增了支持将协议作为包组件请求的功能。
添加了 FindFontconfig 模块,用于查找 fontconfig。
FindGDAL 模块现在提供导入的目标。
FindGIF 模块现在提供导入的目标。
FindGit 模块现在为 Git 可执行文件提供导入的目标。
FindIce 模块学会了查找
slice2confluence和slice2matlab。添加了 FindLibinput 模块,用于查找 libinput。
FindLibLZMA 模块现在提供导入的目标。
FindMatlab 模块新增了选项
R2017b和R2018a,用于指定要使用的 MEX API 版本;这些选项与 MATLAB R2018a 中mex命令的新选项相对应。不再需要MX_LIBRARY选项。FindPostgreSQL 模块现在提供导入的目标。
FindPython、FindPython2 和 FindPython3 模块新增了对 NumPy 组件的支持。
FindPython2、FindPython3 和 FindPython 模块现在支持通过脚本模式运行,通过跳过导入的目标和辅助函数的创建。
添加了 FindSQLite3 模块,用于查找 SQLite v3.x 库。
FindX11 模块的变量名已重命名,以匹配其库名称而不是头文件名称。保留了旧变量以兼容。
X11_Xxf86misc_INCLUDE_PATH而不是X11_xf86misc_INCLUDE_PATHX11_Xxf86misc_LIB而不是X11_xf86misc_LIBX11_Xxf86misc_FOUND而不是X11_xf86misc_FOUNDX11_Xxf86vm_INCLUDE_PATH而不是X11_xf86vmode_INCLUDE_PATHX11_Xxf86vm_LIB而不是X11_xf86vmode_LIBX11_Xxf86vm_FOUND而不是X11_xf86vmode_FOUNDX11_xkbfile_INCLUDE_PATH而不是X11_Xkbfile_INCLUDE_PATHX11_xkbfile_LIB而不是X11_Xkbfile_LIBX11_xkbfile_FOUND而不是X11_Xkbfile_FOUNDX11_Xtst_INCLUDE_PATH而不是X11_XTest_INCLUDE_PATHX11_Xtst_LIB而不是X11_XTest_LIBX11_Xtst_FOUND而不是X11_XTest_FOUNDX11_Xss_INCLUDE_PATH而不是X11_Xscreensaver_INCLUDE_PATHX11_Xss_LIB而不是X11_Xscreensaver_LIBX11_Xss_FOUND而不是X11_Xscreensaver_FOUND
以下变量已完全弃用,因为它们本质上是重复的。
X11_Xinput_INCLUDE_PATH(使用X11_Xi_INCLUDE_PATH)X11_Xinput_LIB(使用X11_Xi_LIB)X11_Xinput_FOUND(使用X11_Xi_FOUND)
FindX11 现在提供了
X11_Xext_INCLUDE_PATH。FindX11 现在提供导入的目标。
UseSWIG 模块学会了在定义了
SWIG_MODULE_NAME文件属性时,将-module <module_name>传递给SWIG编译器。请参阅策略CMP0086。UseSWIG 模块新增了一个选项,用于指定
SWIG源文件扩展名。
生成器表达式¶
Autogen¶
添加了
AUTOMOC_EXECUTABLE、AUTORCC_EXECUTABLE和AUTOUIC_EXECUTABLE目标属性。它们都接受一个可执行文件的路径,并强制 automoc/autorcc/autouic 使用该可执行文件。设置这些属性还将阻止在配置时对这些可执行文件进行测试。这主要在您自行构建这些工具时有用。
新的变量
CMAKE_GLOBAL_AUTOGEN_TARGET、CMAKE_GLOBAL_AUTOGEN_TARGET_NAME、CMAKE_GLOBAL_AUTORCC_TARGET和CMAKE_GLOBAL_AUTORCC_TARGET_NAME控制全局autogen和autorcc目标的生成。新的
CMAKE_AUTOGEN_ORIGIN_DEPENDS变量和AUTOGEN_ORIGIN_DEPENDS目标属性可以被设置,以启用或禁用原始目标依赖项向相应的 The <ORIGIN>_autogen target 目标的转发。
CTest¶
ctest(1)新增了--show-only=json-v1选项,以机器可读的 JSON 格式显示测试列表。请参阅手册的 Show as JSON Object Model 部分。ctest_submit()命令新增了Done部分,可用于通知 CDash 构建已完成,并且不会再上传其他部分。CTest 现在可以从单个变量接受仪表板服务器提交 URL。请参阅
ctest(1)中的SubmitURL设置、CTEST_SUBMIT_URL变量以及ctest_submit()命令的SUBMIT_URL参数。
弃用和移除的功能¶
为策略
CMP0064和CMP0065(CMP0063及更低版本已弃用)添加了显式弃用诊断。cmake-policies(7)手册解释了所有策略的 OLD 行为均已被弃用,并且项目应迁移到 NEW 行为。Xcode 生成器弃用了对 Xcode 5 及更早版本的支持。对这些版本的支持将在 CMake 的未来版本中删除。
FindQt 模块不再被 find_package 命令用作查找模块。这允许 Qt Project 上游选择性地提供自己的
QtConfig.cmake包配置文件,并让应用程序通过find_package(Qt)而不是find_package(Qt CONFIG)来使用它。请参阅策略CMP0084。已停止支持在 Windows XP 和 Windows Vista 上运行 CMake。在 cmake.org 上提供的预编译 Windows 二进制文件现在需要 Windows 7 或更高版本。
CTest 不再支持通过
ftp、scp、cp和xmlrpc进行提交。CDash 是 CTest 唯一维护的测试仪表板,它仅支持通过http和https进行提交。
其他更改¶
对象库链接已修复,以便将对象库的私有链接库传播到消耗目标。
现在,
add_subdirectory()下的安装规则会与调用目录中的安装规则交错。有关详细信息,请参阅策略CMP0082。CMake 现在强制执行最大递归限制,以防止无限递归脚本导致堆栈溢出。可以使用
CMAKE_MAXIMUM_RECURSION_DEPTH在运行时调整此限制。通过
CMAKE_<LANG>_CPPCHECK变量或<LANG>_CPPCHECK属性使用 cppcheck 时,如果cppcheck根据其命令行选项返回非零值,则构建现在将失败。现在,当设置
POSITION_INDEPENDENT_CODE时,将添加管理独立于位置的可执行文件的必需链接选项。项目负责使用CheckPIESupported模块来检查PIE支持,以确保在链接时会遵守可执行文件的POSITION_INDEPENDENT_CODE目标属性。此行为由策略CMP0083控制。Visual Studio 生成器(针对 VS 2010 及更高版本)学会了支持通过
add_custom_target()创建的目标上的VS_DEBUGGER_*属性。CPack 模块不再默认使用
CPACK_DEBIAN_ARCHIVE_TYPE变量中的paxr值,因为dpkg从未支持 PAX tar 格式。paxr值将被映射到gnutar并发出弃用消息。CMake 不再对
install(TARGETS)命令中列出的目标(其EXCLUDE_FROM_ALL属性设置为 true)发出警告。
更新¶
自 CMake 3.14.0 以来的更改包括以下内容。
3.14.1¶
3.14.0 中添加的 FindFontconfig 模块意外使用了大写的
FONTCONFIG_*变量名,这不符合我们的约定。3.14.1 修订了该模块以使用Fontconfig_*变量名。这与 3.14.0 不兼容,但由于该模块是 3.14 系列中的新模块,因此使用量应该还不广泛。
3.14.3¶
添加了
CMAKE_VS_PLATFORM_NAME_DEFAULT变量,以帮助工具链文件与 Visual Studio 16 2019 生成器协同工作,在该生成器中,默认平台现在取决于宿主平台。
3.14.4¶
在 CMake 3.14.0 到 3.14.3 版本中,使用
target_link_libraries()将PRIVATE依赖项添加到在另一个目录中创建的静态库(根据策略CMP0079NEW行为)时,会错误地将这些依赖项的使用要求传播给链接静态库的依赖项。此问题已修复。此 bug 也存在于 3.13.0 到 3.13.4 版本中,并在 3.13.5 版本中修复。
3.14.5¶
在 CMake 3.14.0 到 3.14.4 版本中,
CPATH环境变量的条目不再从通过include_directories()和target_include_directories()的显式使用中排除。
3.14.6¶
在 CMake 3.14.0 到 3.14.5 版本中,FindBISON 模块策略
CMP0088NEW行为意外地将.y输入的相对路径解释为相对于构建目录而不是源目录。此问题已修复。
3.14.7¶
在 CMake 3.14.0 到 3.14.6 版本中,
EXCLUDE_FROM_ALL目录属性相对于 3.14 之前的行为出现了回归,导致目录中的目标即使在其自身的“all”目标中也被排除。此问题已修复。