CMake 3.3 发行说明¶
自 CMake 3.2 以来的更改包括:
新特性¶
生成器 (Generators)¶
Makefile 生成器 现在会在包含磁盘文件实际构建规则的 makefile 中添加
.DELETE_ON_ERROR。这会告诉 GNU make 在其配方修改输出但失败时移除输出。Visual Studio 生成器 已支持
.xaml源文件,并自动将它们与相应的.h和.cpp源文件关联起来。在 Windows 上新增了一个实验性的
Green Hills MULTI生成器。Green Hills MULTI 是一个面向嵌入式实时系统的 IDE。
命令 (Commands)¶
add_dependencies()命令现已支持向 接口库 添加依赖项。添加到接口库的依赖项会作为传递依赖项被遵循,因为目标本身不会构建。execute_process()命令现已支持为OUTPUT_FILE和ERROR_FILE指定同一个文件。file(GLOB)和file(GLOB_RECURSE)命令新增了一个LIST_DIRECTORIES <bool>选项,用于指定 glob 结果是否应包含目录。find_library()、find_path()和find_file()命令现在会在从PATH环境变量派生的安装前缀中进行搜索。if()命令新增了一个IN_LIST操作符,如果给定元素包含在指定的列表中,则评估为真。install(EXPORT)和export()命令现已支持导出填充INTERFACE_SOURCES目标属性的依赖项。install(TARGETS)命令的DESTINATION值现在支持生成器表达式。
变量 (Variables)¶
一些 Fortran 编译器的版本现在可以被检测并存储在
CMAKE_Fortran_COMPILER_VERSION变量中。Visual Studio 生成器 新增了一个
CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD选项,用于将INSTALL目标放入解决方案 (.sln) 文件的默认构建中。
属性 (Properties)¶
引入了
CROSSCOMPILING_EMULATOR目标属性和相关的CMAKE_CROSSCOMPILING_EMULATOR变量,以允许在交叉编译期间在主机上运行目标平台二进制文件。引入了
<LANG>_INCLUDE_WHAT_YOU_USE目标属性和相关的CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE变量,用于告知 Makefile 生成器 和Ninja生成器与编译器一起为C和CXX语言运行include-what-you-use。<LANG>_VISIBILITY_PRESET和VISIBILITY_INLINES_HIDDEN目标属性现在会影响所有目标类型的源文件的编译。请参见策略CMP0063。XCODE_ATTRIBUTE_<an-attribute>目标属性现已支持生成器表达式。
模块 (Modules)¶
引入了
CheckFortranCompilerFlag模块,用于检查Fortran编译器标志,类似于CheckCCompilerFlag模块对C所做的工作。ExternalData模块新增了一个ExternalData_NO_SYMLINKS选项,用于禁用符号链接来填充实际数据文件,转而使用副本。ExternalData模块在DATA{}引用中新增了一个RECURSE:选项,用于指定目录。这允许匹配整个目录树的关联文件。ExternalData模块新增了一个 URL 模板占位符%(algo:<key>),通过配置新的ExternalData_URL_ALGO_<algo>_<key>变量,允许从算法名称到 URL 组件的自定义映射。这使得远程 URL 更加灵活。ExternalProject模块现在可以在每个步骤的BYPRODUCTS中替换<BINARY_DIR>等令牌。ExternalProject模块 API 在使用LOG_*选项以及 CMake 初始缓存选项时,现在支持生成器表达式。FindBoost模块现在会分别为 RELEASE 和 DEBUG 配置分别跟踪包含库的目录。FindCUDA模块现在默认使用静态 CUDA 运行时库(如果可用)。提供了一个新的CUDA_USE_STATIC_CUDA_RUNTIME选项来控制此行为。FindMatlab模块已完全重写。它能够识别版本和组件,并以更精确、跨平台的方式查找 Matlab。该模块现在提供了创建 mex 扩展、文档和单元测试的 API。FindPackageHandleStandardArgs模块的find_package_handle_standard_args()命令现在始终填充<PackageName>_FOUND和<UPPERCASE_NAME>_FOUND变量(后者用于向后兼容)。FOUND_VAR选项现在被忽略,除非用于强制执行其允许的值。InstallRequiredSystemLibraries模块新增了一个CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT选项,用于指定安装组件。
生成器表达式¶
引入了一个新的
COMPILE_LANGUAGE生成器表达式,允许根据每个源文件的LANGUAGE为目标文件指定编译选项。由于底层原生构建工具的限制,此功能在不同生成器上的支持程度有所不同。详情请参阅cmake-generator-expressions(7)手册。
CTest¶
ctest(1)工具新增了一个--repeat-until-fail <n>选项,以帮助查找偶发性的测试失败。CTestCoverageCollectGCOV模块现已支持与ctest_coverage()命令相同的CTEST_CUSTOM_COVERAGE_EXCLUDE选项。
CPack¶
CPack IFW Generator已支持 Qt Installer Framework 2.0 工具。CPack DEB Generator新增了一个CPACK_DEBIAN_<COMPONENT>_PACKAGE_SHLIBDEPS变量,用于指定每个组件对dpkg-shlibdeps的使用。CPack DEB Generator新增了一个CPACK_DEBIAN_<COMPONENT>_PACKAGE_DEPENDS选项,用于指定每个组件的依赖项。CPack RPM Generator现在能更干净地打包符号链接,并支持使用较新版本的rpmbuild来处理目录符号链接。CPack RPM Generator新增了一个CPACK_RPM_ADDITIONAL_MAN_DIRS变量,用于指定包含 man 页的目录,以供 brp-compress RPM 宏使用。CPack RPM Generator新增了一个CPACK_RPM_<component>_PACKAGE_ARCHITECTURE变量,用于指定组件特定的包架构。CPack WIX 生成器现已支持
CPACK_START_MENU_SHORTCUTS、CPACK_DESKTOP_SHORTCUTS和CPACK_STARTUP_SHORTCUTS安装文件属性,分别用于在“开始”菜单、桌面上以及启动文件夹中安装快捷方式。
其他 (Other)¶
编译特性功能现在已支持 Windows 上的 GNU 编译器(版本 4.4 到 5.0)所支持的特性。cmake(1)的-E tar命令新增了一个--format<format>选项,用于指定要写入的存档格式。在 OS X 上,CMake 已支持创建 XCTest 束来测试 Xcode 中的 Frameworks 和 App Bundles。
FindXCTest模块提供了便捷函数来处理XCTEST束。
已弃用和移除的功能 (Deprecated and Removed Features)¶
在 OS X 上,
cmake-gui(1)不再显示“Install For Command Line Use”(为命令行使用安装)菜单项。取而代之的是一个“How to Install For Command Line Use”(如何为命令行使用安装)菜单项,它会显示一个信息对话框,解释如何使命令行工具可用。例如:/Applications/CMake.app/Contents/bin/cmake-gui --install
ctest_build()和build_command()命令不再使用-i选项指示make工具忽略错误。之前,这只针对 Makefile 生成器 而非其他生成器。请参见策略CMP0061。Visual Studio 10 2010生成器不再检查正在运行的 VS IDE 是否打开了项目,也不再要求它们重新加载。这最初是为了 VS 10 而做的,因为 VS 7 到 9 也是这样做的,目的是避免为解决方案中的每个项目都进行提示。由于 VS >= 10 支持一次性重新加载整个解决方案,因此不需要 CMake 来帮助它们。Visual Studio 7(.NET 2002) 生成器现已弃用,并将在 CMake 的未来版本中移除。Visual Studio 6生成器现已弃用,并将在 CMake 的未来版本中移除。find_package()命令不再考虑在cmake-gui(1)中最近配置的项目构建树。这之前仅在 Windows 上执行,现在永远不再执行。NO_CMAKE_BUILDS_PATH选项现在被忽略(如果提供),并且实际上总是开启的。项目可以填充 用户包注册表 来帮助用户一个接一个地构建多个依赖项目。add_definitions()命令不再会导致DEFINITIONS目录属性被填充。请参见策略CMP0059。使用 Visual Studio 7、8 和 9 生成器时,
$(OutDir)占位符的值不再评估为配置名称。项目应该改为使用$(ConfigurationName)。使用
export()的输出与install(FILES)命令一起使用已不再被允许。详情请参阅策略CMP0062。
其他更改 (Other Changes)¶
Ninja生成器现在要求对add_custom_command()和add_custom_target()命令的调用使用BYPRODUCTS选项来显式指定由自定义命令生成但未列为输出的任何文件(可能是因为它们的更新时间允许比输入旧)。请参见策略CMP0058。改进了 Makefile 生成器 的构建时进度输出。在并行构建期间,它不再混合进度和构建规则消息。链接规则消息现在具有进度,并显示为粗体绿色而不是粗体红色(因为红色通常与错误消息相关)。
Visual Studio 7、8 和 9 的
CMAKE_CFG_INTDIR变量值现在是$(ConfigurationName)而不是$(OutDir)。这应该不会对变量的预期用途产生任何影响。在隐式链接器搜索目录中通过完整路径链接到库文件(例如
/usr/lib/libfoo.a)不再会要求链接器搜索该库(例如-lfoo),而是直接通过完整路径进行链接。请参见策略CMP0060。