CMake 3.14 发行说明¶
自 CMake 3.13 以来所做的更改包括以下内容。
新功能¶
生成器¶
添加了
Visual Studio 16 2019生成器。这是实验性的,基于“Visual Studio 2019 Preview 4”,因为这个版本的 VS 还没有发布。VS 2019 生成器不同于早期版本的生成器,因为它不提供在生成器名称中指定目标平台的变体。相反,必须使用
CMAKE_GENERATOR_PLATFORM,例如通过“-A”命令行选项。此外,默认目标平台(架构)现在基于 host 平台。 VS 主机工具集选择现在也基于主机体系结构。Green Hills MULTI生成器已更新:现在支持 对象库。
现在警告不支持的项目类型,例如共享库。
现在为调用
project()命令的每个目录生成一个顶级``<PROJECT-NAME>.top.gpj``。不再创建顶级项目文件“default.gpj”。现在支持目标重命名和目标输出控制属性,例如:prop_tgt: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)Build Tool Mode (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)命令学会了支持生成器表达式。请参阅政策:policy: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全局属性,以允许脚本确定它们是在项目模式、脚本模式、查找包模式、CTest 还是 CPack 下运行。CUDA_RESOLVE_DEVICE_SYMBOLS目标属性现在在共享库、模块库和可执行目标上受支持。以前它只在静态库上受到尊重。EXCLUDE_FROM_ALL目标属性的创建是为了覆盖其目录的设置。如果一个目标的EXCLUDE_FROM_ALL属性设置为OFF,那么即使它的包含目录被标记为EXCLUDE_FROM_ALL,目标现在也将被构建为“全部”的一部分。INTERFACE_POSITION_INDEPENDENT_CODE目标属性获得generator expressions的支持。
模块¶
检查功能的模块系列(如:module: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。请参阅政策:policy: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现在提供导入的目标。如果定义了文件属性“SWIG_MODULE_NAME”,则 UseSWIG 模块学会了将“-module <module_name>”传递给“SWIG”编译器。请参阅政策:policy:CMP0086。
UseSWIG模块获得了一个选项来指定SWIG源文件扩展名。
生成器表达式¶
添加了``$<Fortran_COMPILER_ID:...>`` 和``$<Fortran_COMPILER_VERSION:...>``
generator expressions。$<IN_LIST:...>生成器表达式现在可以正确处理空参数。有关详细信息,请参阅:policy:CMP0085。
自动生成器¶
添加了
AUTOMOC_EXECUTABLE、AUTORCC_EXECUTABLE和AUTOUIC_EXECUTABLE目标属性。它们都采用指向可执行文件的路径并强制 automoc/autorcc/autouic 使用该可执行文件。设置这些也会阻止对这些可执行文件的配置时间测试。当您自己构建这些工具时,这主要有用。
新变量
cmake_global_autogen_target,cmake_global_autogen_autogen_target_name,:actible:cmake_global_autorcc_target' `outorcc'目标。一个新的 CMAKE_AUTOGEN_ORIGIN_DEPENDS 变量和 :prop_tgt:AUTOGEN_ORIGIN_DEPENDS 目标属性可以设置为启用或禁用将原始目标依赖项转发到相应的 _autogen 目标。
C测试¶
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)手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。Xcode生成器弃用了对 Xcode 5 之前的 Xcode 版本的支持。在未来的 CMake 版本中将不再支持这些版本。FindQt模块不再被find_package()命令用作查找模块。这允许上游的 Qt 项目有选择地提供自己的“QtConfig.cmake”包配置文件,并让应用程序通过“find_package(Qt)”而不是“find_package(Qt CONFIG)”使用它。请参阅政策:policy:CMP0084。不再支持在 Windows XP 和 Windows Vista 上运行 CMake。
cmake.org上提供的预编译 Windows 二进制文件现在需要 Windows 7 或更高版本。CTest 不再支持通过“ftp”、“scp”、“cp”和“xmlrpc”提交。 CDash 是 CTest 唯一维护的测试仪表板,它只支持通过
http和https提交。
其他变化¶
对象库链接已得到修复,可以将对象库的私有链接库传播到消费目标。
add_subdirectory()下的安装规则现在与调用目录中的规则交错。有关详细信息,请参阅政策:policy: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 Generators 学会了在通过 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依赖项添加到在另一个目录中创建的静态库(根据策略CMP0079NEW行为)会错误地将这些依赖项的使用要求传播到链接静态库的依赖项。这已得到修复。该错误也存在于 3.13.0 到 3.13.4 中,并在 3.13.5 中得到修复。
3.14.5¶
CPATH环境变量的条目不再像在 CMake 3.14.0 到 3.14.4 中那样通过include_directories()和target_include_directories()被显式使用。
3.14.6¶
3.14.7¶
在 CMake 3.14.0 到 3.14.6 中,
EXCLUDE_FROM_ALL目录属性从 3.14 之前的行为中退化,导致目录中的目标甚至被排除在它自己的“全部”之外。这已得到修复。