CMake 3.3 版本发布说明

自 CMake 3.2 以来的更改包括以下内容。

新功能

生成器

  • 现在,Makefile 生成器 会在包含磁盘上文件实际构建规则的 Makefile 中添加 .DELETE_ON_ERROR。这告诉 GNU make 在其规则修改输出但失败时删除规则输出。

  • 现在,Visual Studio 生成器 学会了支持 .xaml 源文件并将其自动与相应的 .h.cpp 源文件关联。

  • 在 Windows 上添加了一个新的实验性 Green Hills MULTI 生成器。Green Hills MULTI 是一个用于嵌入式实时系统的 IDE。

命令

  • 现在,add_dependencies() 命令学会了允许将依赖项添加到 接口库。由于目标本身不构建,因此添加到接口库的依赖项会在其位置被传递地遵循。

  • 现在,execute_process() 命令学会了支持为 OUTPUT_FILEERROR_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 值中支持生成器表达式。

变量

属性

模块

  • 引入了 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初始缓存选项时支持generator expressions

  • 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

CPack

其他

  • 编译功能现在可以识别版本4.4到5.0的Windows上GNU编译器支持的功能。

  • cmake(1) -E tar命令学习了一个新的--format<format>选项来指定要写入的存档格式。

  • 在OS X上,CMake学习了创建XCTest捆绑包以在Xcode中测试框架和应用程序捆绑包。FindXCTest模块提供了方便的函数来处理XCTEST捆绑包。

已弃用和已删除的功能

  • 在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

其他更改

  • 生成器Ninja现在要求对命令add_custom_command()add_custom_target()的调用使用BYPRODUCTS选项显式指定任何由自定义命令生成的文件,这些文件未列为输出(可能是因为允许它们的 timestamps 比输入旧)。请参阅策略CMP0058

  • Makefile 生成器的构建时进度输出已得到改进。它不再在并行构建期间混合进度和构建规则消息。链接规则消息现在具有进度,并显示为粗体绿色而不是粗体红色(因为红色通常与错误消息相关联)。

  • Visual Studio 7、8 和 9 的变量CMAKE_CFG_INTDIR的值现在为$(ConfigurationName),而不是$(OutDir)。这应该不会影响变量的预期用例。

  • 在隐式链接器搜索目录(例如/usr/lib/libfoo.a)中通过完整路径链接库文件不再要求链接器搜索库(例如-lfoo),而是通过完整路径链接。请参阅策略CMP0060