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_VERSIONVisual Studio 生成器 增加了一个新的
选项,用于将CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILDINSTALL目标放入解决方案(.sln)文件的默认构建中。
属性 (Properties)¶
引入了
目标属性和支持的CROSSCOMPILING_EMULATOR变量,以允许在交叉编译期间在主机上运行目标平台二进制文件。CMAKE_CROSSCOMPILING_EMULATOR引入了
目标属性和支持的<LANG>_INCLUDE_WHAT_YOU_USE变量,用于告知 Makefile 生成器 和CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE生成器,与编译器一起为NinjaC和CXX语言运行include-what-you-use。和<LANG>_VISIBILITY_PRESET目标属性现在会影响所有目标类型的源文件的编译。请参阅策略VISIBILITY_INLINES_HIDDENCMP0063。目标属性现在支持生成器表达式。XCODE_ATTRIBUTE_<an-attribute>
模块 (Modules)¶
引入了
模块,用于检查CheckFortranCompilerFlagFortran编译器标志,这与模块对CheckCCompilerFlagC所做的工作类似。模块增加了一个新的ExternalData选项,用于禁用使用符号链接来填充实际数据文件,而是使用复制。ExternalData_NO_SYMLINKS模块在ExternalDataDATA{}引用中增加了一个新的RECURSE:选项来指定目录。这允许匹配整个关联文件目录树。模块在 URL 模板中增加了一个新的占位符ExternalData%(algo:<key>),通过配置新的变量,允许从算法名称到 URL 组件进行自定义映射。这为远程 URL 提供了更大的灵活性。ExternalData_URL_ALGO_<algo>_<key>模块现在可以在每个步骤的ExternalProjectBYPRODUCTS中替换<BINARY_DIR>等令牌。模块 API 现在支持在使用ExternalProjectLOG_*选项和 CMake 初始缓存选项时使用生成器表达式。模块现在为 RELEASE 和 DEBUG 配置单独跟踪包含库的目录。FindBoost模块现在默认使用静态 CUDA 运行时库(如果可用)。提供了新的FindCUDACUDA_USE_STATIC_CUDA_RUNTIME选项来控制此行为。模块已完全重写。它现在支持版本和组件,并能以更精确和跨平台的方式查找 Matlab。该模块现在提供 API 来创建 mex 扩展、文档和单元测试。FindMatlab模块的FindPackageHandleStandardArgsfind_package_handle_standard_args函数现在始终填充<PackageName>_FOUND和<UPPERCASE_NAME>_FOUND(后者用于向后兼容)变量。FOUND_VAR选项现在被忽略,除非用于强制其允许的值。模块增加了一个新的InstallRequiredSystemLibrariesCMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT选项来指定安装组件。
生成器表达式 (Generator Expressions)¶
引入了一个新的
COMPILE_LANGUAGE生成器表达式,允许根据每个源文件的LANGUAGE来指定目标文件的编译选项。由于底层原生构建工具的限制,此功能在不同生成器中的支持程度有所不同。详情请参阅cmake-generator-expressions(7)手册。
CTest¶
工具增加了一个新的ctest(1)--repeat-until-fail <n>选项,用于帮助查找偶发性测试失败。模块现在支持与CTestCoverageCollectGCOV命令相同的ctest_coverage()CTEST_CUSTOM_COVERAGE_EXCLUDE选项。
CPack¶
现在支持 Qt Framework Installer 2.0 工具。CPack IFW Generator增加了一个新的CPack DEB Generator变量,用于指定每个组件对CPACK_DEBIAN_<COMPONENT>_PACKAGE_SHLIBDEPSdpkg-shlibdeps的使用。增加了一个新的CPack DEB Generator选项,用于指定每个组件的依赖项。CPACK_DEBIAN_<COMPONENT>_PACKAGE_DEPENDS现在能更干净地打包符号链接,并且对于较新的CPack RPM Generatorrpmbuild版本支持目录符号链接。增加了一个新的CPack RPM Generator变量,用于为CPACK_RPM_ADDITIONAL_MAN_DIRSbrp-compressRPM 宏指定包含 man 页的目录。增加了一个新的CPack RPM Generator变量,用于指定特定组件的包架构。CPACK_RPM_<component>_PACKAGE_ARCHITECTURECPack WIX 生成器支持了新的安装文件属性
、CPACK_START_MENU_SHORTCUTS和CPACK_DESKTOP_SHORTCUTS,这些属性可用于分别在开始菜单、桌面上和启动文件夹中安装快捷方式。CPACK_STARTUP_SHORTCUTS
其他 (Other)¶
编译特性功能现在能够识别 GNU 编译器在 Windows 4.4 到 5.0 版本中支持的特性。的cmake(1)-E tar命令增加了一个新的--format<format>选项,用于指定要写入的存档格式。在 OS X 上,CMake 现在可以创建 XCTest bundle 来测试 Xcode 中的 Frameworks 和 App Bundles。
模块提供了便捷函数来处理FindXCTestbundle。XCTEST
已弃用和移除的功能 (Deprecated and Removed Features)¶
在 OS X 上,
不再提供 “Install For Command Line Use” 菜单项。取而代之的是一个 “How to Install For Command Line Use” 菜单项,它会显示一个信息对话框,解释如何使命令行工具可用。例如:cmake-gui(1)/Applications/CMake.app/Contents/bin/cmake-gui --install
和ctest_build()命令不再使用build_command()-i选项指示make工具忽略错误。以前,这只为 Makefile 生成器 执行,但对其他生成器不执行。请参阅策略CMP0061。生成器不再检查是否正在运行 VS IDE 并且项目已打开,也不会要求它们重新加载。这最初是为 VS 10 完成的,因为 VS 7 到 9 都是这样做的,以避免提示重新加载解决方案中的每个项目。由于 VS >= 10 可以一次重新加载整个解决方案,因此不需要 CMake 来帮助它们。Visual Studio 10 2010生成器(.NET 2002)现已弃用,将在 CMake 的未来版本中移除。Visual Studio 7生成器现已弃用,将在 CMake 的未来版本中移除。Visual Studio 6命令不再考虑最近在find_package()中配置的项目构建树。以前这只在 Windows 上进行,现在永远不会再进行。cmake-gui(1)NO_CMAKE_BUILDS_PATH选项现在如果提供则被忽略,并且实际上始终有效。项目可以通过填充 用户包注册表 来帮助用户连续构建多个依赖项目。命令不再导致add_definitions()目录属性被填充。请参阅策略DEFINITIONSCMP0059。对于 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。