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_VERSION
Visual Studio 生成器 增加了一个新的
选项,用于将CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
INSTALL
目标放入解决方案(.sln
)文件的默认构建中。
属性 (Properties)¶
引入了
目标属性和支持的CROSSCOMPILING_EMULATOR
变量,以允许在交叉编译期间在主机上运行目标平台二进制文件。CMAKE_CROSSCOMPILING_EMULATOR
引入了
目标属性和支持的<LANG>_INCLUDE_WHAT_YOU_USE
变量,用于告知 Makefile 生成器 和CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE
生成器,与编译器一起为Ninja
C
和CXX
语言运行include-what-you-use
。
和<LANG>_VISIBILITY_PRESET
目标属性现在会影响所有目标类型的源文件的编译。请参阅策略VISIBILITY_INLINES_HIDDEN
CMP0063
。
目标属性现在支持生成器表达式。XCODE_ATTRIBUTE_<an-attribute>
模块 (Modules)¶
引入了
模块,用于检查CheckFortranCompilerFlag
Fortran
编译器标志,这与
模块对CheckCCompilerFlag
C
所做的工作类似。
模块增加了一个新的ExternalData
选项,用于禁用使用符号链接来填充实际数据文件,而是使用复制。ExternalData_NO_SYMLINKS
模块在ExternalData
DATA{}
引用中增加了一个新的RECURSE:
选项来指定目录。这允许匹配整个关联文件目录树。
模块在 URL 模板中增加了一个新的占位符ExternalData
%(algo:<key>)
,通过配置新的
变量,允许从算法名称到 URL 组件进行自定义映射。这为远程 URL 提供了更大的灵活性。ExternalData_URL_ALGO_<algo>_<key>
模块现在可以在每个步骤的ExternalProject
BYPRODUCTS
中替换<BINARY_DIR>
等令牌。
模块 API 现在支持在使用ExternalProject
LOG_*
选项和 CMake 初始缓存选项时使用生成器表达式
。
模块现在为 RELEASE 和 DEBUG 配置单独跟踪包含库的目录。FindBoost
模块现在默认使用静态 CUDA 运行时库(如果可用)。提供了新的FindCUDA
CUDA_USE_STATIC_CUDA_RUNTIME
选项来控制此行为。
模块已完全重写。它现在支持版本和组件,并能以更精确和跨平台的方式查找 Matlab。该模块现在提供 API 来创建 mex 扩展、文档和单元测试。FindMatlab
模块的FindPackageHandleStandardArgs
find_package_handle_standard_args
函数现在始终填充<PackageName>_FOUND
和<UPPERCASE_NAME>_FOUND
(后者用于向后兼容)变量。FOUND_VAR
选项现在被忽略,除非用于强制其允许的值。
模块增加了一个新的InstallRequiredSystemLibraries
CMAKE_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_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 宏指定包含 man 页的目录。
增加了一个新的CPack RPM Generator
变量,用于指定特定组件的包架构。CPACK_RPM_<component>_PACKAGE_ARCHITECTURE
CPack 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。
模块提供了便捷函数来处理FindXCTest
bundle。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()
目录属性被填充。请参阅策略DEFINITIONS
CMP0059
。对于 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
。