CMake 3.12 发行说明¶
自 CMake 3.11 以来的更改包括以下内容。
新特性¶
生成器 (Generators)¶
面向 VS 2017 的Visual Studio 生成器学会了在
CMAKE_GENERATOR_TOOLSET值中支持version=14.##选项(例如,通过cmake(1)的-T选项),以指定工具集版本号。
命令行¶
命令¶
添加了
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)命令,以便在不使用 CMake 的命令行工具模式和execute_process()的情况下暴露TOUCH功能。find_package()命令现在搜索由 CMake 变量<PackageName>_ROOT和环境变量<PackageName>_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()命令现在支持对象库。链接到对象库会使用其对象文件为其直接依赖项,并传播使用要求。
变量¶
添加了
CMAKE_FOLDER变量,用于初始化所有目标的FOLDER属性。定义了
CMAKE_DOTNET_TARGET_FRAMEWORK_VERSION变量,用于初始化所有DOTNET_TARGET_FRAMEWORK_VERSION目标属性。引入了
CMAKE_PROJECT_VERSION*变量CMAKE_SUPPRESS_REGENERATION变量已扩展以支持Ninja和Makefile 生成器。它现在也已文档化。定义了
CMAKE_VS_SDK_*_DIRECTORIES变量,以告知面向 VS 2010 及更高版本的Visual Studio 生成器如何填充.vcxproj文件中指定 SDK 目录的字段。变量为:添加了
MSVC_TOOLSET_VERSION变量,以提供与MSVC_VERSION中当前 MSVC 编译器版本关联的 MSVC 工具集版本。
属性¶
引入了
COMMON_LANGUAGE_RUNTIME目标属性,用于配置面向 VS 2010 及更高版本的Visual Studio 生成器的托管 C++ 使用。添加了相应的IMPORTED_COMMON_LANGUAGE_RUNTIME目标属性,以支持导入目标的C++/CLI。引入了
DOTNET_TARGET_FRAMEWORK_VERSION目标属性,以取代VS_DOTNET_TARGET_FRAMEWORK_VERSION,后者现已弃用。添加了
EXPORT_PROPERTIES目标属性,以指定要包含在由install(EXPORT)和export()命令导出的目标中的目标属性的自定义列表。PDB_OUTPUT_DIRECTORY属性现在支持生成器表达式。添加了
TESTS目录属性,用于保存add_test()命令定义的测试列表。创建了
VS_DEBUGGER_COMMAND目标属性,以使用面向 VS 2010 及更高版本的Visual Studio 生成器设置调试命令。HLSL 源文件属性
VS_SHADER_DISABLE_OPTIMIZATIONS和VS_SHADER_ENABLE_DEBUG增加了对生成器表达式的支持。在面向 VS 2010 及更高版本的Visual Studio 生成器中添加了 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选项,以添加一个兼容性定义,用于新语言功能的精确关键字。
生成器表达式¶
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功能现在了解自 VS 2010 以来 MSVC 可用的 C 功能。Compile Features功能现在支持德州仪器 (Texas Instruments) C 编译器所支持的 C 语言标准。
已弃用和移除的功能¶
已移除
Visual Studio 8 2005生成器。CMake 不再为库目标生成
<tgt>_LIB_DEPENDS缓存条目。请参阅策略CMP0073。
其他更改¶
标记为
SYSTEM的目录的包含标志现在移到了非系统目录之后。-isystem标志会自动执行此操作,因此显式将它们移到末尾可以使不支持-isystem标志的编译器保持行为一致。Fortran 依赖项扫描现在支持Fortran Submodules所隐含的依赖项。
${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工具现在在源目录不存在时会失败。之前,它通过创建空的目标目录而成功。UseSWIG模块的swig_add_library()命令(以及旧的swig_add_module命令)现在会将 Java 模块的前缀设置为 MINGW、MSYS 和 CYGWIN 环境的""。