CMake 3.12 发行说明¶
自 CMake 3.11 以来的更改包括以下内容。
新特性¶
生成器¶
VS 2017 的 Visual Studio 生成器 学习支持
version=14.##
选项,在CMAKE_GENERATOR_TOOLSET
值中(例如,通过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)
命令,以公开TOUCH
功能,而无需使用 CMake 的命令行工具模式和execute_process()
。find_package()
命令现在搜索由<PackageName>_ROOT
CMake 变量和<PackageName>_ROOT
环境变量指定的前缀。包根目录以堆栈的形式维护,因此在 find 模块内部对所有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 生成器 如何在指定 SDK 目录的.vcxproj
文件中填充字段。这些变量是添加了
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
获得了对生成器表达式的支持。HLSL 源文件属性
VS_SHADER_OBJECT_FILE_NAME
已添加到 VS 2010 及更高版本的 Visual Studio 生成器 中。该属性指定已编译着色器对象的文件名。
模块¶
FindALSA
模块现在提供导入的目标。FindCURL
模块现在提供导入的目标。FindJPEG
模块现在提供导入的目标。FindLibXml2
模块现在提供导入的目标。FindMatlab
模块现在支持 Matlab Runtime Compiler (MCR),用于编译和链接 matlab 扩展。添加了
FindODBC
模块,用于查找开放数据库互连 (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 生成器
,它对 NuGet 提供了基本支持。
其他¶
已弃用和移除的特性¶
Visual Studio 8 2005
生成器已被移除。CMake 不再为库目标生成
<tgt>_LIB_DEPENDS
缓存条目。请参阅策略CMP0073
。
其他更改¶
标记为
SYSTEM
的目录的包含标志现在移动到非系统目录之后。-isystem
标志会自动执行此操作,因此将它们显式移动到末尾使得在没有任何-isystem
标志的编译器上的行为保持一致。Fortran 依赖项扫描现在支持 Fortran 子模块隐含的依赖项。
文件
${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
工具现在会失败。之前,即使源目录不存在,它也会成功并创建一个空的 destination 目录。UseSWIG
模块swig_add_library()
命令(以及旧的swig_add_module
命令)现在将 Java 模块的前缀设置为""
,用于 MINGW、MSYS 和 CYGWIN 环境。