CMake 3.12 发行说明¶
自 CMake 3.11 以来的更改包括以下内容。
新特性¶
生成器 (Generators)¶
用于 VS 2017 的 Visual Studio Generators 现在支持在
CMAKE_GENERATOR_TOOLSET值中使用version=14.##选项(例如,通过cmake(1)的-T选项)来指定工具集版本号。
命令行¶
Build a Project(
cmake --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_URL和CMAKE_PROJECT_HOMEPAGE_URL等变量。string()命令增加了一个 `JOIN` 子命令,用于连接输入字符串,并用一个粘合字符串分隔。target_compile_options()和add_compile_options()命令增加了 `SHELL:` 前缀,以便使用类 shell 引用指定一组相关的选项。target_link_libraries()命令现在支持 Object Libraries。链接到对象库会在直接依赖项中使用其对象文件,并传播使用需求。
变量¶
新增了
CMAKE_FOLDER变量,用于初始化所有目标的FOLDER属性。定义了
CMAKE_DOTNET_TARGET_FRAMEWORK_VERSION变量,用于初始化所有DOTNET_TARGET_FRAMEWORK_VERSION目标属性。已引入 `CMAKE_PROJECT_VERSION*` 变量
对
CMAKE_SUPPRESS_REGENERATION变量进行了扩展,以支持Ninja和 Makefile Generators。该变量现在也已文档化。定义了 `CMAKE_VS_SDK_*_DIRECTORIES` 变量,用于告知从 VS 2010 及以上版本的 Visual Studio Generators 如何填充 `.vcxproj` 文件中指定 SDK 目录的字段。这些变量是:
新增了
MSVC_TOOLSET_VERSION变量,用于提供与当前 MSVC 编译器版本关联的 MSVC 工具集版本(在MSVC_VERSION中)。
属性¶
新增了
COMMON_LANGUAGE_RUNTIME目标属性,用于配置从 VS 2010 及以上版本的 Visual Studio Generators 使用托管 C++。同时新增了相应的IMPORTED_COMMON_LANGUAGE_RUNTIME目标属性,用于支持导入目标的 `C++/CLI`。新增了
DOTNET_TARGET_FRAMEWORK_VERSION目标属性,用于替换已被弃用的VS_DOTNET_TARGET_FRAMEWORK_VERSION。新增了
EXPORT_PROPERTIES目标属性,用于指定要包含在由 `install(EXPORT)` 和export()命令导出目标中的目标属性的自定义列表。PDB_OUTPUT_DIRECTORY属性现在支持generator expressions。新增了
TESTS目录属性,用于保存由add_test()命令定义的测试列表。创建了
VS_DEBUGGER_COMMAND目标属性,用于通过从 VS 2010 及以上版本的 Visual Studio Generators 设置调试命令。HLSL 源文件属性
VS_SHADER_DISABLE_OPTIMIZATIONS和VS_SHADER_ENABLE_DEBUG现在支持生成器表达式。在从 VS 2010 及以上版本的 Visual Studio Generators 中新增了 HLSL 源文件属性
VS_SHADER_OBJECT_FILE_NAME。该属性指定了编译后的着色器对象的文件名。
模块¶
FindALSA模块现在提供导入的目标。FindCURL模块现在提供导入的目标。FindJPEG模块现在提供导入的目标。FindLibXml2模块现在提供导入的目标。FindMatlab模块现在支持 Matlab Runtime Compiler (MCR),用于编译和链接 matlab 扩展。新增了
FindODBC模块,用于查找 Open Database Connectivity (ODBC) 库。FindPkgConfig模块现在已支持导出找到的库的完整路径,以便直接与target_link_libraries()命令一起使用。新增了
FindPython3和FindPython2模块,以及新的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:...>`generator expression。新增了 `
$<TARGET_EXISTS:...>`generator expression。新增了 `
$<TARGET_NAME_IF_EXISTS:...>`generator expression。
CTest¶
ctest_start()命令已被重构,您现在只需调用 `ctest_start(APPEND)`,它就会从 TAG 文件中读取所有需要的信息。参数解析也已放宽,参数的顺序不再那么重要。新增了
PROCESSOR_AFFINITY测试属性,用于请求 CTest 以 CPU 亲和性运行测试,该亲和性集与其他并发运行的具有该属性的测试集不重叠。
CPack¶
CPack模块现在使用CMAKE_PROJECT_VERSION_MAJOR、CMAKE_PROJECT_VERSION_MINOR和CMAKE_PROJECT_VERSION_PATCH变量来初始化相应的 CPack 变量。新增了
CPack NuGet Generator,并提供了对 NuGet 的基本支持。
其他¶
Compile Features功能现在支持 C++ 20。除了 `cxx_std_20` 元特征外,目前还没有枚举特定的功能。Compile Features功能现在已了解 MSVC 从 VS 2010 开始支持的 C 功能。Compile Features功能现在已了解 Texas Instruments C 编译器支持的 C 语言标准。
已弃用和移除的功能¶
已移除
Visual Studio 8 2005生成器。CMake 不再为库目标生成 `
_LIB_DEPENDS` 缓存条目。请参见策略 CMP0073。
其他更改¶
标记为 `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 模块的前缀设置为 `""`。