CMake 3.3 发行说明¶
自 CMake 3.2 以来所做的更改包括以下内容。
新功能¶
生成器¶
Makefile 生成器 现在将
.DELETE_ON_ERROR添加到包含磁盘文件实际构建规则的 makefile 中。这告诉 GNU make 在他们的配方修改输出但失败时删除规则输出。Visual Studio 生成器 学会了支持
.xaml源文件并自动将它们与相应的.h和.cpp源相关联。在 Windows 上添加了一个新的实验性
Green Hills MULTI生成器。 Green Hills MULTI 是用于嵌入式实时系统的 IDE。
命令¶
add_dependencies()命令学会了允许将依赖项添加到 interface libraries。添加到接口库的依赖项会在其位置上传递,因为目标本身不会构建。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运算符,如果给定元素包含在命名列表中,该运算符的计算结果为 true。install(EXPORT)和export()命令学会了导出填充INTERFACE_SOURCES目标属性的目标。install(TARGETS)命令学会了在DESTINATION值中支持生成器表达式。
变量¶
现在检测到某些 Fortran 编译器的版本并将其存储在
CMAKE_Fortran_COMPILER_VERSION变量中。Visual Studio 生成器 学习了一个新的
CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD选项,用于将INSTALL目标放入解决方案 (.sln) 文件的默认构建中。
特性¶
一个
CROSSCOMPILING_EMULATOR目标属性和支持CMAKE_CROSSCOMPILING_EMULATOR变量被引入以允许目标平台二进制文件在交叉编译期间在主机上运行。<LANG>_INCLUDE_WHAT_YOU_USE目标属性和支持CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE变量被引入来告诉 Makefile 生成器 和Ninja生成器运行 `` include-what-you-use`` 以及用于C和CXX语言的编译器。<LANG>_VISIBILITY_PRESET和VISIBILITY_INLINES_HIDDEN目标属性现在影响所有目标类型源中的编译。请参阅政策:policy:CMP0063。XCODE_ATTRIBUTE_<an-attribute>目标属性学会了支持生成器表达式。
模块¶
CheckFortranCompilerFlag模块被引入来检查``Fortran`` 编译器标志,就像CheckCCompilerFlag模块已经为C做的一样。ExternalData模块学习了一个新的ExternalData_NO_SYMLINKS选项来禁止使用符号链接来填充真实数据文件,而是使用副本。ExternalData模块在指定目录的DATA{}引用中学习了一个新的RECURSE:选项。这允许匹配关联文件的整个目录树。ExternalData模块学习了一个新的 URL 模板占位符%(algo:<key>)以允许通过配置新的 :variable:`ExternalData_URL_ALGO_<algo>_< 从算法名称到 URL 组件的自定义映射键>`变量。这允许远程 URL 具有更大的灵活性。ExternalProject模块学会了在每个步骤的BYPRODUCTS中替换诸如<BINARY_DIR>的标记。ExternalProject模块 API 学会了在使用LOG_*选项和 CMake 初始缓存选项时支持generator expressions。FindBoost 模块现在跟踪包含库的目录,分别用于 RELEASE 和 DEBUG 配置。
FindCUDA 模块现在默认使用静态 CUDA 运行时库(如果可用)。提供了一个新的
CUDA_USE_STATIC_CUDA_RUNTIME选项来控制此行为。FindMatlab模块被完全重写。它了解版本和组件,并以更精确和多平台的方式找到 Matlab。该模块现在提供 API 来创建 mex 扩展、文档和单元测试。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)手册。
C测试¶
ctest(1)工具学习了一个新的--repeat-until-fail <n>选项来帮助查找零星的测试失败。CTestCoverageCollectGCOV模块学会了支持与ctest_coverage()命令相同的CTEST_CUSTOM_COVERAGE_EXCLUDE选项。
包装¶
CPack IFW Generator学会了支持 Qt Framework Installer 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变量来指定包含 brp-compress RPM 宏手册页的目录。CPack RPM Generator学习了一个新的CPACK_RPM_<component>_PACKAGE_ARCHITECTURE变量来指定组件特定的包架构。CPack WIX 生成器学习了新的
CPACK_START_MENU_SHORTCUTS、CPACK_DESKTOP_SHORTCUTS和CPACK_STARTUP_SHORTCUTS安装文件属性,可用于在开始菜单、桌面和启动文件夹中安装快捷方式分别。
其他¶
Compile Features功能现在可以识别 Windows 4.4 到 5.0 版 GNU 编译器支持的功能。cmake(1)-E tar命令学习了一个新的--format<format>选项来指定要写入的存档格式。在 OS X 上,CMake 学会了创建 XCTest 包来测试 Xcode 中的框架和应用程序包。 FindXCTest 模块提供了方便的函数来处理 XCTEST 包。
弃用和删除的功能¶
在 OS X 上,
cmake-gui(1)不再有Install For Command Line Use菜单项。相反,有一个“如何为命令行使用安装”菜单项,它显示一个信息对话框,解释如何使命令行工具可用。例如::/Applications/CMake.app/Contents/bin/cmake-gui --install
ctest_build()和build_command()命令不再告诉make工具使用-i选项忽略错误。以前这是为 Makefile 生成器 而不是其他人完成的。请参阅政策:policy: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目录属性被填充。请参阅政策:policy:CMP0059。使用 Visual Studio 7、8 和 9 生成器,
$(OutDir)占位符的值不再计算为配置名称。项目应该使用$(ConfigurationName)来代替。不再允许将
export()的输出与install(FILES)命令一起使用。有关详细信息,请参阅政策:policy:CMP0062。
其他变化¶
Ninja生成器现在要求调用add_custom_command()和add_custom_target()命令使用BYPRODUCTS选项来显式指定由未列出的自定义命令生成的任何文件作为输出(可能是因为允许它们的时间戳早于输入)。请参阅政策:policy:CMP0058。Makefile 生成器 的构建时进度输出已得到改进。它不再在并行构建期间混合进度和构建规则消息。链接规则消息现在有进展并显示为粗体绿色而不是粗体红色(因为红色通常与错误消息相关联)。
Visual Studio 7、8 和 9 的
CMAKE_CFG_INTDIR变量值现在是$(ConfigurationName)而不是$(OutDir)。这对变量的预期用例应该没有影响。通过隐式链接器搜索目录(例如``/usr/lib/libfoo.a``)中的完整路径链接到库文件不再要求链接器搜索库(例如``-lfoo``),现在按完整路径链接。请参阅政策:policy:CMP0060。