CMake 3.12 发行说明¶
自 CMake 3.11 以来所做的更改包括以下内容。
新功能¶
生成器¶
VS 2017 的 Visual Studio 生成器 学会了在
CMAKE_GENERATOR_TOOLSET值中支持version=14.##选项(例如通过:manual: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`,它可以表达构建系统对全局目录内容的依赖性。添加了
file(TOUCH)和file(TOUCH_NOCREATE)命令以公开TOUCH功能,而无需使用 CMake 的命令行工具模式和execute_process()。find_package()命令现在搜索由<PackageName>_ROOTCMake 变量和<PackageName>_ROOT环境变量指定的前缀。包根以堆栈形式维护,因此对查找模块内所有“find_*”命令的嵌套调用也将根作为前缀进行搜索。请参阅政策:policy:CMP0074。install()命令学习了一个可选的NAMELINK_COMPONENT参数,它允许您更改共享库名称链接的组件。如果未指定,则默认使用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 Generators 如何填充指定 SDK 目录的 .vcxproj 文件中的字段。变量是:添加了
MSVC_TOOLSET_VERSION变量以提供与MSVC_VERSION中当前 MSVC 编译器版本关联的 MSVC 工具集版本。
特性¶
COMMON_LANGUAGE_RUNTIME目标属性被引入来为 VS 2010 及更高版本的 Visual Studio Generators 配置托管 C++ 的使用。添加了相应的 :prop_tgt:`IMPORTED_COMMON_LANGUAGE_RUNTIME 目标属性以支持导入目标的C++/CLI。DOTNET_TARGET_FRAMEWORK_VERSION目标属性被引入作为VS_DOTNET_TARGET_FRAMEWORK_VERSION的替代品,现在被认为已弃用。添加了
EXPORT_PROPERTIES目标属性以指定目标属性的自定义列表,以包含在由install(EXPORT)和export()命令导出的目标中。添加了
TESTS目录属性以保存由add_test()命令定义的测试列表。创建了一个
VS_DEBUGGER_COMMAND目标属性来为 VS 2010 及更高版本设置调试命令行与 Visual Studio 生成器。HLSL 源文件属性
VS_SHADER_DISABLE_OPTIMIZATIONS和VS_SHADER_ENABLE_DEBUG获得了对生成器表达式的支持。HLSL 源文件属性
VS_SHADER_OBJECT_FILE_NAME已添加到 VS 2010 及更高版本的 Visual Studio 生成器。该属性指定编译着色器对象的文件名。
模块¶
FindALSA模块现在提供导入的目标。FindCURL模块现在提供导入的目标。FindJPEG模块现在提供导入的目标。FindLibXml2模块现在提供导入的目标。FindMatlab 模块现在支持用于编译和链接 matlab 扩展的 Matlab 运行时编译器 (MCR)。
添加了
FindODBC模块以查找开放式数据库连接 (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:...>``: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 亲和力的测试,这些处理器与具有该属性集的其他同时运行的测试不相交。
包装¶
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缓存条目。请参阅政策: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工具现在在源目录不存在时失败。以前它通过创建一个空的目标目录成功。UseSWIGmoduleswig_add_library()命令(和遗留的swig_add_module命令)现在为 MINGW、MSYS 和 CYGWIN 环境将 Java 模块的前缀设置为""。