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_PATH
X11_Xxf86misc_LIB
而不是X11_xf86misc_LIB
X11_Xxf86misc_FOUND
而不是X11_xf86misc_FOUND
X11_Xxf86vm_INCLUDE_PATH
而不是X11_xf86vmode_INCLUDE_PATH
X11_Xxf86vm_LIB
而不是X11_xf86vmode_LIB
X11_Xxf86vm_FOUND
而不是X11_xf86vmode_FOUND
X11_xkbfile_INCLUDE_PATH
而不是X11_Xkbfile_INCLUDE_PATH
X11_xkbfile_LIB
而不是X11_Xkbfile_LIB
X11_xkbfile_FOUND
而不是X11_Xkbfile_FOUND
X11_Xtst_INCLUDE_PATH
而不是X11_XTest_INCLUDE_PATH
X11_Xtst_LIB
而不是X11_XTest_LIB
X11_Xtst_FOUND
而不是X11_XTest_FOUND
X11_Xss_INCLUDE_PATH
而不是X11_Xscreensaver_INCLUDE_PATH
X11_Xss_LIB
而不是X11_Xscreensaver_LIB
X11_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
依赖项添加到在另一个目录中创建的静态库(根据策略CMP0079
NEW
行为)时,会错误地将这些依赖项的使用要求传播给链接静态库的依赖项。此问题已修复。此 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 模块策略
CMP0088
NEW
行为意外地将.y
输入的相对路径解释为相对于构建目录而不是源目录。此问题已修复。
3.14.7¶
在 CMake 3.14.0 到 3.14.6 版本中,
EXCLUDE_FROM_ALL
目录属性相对于 3.14 之前的行为出现了回归,导致目录中的目标即使在其自身的“all”目标中也被排除。此问题已修复。