CMake 3.8 发布说明¶
自 CMake 3.7 以来的变更包括以下内容。
新特性¶
语言¶
C#¶
CMake 学会了支持
CSharp
(C#) 作为第一类语言,可以通过project()
和enable_language()
命令启用。目前 Visual Studio 生成器 对 VS 2010 及以上版本提供了支持。C# 程序集和程序可以像通用的 C++ 目标一样添加,使用
add_library()
和add_executable()
命令。同一源代码树中 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 工具包编译器 (
nvcc
)。
C & C++¶
编译特性
功能现在提供元特性,用于请求特定语言标准级别的编译器模式(例如cxx_std_11
)。请参阅CMAKE_C_KNOWN_FEATURES
和CMAKE_CXX_KNOWN_FEATURES
。编译特性
功能现在可以识别 C++ 17。除了cxx_std_17
元特性之外,尚未列举其他特定特性。编译特性
功能现在可以识别 gcc 从 3.4 版本开始提供的 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
对目标的清理操作包括其依赖项。)添加了
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
目标,类似于现有的用于INSTALL
目标的CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
变量。
属性¶
添加了
BUILD_RPATH
目标属性和相应的CMAKE_BUILD_RPATH
变量,以支持要添加到构建树中二进制文件的自定义RPATH
位置。COMPILE_FLAGS
源文件属性学会了支持生成器表达式
。FRAMEWORK
目标属性现在也可以应用于 Apple 目标上的静态库。它将生成一个适当的 Framework,但内部包含一个静态库。导入的 接口库 学会了新的
IMPORTED_LIBNAME
和IMPORTED_LIBNAME_<CONFIG>
目标属性,用于指定链接库名称,因为接口库不构建自己的库文件。引入了
<LANG>_CPPLINT
目标属性和支持它的CMAKE_<LANG>_CPPLINT
变量,以告知 Makefile 生成器 和Ninja
生成器在编译C
和CXX
语言时 साथ साथ 运行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
模块接受的包类型,通过更改FeatureSummary_PKG_TYPES
,FeatureSummary_REQUIRED_PKG_TYPES
和FeatureSummary_DEFAULT_PKG_TYPE
全局属性进行调整。现在,
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
变量中读取 sanitizers 的抑制文件位置。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()
命令不再自动将leak_check=1
添加到AddressSanitizer
使用的选项中。AddressSanitizer
的默认行为是运行LeakSanitizer
来检查泄漏,除非leak_check=0
。ctest_memcheck()
命令已修复,可以正确地将从CTEST_MEMORYCHECK_SANITIZER_OPTIONS
变量读取的额外 sanitizer 选项附加到 sanitizers 内部使用的环境变量中。FeatureSummary
模块的set_package_properties()
命令在未显式设置类型时,不再强制将包类型设置为OPTIONAL
。编译特性
功能现在可以识别 UNIX 和 Windows 平台上 Intel C++ 编译器 12.1 到 17.0 版本支持的特性。在成功调用之后,对
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
。