CMake 3.12 发行说明

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

新特性

生成器 (Generators)

命令行

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

命令

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

  • cmake_minimum_required()cmake_policy(VERSION) 命令现在接受使用 `[...<max>]` 形式的版本范围。`` 版本是必需的,但策略根据运行的 CMake 版本和 `` 指定的版本中的较早者设置。这使得项目可以指定已更新的版本范围,并避免显式设置策略。

  • file(GLOB)file(GLOB_RECURSE) 命令增加了一个新的标志 `CONFIGURE_DEPENDS`,它允许表达构建系统对 globbed 目录内容的依赖。

  • 新增了 file(TOUCH)file(TOUCH_NOCREATE) 命令,用于在不使用 execute_process() 的 CMake 命令行工具模式的情况下公开 `TOUCH` 功能。

  • find_package() 命令现在会搜索由 CMake 变量 `_ROOT` 和环境变量 `_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() 命令现在支持 Object 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` 选项,用于添加一个兼容性宏来定义新语言特性的确切关键字。

生成器表达式

CTest

  • ctest_start() 命令已被重构,您现在只需调用 `ctest_start(APPEND)`,它就会从 TAG 文件中读取所有需要的信息。参数解析也已放宽,参数的顺序不再那么重要。

  • 新增了 PROCESSOR_AFFINITY 测试属性,用于请求 CTest 以 CPU 亲和性运行测试,该亲和性集与其他并发运行的具有该属性的测试集不重叠。

CPack

其他

  • Compile Features 功能现在支持 C++ 20。除了 `cxx_std_20` 元特征外,目前还没有枚举特定的功能。

  • Compile Features 功能现在已了解 MSVC 从 VS 2010 开始支持的 C 功能。

  • Compile Features 功能现在已了解 Texas Instruments C 编译器支持的 C 语言标准。

已弃用和移除的功能

其他更改

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

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

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

  • check_include_file() 命令(来自 CheckIncludeFile 模块)现在会尊重 `CMAKE_REQUIRED_LIBRARIES` 变量。请参见策略 CMP0075

  • check_include_file_cxx() 命令(来自 CheckIncludeFileCXX 模块)现在会尊重 `CMAKE_REQUIRED_LIBRARIES` 变量。请参见策略 CMP0075

  • check_include_files() 命令(来自 CheckIncludeFiles 模块)现在会尊重 `CMAKE_REQUIRED_LIBRARIES` 变量。请参见策略 CMP0075

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

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