CMake 3.8 发行说明¶
自 CMake 3.7 以来的更改包括以下内容。
新特性¶
语言¶
C#¶
CMake 现在支持将
CSharp
(C#) 作为一等语言,可以通过project()
和enable_language()
命令启用。目前,它由 VS 2010 及以上版本的 Visual Studio 生成器 支持。C# 程序集和程序可以使用
add_library()
和add_executable()
命令像常见的 C++ 目标一样添加。同一源树中的 C# 目标之间的引用可以通过target_link_libraries()
指定,就像 C++ 一样。对系统或第三方程序集的引用可以通过目标属性VS_DOTNET_REFERENCE_<refname>
和VS_DOTNET_REFERENCES
指定。可以使用目标和源文件属性对 C# 目标进行更精细的调整。特别是与 Visual Studio 相关的目标属性 (
VS_*
) 值得一看(用于设置工具集版本、根命名空间、程序集图标等)。
CUDA¶
CMake 现在支持将
CUDA
作为一等语言,可以通过project()
和enable_language()
命令启用。目前,
CUDA
由 Linux、macOS 和 Windows 上的 Makefile 生成器 和Ninja
生成器支持。对 Visual Studio IDE 的支持正在开发中,但未包含在此发行版中。支持 NVIDIA CUDA Toolkit 编译器 (
nvcc
)。
C & C++¶
Compile Features
功能现在提供元特性,用于请求特定语言标准级别的编译器模式(例如cxx_std_11
)。请参阅CMAKE_C_KNOWN_FEATURES
和CMAKE_CXX_KNOWN_FEATURES
。Compile Features
功能现在支持 C++17。除了cxx_std_17
元特性之外,尚未枚举任何特定功能。Compile Features
功能现在支持从 3.4 版本开始的 gcc 对 C99 的支持。
平台¶
添加了一个新的
Fuchsia
的最小平台文件。
生成器¶
CodeBlocks
附加生成器现在可以与NMake Makefiles JOM
一起生成。VS 2013 及以上版本的 Visual Studio 生成器 支持在
CMAKE_GENERATOR_TOOLSET
值中使用host=x64
选项(例如通过cmake(1)
的-T
选项)来请求在 64 位主机上使用 VS 64 位工具链。Visual Studio 生成器 支持将传递给
target_link_libraries()
且文件名以.targets
结尾的文件视为 MSBuild "targets" 文件,并导入到生成的项目文件中。
命令¶
add_custom_command()
和add_custom_target()
命令支持COMMAND_EXPAND_LISTS
选项,该选项会导致COMMAND
参数中的列表被展开,包括由生成器表达式创建的列表。execute_process()
命令增加了ENCODING
选项,用于在 Windows 上指定子进程输出使用的编码。math(EXPR)
命令增加了对一元+
和-
运算符的支持。source_group()
命令增加了TREE
和PREFIX
选项,以根据源树目录结构添加分组。string(TIMESTAMP)
命令现在支持将%%
作为转义普通%
的方式。string(TIMESTAMP)
命令现在将遵守SOURCE_DATE_EPOCH
环境变量,并使用其值而不是当前时间。try_compile()
命令的源文件签名增加了新选项,用于指定生成测试项目时使用的语言标准。try_compile()
命令的源文件签名现在遵守CMAKE_CXX_STANDARD
等语言标准变量。请参阅策略CMP0067
。
变量¶
添加了
CMAKE_CODELITE_USE_TARGETS
变量,用于告知CodeLite
附加生成器更改生成的项目以进行以目标为中心的组织。然后,CodeLite
中的build
、rebuild
和clean
操作将作用于选定的目标而不是整个工作区。(请注意,Ninja
对目标的 clean 操作会包含其依赖项。)添加了
CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS
变量,用于告知Sublime Text 2
附加生成器将指定的环境变量放入生成的.sublime-project
文件中。添加了
CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE
变量,用于告知Sublime Text 2
附加生成器在构建树位于源树内部时是否从.sublime-project
文件中排除构建树。添加了
CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD
变量,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 将PACKAGE
目标包含在默认构建中,这与现有的CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
变量对于INSTALL
目标类似。
属性¶
添加了
BUILD_RPATH
目标属性和相应的CMAKE_BUILD_RPATH
变量,以支持将自定义RPATH
位置添加到构建树中的二进制文件中。COMPILE_FLAGS
源文件属性现在支持生成器表达式
。在 Apple 目标上,
FRAMEWORK
目标属性现在也可以应用于静态库。它将生成一个合适的 Framework,但其中包含一个静态库。导入 接口库 现在具有新的目标属性
IMPORTED_LIBNAME
和IMPORTED_LIBNAME_<CONFIG>
,用于指定链接库名称,因为接口库不构建自己的库文件。引入了
<LANG>_CPPLINT
目标属性和支持的CMAKE_<LANG>_CPPLINT
变量,用于告知 Makefile 生成器 和Ninja
生成器在编译 C 和 C++ 语言时运行cpplint
风格检查器。添加了
MANUALLY_ADDED_DEPENDENCIES
目标属性。它提供了一个只读列表,其中包含使用add_dependencies()
命令添加的依赖项。MAP_IMPORTED_CONFIG_<CONFIG>
目标属性现在可以解释空列表元素,以引用由IMPORTED_LOCATION
指定的无配置的导入位置。现在 导入 接口库 支持
NO_SYSTEM_FROM_IMPORTED
目标属性。新增了源文件属性
SKIP_AUTOMOC
、SKIP_AUTOUIC
、SKIP_AUTORCC
和SKIP_AUTOGEN
,允许源文件被AUTOMOC
、AUTOUIC
和AUTORCC
目标属性排除处理。添加了
VS_COPY_TO_OUT_DIR
源文件属性,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 文件是否应复制到输出目录。添加了
VS_DEBUGGER_WORKING_DIRECTORY
目标属性,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 应为目标设置的调试器工作目录。添加了
VS_DOTNET_REFERENCES_COPY_LOCAL
目标属性,用于指定是否将引用的程序集复制到输出目录。添加了
VS_DOTNET_REFERENCE_<refname>
目标属性,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 添加带有给定提示路径的 .NET 引用。添加了
VS_INCLUDE_IN_VSIX
源文件属性,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 是否将文件包含在 Visual Studio 扩展包中。添加了
VS_RESOURCE_GENERATOR
源文件属性,用于为 VS 2010 及以上版本的 Visual Studio 生成器 提供资源生成器设置(仅限 C#)。添加了
VS_USER_PROPS
目标属性,用于告知 VS 2010 及以上版本的 Visual Studio 生成器 使用自定义的 MSBuild 用户.props
文件。添加了
XCODE_EMIT_EFFECTIVE_PLATFORM_NAME
全局属性,用于告知Xcode
生成器是否发出EFFECTIVE_PLATFORM_NAME
变量。这在同时使用多个 SDK(如macosx
和iphoneos
)进行构建时很有用。创建了新的目标属性
XCODE_PRODUCT_TYPE
和XCODE_EXPLICIT_FILE_TYPE
,用于告知Xcode
生成器在生成的 Xcode 项目中使用目标对应的自定义属性值。
模块¶
添加了
CSharpUtilities
模块,以帮助参数化 Visual Studio C# 目标。它提供了函数,可以根据需要自动设置源文件属性以支持 Windows Forms、WPF/XAML 或其他技术。ExternalData
模块现在支持一个数据文件有多个内容链接,使用不同的哈希值,例如img.png.sha256
和img.png.sha1
。这允许从不同哈希算法索引的源获取对象。ExternalProject
模块增加了GIT_PROGRESS
选项,以强制 Git 在克隆存储库时显示进度。ExternalProject
模块增加了GIT_CONFIG
选项,用于在克隆存储库时将--config
选项传递给 Git。FeatureSummary
模块的feature_summary()
命令现在接受一个新的QUIET_ON_EMPTY
选项,当所选类别的包列表为空时,该选项会抑制输出。FeatureSummary
模块的add_feature_info()
命令现在接受依赖项列表来决定是否启用某个功能。可以通过更改
FeatureSummary_PKG_TYPES
、FeatureSummary_REQUIRED_PKG_TYPES
和FeatureSummary_DEFAULT_PKG_TYPE
全局属性来调整FeatureSummary
模块接受的包类型。FindOpenGL
模块在找到库时现在提供导入目标OpenGL::GL
和OpenGL::GLU
。UseSWIG
模块增加了swig_add_library
命令,为旧的swig_add_module
命令提供了更大的灵活性。UseSWIG
模块的swig_add_source_to_module
命令现在支持一个新的SWIG_OUTFILE_DIR
选项,用于控制输出文件位置(swig -o
)。WriteCompilerDetectionHeader
模块增加了ALLOW_UNKNOWN_COMPILERS
和ALLOW_UNKNOWN_COMPILER_VERSIONS
选项,允许创建对于未知或旧编译器也能工作的头文件,只需假定它们不支持任何请求的功能。
CTest¶
ctest_memcheck()
命令增加了DEFECT_COUNT <var>
选项,用于捕获检测到的内存缺陷数量。ctest_memcheck()
命令现在可以从CTEST_MEMORYCHECK_SUPPRESSIONS_FILE
变量读取 sanitizer 的抑制文件位置。ctest_memcheck()
命令现在支持独立于AddressSanitizer
的LeakSanitizer
。ctest_update()
命令的CDASH_UPLOAD
签名现在可以遵守RETRY_COUNT
、RETRY_DELAY
和QUIET
选项。
CPack¶
添加了
CPackIFWConfigureFile
模块,定义了一个新的cpack_ifw_configure_file()
命令,用于配置 QtIFW/SDK/Creator 风格的文件模板。CPackIFW
模块的cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令增加了DEFAULT
、VIRTUAL
、FORCED_INSTALLATION
、REQUIRES_ADMIN_RIGHTS
、DISPLAY_NAME
、UPDATE_TEXT
、DESCRIPTION
、RELEASE_DATE
、AUTO_DEPEND_ON
和TRANSLATIONS
选项,以实现更具体的配置。CPackIFW
模块的cpack_ifw_configure_component()
命令增加了DEPENDENCIES
作为DEPENDS
选项的别名。CPackIFW
模块的cpack_ifw_configure_component_group()
命令增加了新的DEPENDS
选项。还添加了DEPENDENCIES
别名。CPackIFW
模块的cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令的PRIORITY
选项现已弃用,将在 CMake 的未来版本中移除。请改用新的SORTING_PRIORITY
选项。CPack IFW Generator
增加了新的变量CPACK_IFW_PACKAGE_WATERMARK
、CPACK_IFW_PACKAGE_BANNER
、CPACK_IFW_PACKAGE_BACKGROUND
、CPACK_IFW_PACKAGE_WIZARD_STYLE
、CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH
、CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT
和CPACK_IFW_PACKAGE_TITLE_COLOR
,用于自定义 QtIFW 安装程序的样式。CPack productbuild Generator
增加了对包签名选项的支持。请参阅变量CPACK_PRODUCTBUILD_IDENTITY_NAME
、CPACK_PRODUCTBUILD_KEYCHAIN_PATH
、CPACK_PKGBUILD_IDENTITY_NAME
和CPACK_PKGBUILD_KEYCHAIN_PATH
。CPack RPM Generator
现在可以根据提供的rpmbuild
工具省略不支持的标签。如果设置了不支持的标签,它们将被忽略并打印开发警告。CPack RPM Generator
现在可以生成主组件包,强制为定义的组件生成 RPM,而文件名和包名中不带组件后缀。请参阅CPACK_RPM_MAIN_COMPONENT
变量。CPack RPM Generator
现在可以按需生成单个debuginfo
包,即使使用了组件打包。请参阅CPACK_RPM_DEBUGINFO_SINGLE_PACKAGE
变量。CPack RPM Generator
在使用CPACK_RPM_USER_FILELIST
变量时,支持每个文件有多个指令。
其他¶
CMake 使用加密哈希的功能现在支持 SHA-3 算法。
添加了一个新的生成器表达式
$<IF:cond,true-value,false-value>
。如果条件为1
,则解析为 true-value;如果条件为0
,则解析为 false-value。
已弃用和已删除的特性¶
FeatureSummary
模块的命令set_package_info()
、set_feature_info()
、print_enabled_features()
和print_disabled_features()
现已弃用。UseSWIG
模块的swig_add_module
命令已弃用,推荐使用swig_add_library
。
其他更改¶
如果在构建时
<LANG>_CLANG_TIDY
目标属性指定的命令返回非零值,现在将被视为错误,而不是被静默忽略。ctest_memcheck()
命令不再自动向AddressSanitizer
使用的选项中添加leak_check=1
。AddressSanitizer
的默认行为是运行LeakSanitizer
来检查泄漏,除非设置了leak_check=0
。ctest_memcheck()
命令已修复,可以正确地将从CTEST_MEMORYCHECK_SANITIZER_OPTIONS
变量读取的额外 sanitizer 选项追加到 sanitizer 内部使用的环境变量中。FeatureSummary
模块的set_package_properties()
命令在未显式设置类型时,不再强制将包类型设置为OPTIONAL
。Compile Features
功能现在支持 Intel C++ 编译器 12.1 至 17.0 版本在 UNIX 和 Windows 平台上的功能。对
FindPkgConfig
模块pkg_check_modules()
命令的成功调用之后的后续调用,现在可以重新评估给定前缀的缓存值,以响应该前缀的命令参数的变化。使用
AUTOMOC
或AUTOUIC
时,生成的moc_*
、*.moc
和ui_*
文件被放置在<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include
目录中,该目录会自动添加到目标的INCLUDE_DIRECTORIES
中。因此,不再需要在目标的INCLUDE_DIRECTORIES
中包含CMAKE_CURRENT_BINARY_DIR
。Sublime Text 2
生成器不再使用详细的构建输出启用原生构建命令(例如ninja
或make
)。try_compile()
命令的源文件签名现在会遵守生成的测试项目中CMAKE_WARN_DEPRECATED
变量的值。VS 2010 及以上版本的 Visual Studio 生成器 现在将每个源文件的标志放在目标级标志之后,当它们被归类为没有项目文件设置的原始标志时(
AdditionalOptions
)。这种行为与其他生成器产生的标志顺序更加一致,并允许更具体的属性(每个源)上的标志覆盖更通用的属性(每个目标)上的标志。在 cmake.org 上提供的预编译 Windows 二进制 MSI 包将在 Windows 注册表中
HKLM\Software\Kitware\CMake
键下记录安装目录,值为InstallDir
。