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`,它可以表达构建系统对全局目录内容的依赖性。

  • 添加了 file(TOUCH)file(TOUCH_NOCREATE) 命令以公开 TOUCH 功能,而无需使用 CMake 的命令行工具模式和 execute_process()

  • find_package() 命令现在搜索由 <PackageName>_ROOT CMake 变量和 <PackageName>_ROOT 环境变量指定的前缀。包根以堆栈形式维护,因此对查找模块内所有“find_*”命令的嵌套调用也将根作为前缀进行搜索。请参阅政策:policy:CMP0074

  • install() 命令学习了一个可选的 NAMELINK_COMPONENT 参数,它允许您更改共享库名称链接的组件。如果未指定,则默认使用 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 扩展的 Matlab 运行时编译器 (MCR)。

  • 添加了 FindODBC 模块以查找开放式数据库连接 (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,...>`` generator expression 已被添加到启用生成器表达式的使用,其评估结果本身就是生成器表达式。

  • 添加了一个新的``$<IN_LIST:...>``:manual:generator expression <cmake-generator-expressions(7)>

  • 添加了一个新的``$<TARGET_EXISTS:...>``:manual:generator expression <cmake-generator-expressions(7)>

  • 添加了一个新的``$<TARGET_NAME_IF_EXISTS:...>``:manual:generator expression <cmake-generator-expressions(7)>

C测试

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

  • 添加了 PROCESSOR_AFFINITY 测试属性,以请求 CTest 对一组处理器运行具有 CPU 亲和力的测试,这些处理器与具有该属性集的其他同时运行的测试不相交。

包装

其他

  • 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 缓存条目。请参阅政策:policy:CMP0073

其他变化

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

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

  • 文件``${CMAKE_BINARY_DIR}/cmake_install.cmake`` 的存在和功能现在已记录在 install() 文档中,以便外部打包软件可以利用 CPack 样式的组件安装。

  • CheckIncludeFile 模块 check_include_file 宏学会了遵守 CMAKE_REQUIRED_LIBRARIES 变量。请参阅政策:policy:CMP0075

  • CheckIncludeFileCXX 模块 check_include_file_cxx 宏学会了遵守 CMAKE_REQUIRED_LIBRARIES 变量。请参阅政策:policy:CMP0075

  • CheckIncludeFiles 模块 check_include_files 宏学会了遵守 CMAKE_REQUIRED_LIBRARIES 变量。请参阅政策:policy:CMP0075

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

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