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),无需使用带 execute_process() 的 CMake 命令行工具模式即可展示 TOUCH 功能。

  • 命令 find_package() 现搜索 CMake 变量 <PackageName>_ROOT 和环境变量 <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_URL CMAKE_PROJECT_HOMEPAGE_URL 变量的效果。

  • string() 命令学习了一个 JOIN 子命令来连接由粘合字符串分隔的输入字符串。

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

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

变量

属性

Modules

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

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

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

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

  • 现在,FindMatlab 模块支持 Matlab 运行时编译器 (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 子模块暗示的依赖项。

  • 现在已在install() 文档中记录了文件 ${CMAKE_BINARY_DIR}/cmake_install.cmake 的存在和功能,以便外部打包软件可以利用 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 环境中的 ""