CMake 3.12 发行说明¶
自 CMake 3.11 以来所做的更改包括以下内容。
新特性¶
生成器¶
Visual Studio 生成器适用于 VS 2017,学会支持
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)
,无需使用带execute_process()
的 CMake 命令行工具模式即可展示TOUCH
功能。命令
find_package()
现搜索 CMake 变量<PackageName>_ROOT
和环境变量<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
target 属性。CMAKE_PROJECT_VERSION*
变量已引入CMAKE_SUPPRESS_REGENERATION
变量已扩展为支持Ninja
和 Makefile Generators。现在也有了文档记载。CMAKE_VS_SDK_*_DIRECTORIES
变量被定义,用来告诉 Visual Studio Generators(适用于 VS 2010 及以上版本)如何填充.vcxproj
文件中指定 SDK 目录的字段。这些变量包括MSVC_TOOLSET_VERSION
变量已添加,用于提供与MSVC_VERSION
中当前 MSVC 编译器版本关联的 MSVC 工具集版本。
属性¶
COMMON_LANGUAGE_RUNTIME
target 属性已引入,用于配置针对 VS 2010 及更高版本 Visual Studio 生成器的托管 C++ 的使用。对应的IMPORTED_COMMON_LANGUAGE_RUNTIME
target 属性已添加,用于支持导入的 target 的C++/CLI
。DOTNET_TARGET_FRAMEWORK_VERSION
target 属性已引入,作为VS_DOTNET_TARGET_FRAMEWORK_VERSION
的替代品,后者现在被认为已弃用。EXPORT_PROPERTIES
target 属性已添加,用于指定由install(EXPORT)
和export()
命令导出的 target 中要包含的目标属性的自定义列表。这个
PDB_OUTPUT_DIRECTORY
属性了解如何支持generator expressions
。添加了
TESTS
目录属性,以保存由add_test()
命令定义的测试列表。创建了一个
VS_DEBUGGER_COMMAND
目标属性,以使用 Visual Studio Generators 为 VS 2010 及以上版本设置调试命令行。HLSL 源文件属性
VS_SHADER_DISABLE_OPTIMIZATIONS
和VS_SHADER_ENABLE_DEBUG
开始支持 generator expressions。添加了 HLSL 源文件属性
VS_SHADER_OBJECT_FILE_NAME
,用于 Visual Studio Generators for VS 2010 及以上版本。此属性指定已编译着色器对象的 filename。
Modules¶
FindALSA
模块现在提供导入目标。FindCURL
模块现在提供导入目标。FindJPEG
模块现在提供导入目标。FindLibXml2
模块现在提供导入目标。现在,
FindMatlab
模块支持 Matlab 运行时编译器 (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 Generator
,其中对 NuGet 提供了基本支持。
其他¶
弃用和移除的功能¶
现在已移除
Visual Studio 8 2005
生成器。CMake 不再针对库目标生成
<tgt>_LIB_DEPENDS
缓存条目。参见策略CMP0073
。
其他更改¶
标记为
SYSTEM
的目录的包含标志现在移动到了非系统目录之后。-isystem
标志会自动执行此操作,因此将它们明确移动到末尾可以在没有-isystem
标志的编译器上实现一致的行为。Fortran 依赖项扫描现在支持由Fortran 子模块暗示的依赖项。
现在已在
install()
文档中记录了文件${CMAKE_BINARY_DIR}/cmake_install.cmake
的存在和功能,以便外部打包软件可以利用 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 环境中的""
。