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 模块的前缀设置为 `""`。