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
的链接器导入文件。使用target_link_libraries()
将可执行文件链接到其符号的插件(通过add_library()
使用MODULE
选项创建)现在使用导入文件进行链接。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
模块增加了控制搜索哪些ABIs
的选项。模块
FindPython3
、FindPython2
和FindPython
模块现在支持通过缓存条目直接指定构件。
Autogen¶
在使用
AUTOMOC
时,新的变量CMAKE_AUTOMOC_PATH_PREFIX
或目标属性AUTOMOC_PATH_PREFIX
可被启用以生成moc
的-p
路径前缀选项。这确保了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 Policy Manual 格式化通用文本(通常用作多个 CPack 生成器的描述)。请参阅CPACK_PACKAGE_DESCRIPTION_FILE
和CPACK_DEBIAN_<COMPONENT>_DESCRIPTION
变量。CPack Archive Generator
现在能够生成带有 Zstandard 压缩的.tar.zst
包。
已弃用和已移除的功能¶
为策略
CMP0067
(CMP0066
及以下已弃用) 添加了明确的弃用诊断。cmake-policies(7)
手册解释说,所有策略的 OLD 行为都已被弃用,项目应迁移到 NEW 行为。变量
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 生成器 配置项目时使用的 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
创建缓存条目。这些值总是从其他结果计算得出,因此不应缓存。这些条目由 CMake 3.16.0 到 3.16.4 创建,但它们总是FORCE
设置的,用户无法对其进行有意义的编辑。此外,这些模块不再公开其内部
_Python*
缓存条目。CMake 3.16.0 到 3.16.4 意外地将其显示为高级缓存条目。
3.16.7¶
Objective C 或 C++ 编译器的选择现在会考虑
CC
或CXX
环境变量,如果OBJC
或OBJCXX
环境变量未设置。模块
FindPkgConfig
现在会将以-isystem
为前缀的包含目录提取到*_INCLUDE_DIRS
变量和INTERFACE_INCLUDE_DIRECTORIES
目标属性中。以前它们会被放入*_CFLAGS_OTHER
变量和INTERFACE_COMPILE_OPTIONS
目标属性中。
3.16.9¶
CMAKE_AUTOMOC_PATH_PREFIX
的默认值已更改为OFF
,因为此功能可能会破坏具有不同包含目录中同名头文件的现有项目。这恢复了与 CMake 3.15 及更低版本的兼容性。