CMake 3.12 发行说明

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

新特性

生成器

命令行

  • 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) 命令,以公开 TOUCH 功能,而无需使用 CMake 的命令行工具模式和 execute_process()

  • find_package() 命令现在搜索由 <PackageName>_ROOT CMake 变量和 <PackageName>_ROOT 环境变量指定的前缀。包根目录以堆栈的形式维护,因此在 find 模块内部对所有 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 模块,用于查找开放数据库互连 (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

其他

  • 编译特性 功能现在可以识别 C++ 20。除了 cxx_std_20 元特性之外,尚未枚举任何特定特性。

  • 编译特性 功能现在可以识别自 VS 2010 以来 MSVC 中 C 特性的可用性。

  • 编译特性 功能现在可以识别 Texas Instruments C 编译器支持的 C 语言标准。

已弃用和移除的特性

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

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

其他更改

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

  • Fortran 依赖项扫描现在支持 Fortran 子模块隐含的依赖项。

  • 文件 ${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 工具现在会失败。之前,即使源目录不存在,它也会成功并创建一个空的 destination 目录。

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