CMake 3.8 发行说明¶
自 CMake 3.7 以来做出的更改包括以下内容。
新特性¶
语言¶
C#¶
CMake 学会了支持
CSharp
(C#) 作为可以通过project()
和enable_language()
命令启用的头等语言。它目前受针对 VS 2010 及以上版本的 Visual Studio 生成器 支持。可以使用
add_library()
和add_executable()
命令添加 C# 程序集和程序,就像添加常见的 C++ 目标一样。同一源树中的 C# 目标之间的引用可由target_link_libraries()
指定,就像用于 C++ 一样。对系统或第三方程序集的引用可由目标属性VS_DOTNET_REFERENCE_<refname>
和VS_DOTNET_REFERENCES
指定。可以使用目标和源文件属性对 C# 目标进行更精细的微调。具体来说,与 Visual Studio 相关的目标属性(
VS_*
)值得一看(用于设置工具集版本、根命名空间、程序集图标等)。
CUDA¶
CMake 学会支持
CUDA
作为一门可通过project()
和enable_language()
命令启用的高级语言。CUDA
目前受 Makefile 发生器 和Ninja
发生器在 Linux、macOS 和 Windows 系统上的支持。对 Visual Studio IDE 的支持正在开发中,但未包括在此版本中。支持 NVIDIA CUDA Toolkit 编译器 (
nvcc
)。
C & C++¶
编译 功能
功能现在提供元功能,为特定语言标准级别(例如,cxx_std_11
)请求编译器模式。请参阅CMAKE_C_KNOWN_FEATURES
和CMAKE_CXX_KNOWN_FEATURES
。编译 功能
功能现在了解 C++ 17。除了cxx_std_17
元功能外,尚未列出任何特定功能。编译 功能
功能现在了解 C99 在 gcc 自版本 3.4 以来就可用。
平台¶
已添加
Fuchsia
的新的最小平台文件。
生成器¶
CodeBlocks
额外的生成器现在可用于生成NMake Makefiles JOM
。VS 2013 及更高版本的 Visual Studio 生成器 学会了支持
CMAKE_GENERATOR_TOOLSET
值中的host=x64
选项(例如,通过cmake(1)
-T
选项),从而请求在 64 位主机上使用 VS 64 位工具链。传给
target_link_libraries()
并且名称以.targets
结尾的文件的 Visual Studio 生成器 学会将这些文件视为要导入到生成项目文件中的 MSBuild “目标”。
命令¶
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
额外生成器将生成的项目更改为以目标为中心的方式进行组织。然后build
、rebuild
和clean
操作在CodeLite
中对选定的目标(而非整个工作区)进行处理。(请注意,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
变量,用于告诉Visual Studio Generators(适用于 VS 2010 及更高版本)将PACKAGE
目标包括在默认构建中,类似于用于INSTALL
目标的现有CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
变量。
属性¶
添加
BUILD_RPATH
目标属性和相应的CMAKE_BUILD_RPATH
变量,用于支持自定义RPATH
位置以添加至构建树中的二进制文件。添加
COMPILE_FLAGS
源文件属性学习支持生成器 表达式
。FRAMEWORK
目标属性现在也可应用于 Apple 目标上的静态库。它将产生一个框架,但内部有一个静态库。导入 接口库学习了新的
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
源文件属性,以告知 Visual Studio 生成器(适用于 VS 2010 及更高版本),文件是否应该复制到输出目录。添加了
VS_DEBUGGER_WORKING_DIRECTORY
目标属性,以告知 Visual Studio 生成器(适用于 VS 2010 及更高版本),为该目标设置哪个调试器工作目录。添加了
VS_DOTNET_REFERENCES_COPY_LOCAL
目标属性,以指定是否将引用的程序集复制到输出目录。添加了
VS_DOTNET_REFERENCE_<refname>
目标属性,以告知 Visual Studio 生成器(适用于 VS 2010 及更高版本),添加带有给定提示路径的 .NET 引用。添加了
VS_INCLUDE_IN_VSIX
源文件属性,以告知 Visual Studio 生成器(适用于 VS 2010 及更高版本),是否将该文件包含在 Visual Studio 扩展包中。添加了
VS_RESOURCE_GENERATOR
源文件属性,以向 Visual Studio 生成器(适用于 VS 2010 及更高版本)提供资源生成器的设置(仅限C#
)。添加了
VS_USER_PROPS
目标属性,以告诉 Visual Studio 生成器,对于 VS 2010 及更高版本,应使用自定义的 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 窗体、WPF/XAML 或其他技术。使用不同的哈希,例如支持一个数据文件多个内容链接,
ExternalData
模块了解img.png.sha256
和img.png.sha1
。这让对象能够从按不同哈希算法编制的索引对象中提取出来。获得了
ExternalProject
模块GIT_PROGRESS
选项,以强制 Git 在克隆存储库时显示进度。ExternalProject
模块获得了一个GIT_CONFIG
选项,以在克隆存储库时向 Git 传递--config
选项。现在,
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
变量读取 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
。除非leak_check=0
,否则AddressSanitizer
的默认行为是运行 LeakSanitizer 进行泄漏检查。为正确追加从
CTEST_MEMORYCHECK_SANITIZER_OPTIONS
变量读取的附加整理程序选项,已修复ctest_memcheck()
命令,使该选项能够内部被整理程序使用,并内嵌到环境变量中。现在,
FeatureSummary
模块不再将包类型强制为OPTIONAL
,这是在没有明确设置类型时执行的set_package_properties()
命令。编译 功能
功能现在了解 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
的变量值。Visual Studio 生成器 用于 VS 2010 及更高版本,在将这些生成器归类为无项目文件设置的原始标记时(
AdditionalOptions
),它们会将每个源文件的标记放置在目标范围的标记之后。此行为与其他生成器生成的标记顺序保持一致,并且允许特定属性(每个源文件)上的标记覆盖更通用的属性(每个目标)。现在,
cmake.org
上提供的预编译 Windows 二进制 MSI 包会在键HKLM\Software\Kitware\CMake
中的 Windows 注册表下记录安装目录,其值命名为InstallDir
.