CMake 3.14 发行说明¶
自 CMake 3.13 起所做的更改包括以下内容。
新功能¶
生成器¶
添加了
Visual Studio 16 2019
生成器。由于尚未发布此版本,因此这是实验性的并基于“Visual Studio 2019 Preview 4”。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
变量设置为针对所有目标启用此功能。
基于文件的 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
参数,用于明确指定源和构建目录。
Commands¶
命令
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
属性,以启用相对运行时路径 (RPATH)。这有助于实现可重定位、可再生成且不依赖于构建目录的构建。为 Visual Studio Generators 添加了
CMAKE_VS_PLATFORM_NAME_DEFAULT
变量,当未显式设置CMAKE_GENERATOR_PLATFORM
时,报告其使用的默认平台。
属性¶
添加了
CMAKE_ROLE
全局属性来允许脚本判定它们是在项目模式、脚本模式、find-package 模式、CTest 还是 CPack 中运行的。共享库、模块库和可执行目标现在支持
CUDA_RESOLVE_DEVICE_SYMBOLS
目标属性。先前它仅在静态库中得到支持。创建了
EXCLUDE_FROM_ALL
目标属性来覆盖其目录的设置。如果目标的EXCLUDE_FROM_ALL
属性设置为OFF
,则它将在“all”的一部分中构建,即使其包含的目录被标记为EXCLUDE_FROM_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()
命令学会在使用BUILD_IN_SOURCE
时应用SOURCE_SUBDIR
。BUILD_COMMAND
在给定的SOURCE_DIR
的SOURCE_SUBDIR
内运行。FetchContent
模块获得一个新的FetchContent_MakeAvailable()
命令。它接受依赖性名称的列表,然后迭代它,填充并使用规范模式将其添加至主要版本中。这显著地降低了项目中所需样板例子的数量。现在
FindBISON
模块的BISON_TARGET
命令以CMAKE_CURRENT_BINARY_DIR
作为工作目录,运行bison
。请参阅策略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
模块已学会将-module <module_name>
传递给SWIG
编译器,如果已定义文件属性SWIG_MODULE_NAME
。请参阅策略CMP0086
。UseSWIG
模块增加了一个选项,用于指定SWIG
源文件扩展名。
Generator Expressions(生成器表达式)¶
generator expressions
已添加$<Fortran_COMPILER_ID:...>
和$<Fortran_COMPILER_VERSION:...>
。生成器表达式
$<IN_LIST:...>
现已正确处理空参数。有关详情,请参阅CMP0085
。
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
目标属性可设置为启用或禁用将原始目标依赖项转发到相应的 <ORIGIN>_autogen 目标 目标。
CTest¶
ctest(1)
获得--show-only=json-v1
选项,以机器可读的 JSON 格式显示测试列表。请参见手册中的 以 JSON 对象模型显示 部分。命令
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 以前的 Xcode 版本的支持。对这些版本的 Xcode 的支持将在 CMake 的未来版本中放弃。FindQt
模块不再被find_package()
命令用作 find 模块。这允许 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
控制。适用于 VS 2010 及更高版本的Visual Studio 生成器已学会支持通过
add_custom_target()
创建的目标上的VS_DEBUGGER_*
属性。模块
CPack
在变量CPACK_DEBIAN_ARCHIVE_TYPE
中不再默认为paxr
值,因为dpkg
从未支持过 PAX tar 格式。paxr
值将映射到gnutar
,并发出弃用消息。如果
install(TARGETS)
命令中列出的目标已将其EXCLUDE_FROM_ALL
属性设置为 true,则 CMake 将不再发出警告。
更新¶
自 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()
以向在另一个目录中创建的静态库(在策略CMP0079
NEW
行为下)添加PRIVATE
依赖项会导致错误地传播这些依赖项的使用要求到链接此静态库的从属项。此问题已得到修复。此错误还存在于 3.13.0 到 3.13.4 中,在 3.13.5 中得到修复。
3.14.5¶
CPATH
环境变量的条目不再被排除在通过include_directories()
和target_include_directories()
明确使用,就像在 CMake 3.14.0 到 3.14.4 中一样。
3.14.6¶
3.14.7¶
在 CMake 3.14.0 到 3.14.6 中,
EXCLUDE_FROM_ALL
目录属性从 3.14 之前的行为中退化,并导致目录中的目标被排除,甚至包括自己的“all”。此问题已得到修复。