CMake 3.16 发行说明¶
自 CMake 3.15 以来所做的更改包括以下内容。
新功能¶
语言¶
CMake 学会支持 Objective C (
OBJC
) 和 Objective C++ (OBJCXX
) 语言。它们可以通过project()
和enable_language()
命令启用。当启用OBJC
或OBJCXX
时,分别具有.m
或.mm
源文件将作为 Objective C 或 C++ 进行编译。否则,它们将像以前一样被视为普通 C++ 源文件。
编译器¶
现在
Solaris
上支持Clang
编译器。
平台¶
在 AIX 上,使用
ENABLE_EXPORTS
目标属性的可执行文件现在除了可执行文件之外,还生成具有.imp
扩展名的链接程序导入文件。插件(通过add_library()
创建,并使用MODULE
选项)使用target_link_libraries()
链接可执行文件以获取其符号,现在使用导入文件进行链接。install(TARGETS)
命令现在以ARCHIVE
工件的形式安装导入文件。在 AIX 上,默认不再启用运行时链接。CMake 为链接器提供了足够的信息来预先解决所有符号。可以通过向其链接标记中添加
-Wl,-G
来手动启用共享库和/或可加载模块的运行时链接(例如在CMAKE_SHARED_LINKER_FLAGS
或CMAKE_MODULE_LINKER_FLAGS
变量中)。可以通过向其链接标记中添加-Wl,-brtl
来手动启用可执行文件的运行时链接(例如在CMAKE_EXE_LINKER_FLAGS
变量中)。
命令行¶
命令¶
add_test()
命令学习了COMMAND_EXPAND_LISTS
选项,该选项使COMMAND
参数中的列表得以扩展,包括生成器表达式创建的列表。file()
命令学习了一个新的子命令GET_RUNTIME_DEPENDENCIES
,该命令允许您递归获取可执行文件或库链接的库列表。此子命令旨在替代GetPrerequisites
。以下变量已能够控制组搜索位置的默认行为:
find_file()
、find_library()
、find_path()
、find_package()
和find_program()
命令CMAKE_FIND_USE_PACKAGE_ROOT_PATH
- 控制搜索<PackageName>_ROOT
变量的默认行为。CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH
- 控制搜索 CMake 特定环境变量的默认行为。CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH
- 控制搜索标准系统环境变量的默认行为。CMAKE_FIND_USE_CMAKE_PATH
- 控制搜索 CMake 特定缓存变量的默认行为。CMAKE_FIND_USE_CMAKE_SYSTEM_PATH
- 控制搜索平台特定 CMake 变量的默认行为。
find_package()
命令学会了检查CMAKE_FIND_USE_PACKAGE_REGISTRY
变量以控制在 CMake 用户软件包注册表中搜索的默认行为,以及检查CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY
变量以控制在 CMake 系统软件包注册表中搜索的默认行为。message()
命令学会了缩进控制,并引入了新的CMAKE_MESSAGE_INDENT
变量。添加了
target_precompile_headers()
命令,用于指定一组标题以进行预编译,以实现更快的编译速度。
变量¶
引入
CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS
变量,可以选择初始化CUDA_RESOLVE_DEVICE_SYMBOLS
目标属性。添加了
CMAKE_ECLIPSE_RESOURCE_ENCODING
变量,用于指定Eclipse CDT4
附加生成器的资源编码。添加了
CMAKE_UNITY_BUILD
变量,用于初始化UNITY_BUILD
目标属性,以告诉生成器批量包含源文件,从而实现更快的编译速度。
属性¶
现在,
BUILD_RPATH
和INSTALL_RPATH
目标属性支持生成器 表达式
。已添加
INSTALL_REMOVE_ENVIRONMENT_RPATH
目标属性,以删除目标中编译器定义的RPATH
条目。该属性由CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH
变量初始化。已添加
PRECOMPILE_HEADERS
目标属性,以指定在编译过程中需要预编译的包含头列表。使用target_precompile_headers()
命令来设置它。已添加
UNITY_BUILD
目标属性,以告知生成器将源文件打包在一起,以便加快编译速度。现在,
VS_CONFIGURATION_TYPE
目标属性支持生成器 表达式
。已添加
VS_DPI_AWARE
目标属性,以告知 Visual Studio 生成器 在.vcxproj
文件中设置EnableDpiAwareness
属性。添加
XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING
目标属性以告知Xcode
生成器设置Allow debugging when using document Versions Browser
模式选项的值。
模块¶
FindDoxygen
模块doxygen_add_docs()
命令获得一个新的USE_STAMP_FILE
选项。当存在此选项时,此命令创建的自定义目标仅在自最后一次成功运行以来任何源文件发生改变时才重新运行 Doxygen。FindGnuTLS
模块现在提供导入的目标。FindPackageHandleStandardArgs
模块find_package_handle_standard_args()
命令获得一个新的REASON_FAILURE_MESSAGE
选项,以指定提供故障原因的信息。FindPkgConfig
模块pkg_search_module()
宏现在定义一个<prefix>_MODULE_NAME
结果变量,其中包含第一个匹配的模块名称。FindPython3
和FindPython
模块获得选项来控制将搜索哪些ABI
。FindPython3
、FindPython2
和FindPython
模块现在支持通过缓存项直接指定工件。
Autogen¶
使用
AUTOMOC
时,新的CMAKE_AUTOMOC_PATH_PREFIX
变量或AUTOMOC_PATH_PREFIX
目标属性可被启用为-p
生成moc
的路径前缀选项。这可确保moc
输出文件在不同的构建设置中是相同的(给定由moc
编译的头文件位于include directory
)。它还可确保当源目录和/或构建目录为符号链接时,moc
输出文件可正确编译。
CTest¶
添加了新测试属性
SKIP_REGULAR_EXPRESSION
。该属性类似于FAIL_REGULAR_EXPRESSION
和PASS_REGULAR_EXPRESSION
,但具有与SKIP_RETURN_CODE
相同的含义。这在例如用户无法控制测试的返回代码的情况下很有用。例如,在 Catch2 中,返回值是断言失败的数量,因此无法将其用于SKIP_RETURN_CODE
。
CPack¶
cpack(1)
增加了对-C
选项的多个配置的支持。CPack DEB Generator
现在能够根据 Debian 策略手册 来格式化通用文本(通常用作多个 CPack 生成器的描述)。请参见CPACK_PACKAGE_DESCRIPTION_FILE
和CPACK_DEBIAN_<COMPONENT>_DESCRIPTION
变量。CPack Archive Generator
增加了生成.tar.zst
包(采用 Zstandard 压缩)。
已弃用和已删除的功能¶
为策略
CMP0067
添加了明确的弃用诊断信息(CMP0066
及以下版本已经弃用)。cmake-policies(7)
手册解释说,所有策略的旧行为都已弃用,并且项目应移植到新行为。CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
变量已弃用。使用CMAKE_FIND_USE_PACKAGE_REGISTRY
变量代替。GetPrerequisites
模块已弃用,因为它已被file(GET_RUNTIME_DEPENDENCIES)
取代。CPACK_INSTALL_SCRIPT
变量已弃用,取而代之的是新的、命名更准确的CPACK_INSTALL_SCRIPTS
变量。
其他更改¶
cmake(1)
-C <initial-cache>
选项现在使用CMAKE_SOURCE_DIR
和将CMAKE_BINARY_DIR
设置为顶级源和构建树的方式来评估初始缓存脚本。cmake(1)
-E remove_directory
命令行工具现在在给定指向目录的符号链接的路径时,只会删除符号链接。它不再删除链接目录的内容。ctest(1)
--build-makeprogram
命令行选项现在指定使用Ninja
生成器或 Makefile Generators 来配置项目时使用的 make 程序。模块
ExternalProject
的ExternalProject_Add()
命令已更新,使得GIT_SUBMODULES ""
不初始化子模块了。请参阅策略CMP0097
。模块
FindGTest
已更新,以识别 GTest 1.8.1 生成的 MSVC 构建树。Qt 压缩帮助文件现名为
CMake.qch
,其文件名不再包含发行版本。在原址升级 CMake 时,此文件的文件名和位置将保持不变。现在,诸如 IDE、帮助查看器等工具应该能够在固定的位置引用该文件,此位置在更新 CMake 之后仍然有效。为安装而生成的 CMake 脚本中
RPATH
已正确地进行了转义。请参阅策略CMP0095
。在 Windows 上使用
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
时,只有在提供符号的对象文件更新之后才会更新自动生成的导出。
更新¶
自 CMake 3.16.0 以来所做的更改包括以下内容。
3.16.2¶
CMake 3.16.0 和 3.16.1 使用
AUTOMOC
处理.hh
文件。这是对 CMake 3.15 及以下版本的行为更改,它可能会破坏现有的项目,因此已在 3.16.2 中恢复。
3.16.5¶
FindPython
,FindPython2
和FindPython3
模块不再为Python{,2,3}_LIBRARY_RELEASE
和Python{,2,3}_LIBRARY_DEBUG
创建缓存条目。这些值始终会从其他结果计算出来,所以不应被缓存。3.16.0 至 3.16.4 版本的 CMake 创建了这些条目,但它们总是FORCE
设置且用户无法对其进行有意义的编辑。此外,这些模块不再公开其内部
_Python*
缓存条目。由于误操作,CMake 3.16.0 至 3.16.4 版本将它们作为高级缓存条目显示。
3.16.7¶
如果未设置
OBJC
或OBJCXX
环境变量,选择 Objective C 或 C++ 编译器时将考虑CC
或CXX
环境变量。FindPkgConfig
模块现在将以-isystem
为前缀的包含目录提取到*_INCLUDE_DIRS
变量和INTERFACE_INCLUDE_DIRECTORIES
目标属性中。此前,它们将置于*_CFLAGS_OTHER
变量和INTERFACE_COMPILE_OPTIONS
目标属性中。
3.16.9¶
CMAKE_AUTOMOC_PATH_PREFIX
的默认值已更改为OFF
,因为此功能会破坏在不同包含目录中有相同名称的头文件的现有项目。这恢复了与 CMake 3.15 及更低版本的兼容性。