CMake 3.12 发行说明

自 CMake 3.11 以来的更改包括以下内容。

新特性

生成器 (Generators)

命令行

  • cmake(1)构建项目cmake --build)增加了 --parallel [<jobs>]-j [<jobs>] 选项来指定并行构建级别。它们映射到原生构建工具的相应选项。

命令

  • 添加了 add_compile_definitions() 命令,用于在目录级别设置预处理器定义。此命令取代了 add_definitions()

  • cmake_minimum_required()cmake_policy(VERSION) 命令现在接受使用 <min>[...<max>] 形式的版本范围。 <min> 版本是必需的,但策略的设置基于正在运行的 CMake 版本和 <max> 指定的版本之间的较旧版本。这允许项目指定它们已更新的版本范围,并避免显式策略设置。

  • file(GLOB)file(GLOB_RECURSE) 命令增加了一个新标志 CONFIGURE_DEPENDS,该标志可以表达构建系统对 globbed 目录内容依赖关系。

  • 添加了 file(TOUCH)file(TOUCH_NOCREATE) 命令,以便在不使用 CMake 的命令行工具模式和 execute_process() 的情况下暴露 TOUCH 功能。

  • find_package() 命令现在搜索由 CMake 变量 <PackageName>_ROOT 和环境变量 <PackageName>_ROOT 指定的前缀。包根目录被维护为一个堆栈,因此在查找模块内的所有 find_* 命令的嵌套调用也会将这些根目录作为前缀进行搜索。请参阅策略 CMP0074

  • install() 命令增加了一个可选的 NAMELINK_COMPONENT 参数,允许您更改共享库的 namelink 的组件。如果未指定,则默认使用 COMPONENT 的值。

  • list() 命令增加了一个 JOIN 子命令,用于将列表的元素连接起来,并用一个粘合字符串分隔。

  • list() 命令增加了一个 SUBLIST 子命令,用于获取列表的一个子列表。

  • list() 命令增加了一个 TRANSFORM 子命令,用于对列表的元素应用各种字符串转换。

  • project() 命令增加了一个可选的 HOMEPAGE_URL 参数,该参数会影响设置 PROJECT_HOMEPAGE_URL<PROJECT-NAME>_HOMEPAGE_URLCMAKE_PROJECT_HOMEPAGE_URL 等变量。

  • string() 命令增加了一个 JOIN 子命令,用于将输入字符串连接起来,并用一个粘合字符串分隔。

  • target_compile_options()add_compile_options() 命令增加了一个 SHELL: 前缀,用于使用类 shell 引号指定一组相关的选项。

  • target_link_libraries() 命令现在支持对象库。链接到对象库会使用其对象文件为其直接依赖项,并传播使用要求。

变量

属性

模块

  • FindALSA 模块现在提供导入的目标。

  • FindCURL 模块现在提供导入的目标。

  • FindJPEG 模块现在提供导入的目标。

  • FindLibXml2 模块现在提供导入的目标。

  • FindMatlab 模块现在支持 Matlab Runtime Compiler (MCR),用于编译和链接 matlab 扩展。

  • 添加了 FindODBC 模块,用于查找 Open Database Connectivity (ODBC) 库。

  • FindPkgConfig 模块已学会以包含完整路径的库来导出找到的库,以便与 target_link_libraries() 命令直接使用。

  • 添加了新的 FindPython3FindPython2 模块,以及新的 FindPython 模块,以提供一种新的定位 python 环境的方法。

  • UseSWIG 模块进行了全面更新,现在与标准的 CMake 命令更一致,用于生成库,并且可以通过属性完全配置。

  • UseSWIG 模块学会了通过 UseSWIG_MODULE_VERSION 变量来管理多种行为,以确保对旧版本的支持以及更稳健地处理 SWIG 高级功能(如 %template)。

  • UseSWIG 模块学会了支持 CSHARP 变体包装器文件。

  • WriteCompilerDetectionHeader 模块增加了一个 BARE_FEATURES 选项,以添加一个兼容性定义,用于新语言功能的精确关键字。

生成器表达式

  • 添加了一个新的 $<GENEX_EVAL:...>$<TARGET_GENEX_EVAL:target,...> 生成器表达式,以支持生成器表达式的消耗,其评估结果本身就是生成器表达式。

  • 添加了一个新的 $<IN_LIST:...> 生成器表达式

  • 添加了一个新的 $<TARGET_EXISTS:...> 生成器表达式

  • 添加了一个新的 $<TARGET_NAME_IF_EXISTS:...> 生成器表达式

CTest

  • ctest_start() 命令已被重构,因此您只需调用 ctest_start(APPEND) 即可从 TAG 文件读取所有所需信息。参数解析也已放宽,因此参数的顺序不太重要。

  • 添加了 PROCESSOR_AFFINITY 测试属性,以请求 CTest 运行具有 CPU 亲和性的测试,该亲和性集与其他设置了该属性的并发运行的测试不相交。

CPack

其他

  • Compile Features 功能现在支持 C++ 20。除了 cxx_std_20 元特征外,尚未枚举任何特定功能。

  • Compile Features 功能现在了解自 VS 2010 以来 MSVC 可用的 C 功能。

  • Compile Features 功能现在支持德州仪器 (Texas Instruments) C 编译器所支持的 C 语言标准。

已弃用和移除的功能

  • 已移除 Visual Studio 8 2005 生成器。

  • CMake 不再为库目标生成 <tgt>_LIB_DEPENDS 缓存条目。请参阅策略 CMP0073

其他更改

  • 标记为 SYSTEM 的目录的包含标志现在移到了非系统目录之后。 -isystem 标志会自动执行此操作,因此显式将它们移到末尾可以使不支持 -isystem 标志的编译器保持行为一致。

  • Fortran 依赖项扫描现在支持Fortran Submodules所隐含的依赖项。

  • ${CMAKE_BINARY_DIR}/cmake_install.cmake 文件的存在和功能已在install()文档中进行了说明,以便外部打包软件可以利用 CPack 风格的组件安装。

  • CheckIncludeFile 模块的 check_include_file() 命令学会了尊重 CMAKE_REQUIRED_LIBRARIES 变量。请参阅策略 CMP0075

  • CheckIncludeFileCXX 模块的 check_include_file_cxx() 命令学会了尊重 CMAKE_REQUIRED_LIBRARIES 变量。请参阅策略 CMP0075

  • CheckIncludeFiles 模块的 check_include_files() 命令学会了尊重 CMAKE_REQUIRED_LIBRARIES 变量。请参阅策略 CMP0075

  • cmake(1)-E copy_directory 工具现在在源目录不存在时会失败。之前,它通过创建空的目标目录而成功。

  • UseSWIG 模块的 swig_add_library() 命令(以及旧的 swig_add_module 命令)现在会将 Java 模块的前缀设置为 MINGW、MSYS 和 CYGWIN 环境的 ""