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_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
值中支持生成器表达式。
变量¶
现在,某些 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初始缓存选项时支持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¶
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
已安装文件属性,可用于分别在“开始”菜单、桌面和启动文件夹中安装快捷方式。
其他¶
编译功能
现在可以识别版本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
。