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()
命令学习允许将依赖项添加到 接口库。添加到接口库的依赖项在其位置被传递性地跟踪,因为目标本身不构建。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
生成器在C
和CXX
语言的编译器一起运行include-what-you-use
。<LANG>_VISIBILITY_PRESET
和VISIBILITY_INLINES_HIDDEN
目标属性现在影响所有目标类型的源文件中的编译。请参阅策略CMP0063
。XCODE_ATTRIBUTE_<an-attribute>
目标属性学习支持生成器表达式。
模块¶
引入了
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 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
安装文件属性,这些属性可用于在“开始”菜单、桌面和启动文件夹中分别安装快捷方式。
其他¶
编译特性
功能现在了解 Windows 上 GNU 编译器(版本 4.4 到 5.0)支持的特性。cmake(1)
-E tar
命令学习了一个新的--format<format>
选项,以指定要写入的存档格式。在 OS X 上,CMake 学习创建 XCTest bundle 以在 Xcode 中测试 Frameworks 和 App Bundles。
FindXCTest
模块提供了方便的函数来处理XCTEST
bundle。
已弃用和移除的特性¶
在 OS X 上,
cmake-gui(1)
不再具有为命令行使用安装
菜单项。相反,有一个如何为命令行使用安装
菜单项,该菜单项显示一个信息对话框,解释如何使命令行工具可用。例如/Applications/CMake.app/Contents/bin/cmake-gui --install
ctest_build()
和build_command()
命令不再告诉make
工具使用-i
选项忽略错误。以前,这是为 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
选项来显式指定自定义命令生成的任何未列为输出的文件(可能是因为它们的时间戳允许比输入旧)。请参阅策略CMP0058
。Makefile 生成器 的构建时进度输出已得到改进。在并行构建期间,它不再混合进度和构建规则消息。链接规则消息现在具有进度,并显示为粗体绿色而不是粗体红色(因为红色通常与错误消息相关联)。
Visual Studio 7、8 和 9 的
CMAKE_CFG_INTDIR
变量值现在是$(ConfigurationName)
而不是$(OutDir)
。这应该对变量的预期用例没有影响。在隐式链接器搜索目录(例如
/usr/lib/libfoo.a
)中通过完整路径链接到库文件不再要求链接器搜索库(例如-lfoo
),现在通过完整路径链接。请参阅策略CMP0060
。