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
变量以对所有目标启用此功能。
基于文件的 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
目标属性,以启用相对运行时路径 (RPATH) 的使用。 这有助于实现可重定位和可重现的构建,这些构建与构建目录无关。为 Visual Studio 生成器 添加了
CMAKE_VS_PLATFORM_NAME_DEFAULT
变量,以报告在未显式设置CMAKE_GENERATOR_PLATFORM
时使用的默认平台。
属性¶
添加了
CMAKE_ROLE
全局属性,以允许脚本确定它们是否在项目模式、脚本模式、查找包模式、CTest 或 CPack 中运行。CUDA_RESOLVE_DEVICE_SYMBOLS
目标属性现在在共享库、模块库和可执行目标上受支持。 以前它仅在静态库上生效。创建了
EXCLUDE_FROM_ALL
目标属性以覆盖其目录的设置。 如果目标的EXCLUDE_FROM_ALL
属性设置为OFF
,即使其包含目录标记为EXCLUDE_FROM_ALL
,该目标现在也将作为 “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
模块学习了在定义文件属性SWIG_MODULE_NAME
时,将-module <module_name>
传递给SWIG
编译器。 请参阅策略CMP0086
。UseSWIG
模块增加了一个选项,用于指定SWIG
源文件扩展名。
生成器表达式¶
添加了
$<Fortran_COMPILER_ID:...>
和$<Fortran_COMPILER_VERSION:...>
generator expressions
。现在
$<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
目标属性可以设置为启用或禁用将原始目标依赖项转发到相应的 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)
手册解释说,所有策略的旧行为都已弃用,项目应移植到新行为。Xcode
生成器已弃用对 Xcode 5 之前版本的支持。 对这些版本的支持将在 CMake 的未来版本中删除。FindQt
模块不再被find_package()
命令用作查找模块。 这允许 Qt 项目上游选择性地提供其自己的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()
以将PRIVATE
依赖项添加到另一个目录中创建的静态库(在策略CMP0079
NEW
行为下)会错误地将这些依赖项的使用要求传播到链接静态库的依赖项。 这已得到修复。 该错误也存在于 3.13.0 到 3.13.4 中,并在 3.13.5 中修复。
3.14.5¶
不再像 CMake 3.14.0 到 3.14.4 中那样,从通过
include_directories()
和target_include_directories()
显式使用中排除CPATH
环境变量的条目。
3.14.6¶
3.14.7¶
在 CMake 3.14.0 到 3.14.6 中,
EXCLUDE_FROM_ALL
目录属性从 3.14 之前的行为回归,并导致目录中的目标甚至从其自身的“all”中排除。 这已得到修复。