CMake 3.11 发行说明¶
自 CMake 3.10 以来,进行了以下更改。
新增功能¶
平台¶
Ninja
生成器现在受 TI C/C++ 编译器的支持。
生成器¶
CodeBlocks
额外生成器已学会检查CMAKE_CODEBLOCKS_COMPILER_ID
变量,以便获取要放置在项目文件中的自定义编译器标识值。Makefile 生成器 和
Ninja
生成器已学会为Fortran
语言添加编译器启动工具以及编译器(之前已支持C
、CXX
和CUDA
)。有关详细信息,请参阅CMAKE_<LANG>_COMPILER_LAUNCHER
变量和<LANG>_COMPILER_LAUNCHER
目标属性。Visual Studio 生成器 学会支持
COMPILE_LANGUAGE
生成器 表达式
在目标范围内的COMPILE_DEFINITIONS
、INCLUDE_DIRECTORIES
、COMPILE_OPTIONS
和file(GENERATE)
中。请参阅生成器表达式文档了解注意事项。Xcode
生成器学会支持COMPILE_LANGUAGE
生成器 表达式
在目标范围内的COMPILE_DEFINITIONS
和INCLUDE_DIRECTORIES
中。以前它只支持COMPILE_OPTIONS
和file(GENERATE)
。请参阅生成器表达式文档了解注意事项。
命令¶
add_library()
和add_executable()
命令现在可以在没有任何源代码的情况下调用,只要稍后通过target_sources()
命令添加源代码,就不会引起抱怨。命令
file(DOWNLOAD)
和file(UPLOAD)
新增NETRC
和NETRC_FILE
选项,用于指定使用.netrc
文件。命令
target_compile_definitions()
进一步学习如何对 导入目标 设置INTERFACE_COMPILE_DEFINITIONS
属性。命令
target_compile_features()
进一步学习如何对 导入目标 设置INTERFACE_COMPILE_FEATURES
属性。命令
target_compile_options()
进一步学习如何对 导入目标 设置INTERFACE_COMPILE_OPTIONS
属性。命令
target_include_directories()
进一步学习如何对 导入目标 设置INTERFACE_INCLUDE_DIRECTORIES
属性。命令
target_sources()
进一步学习如何对 导入目标 设置INTERFACE_SOURCES
属性。命令
target_link_libraries()
了解如何设置INTERFACE_LINK_LIBRARIES
对 已导入目标 的属性。
变量¶
如果有多个
CMAKE_GENERATOR_INSTANCE
变量,可以用于持有在多个生成器的对应本机工具中选定的实例。这由Visual Studio 15 2017
生成器使用,用于长期持有 Visual Studio 的选定实例。添加
CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
变量,用于启用在通过install()
和file(INSTALL)
安装文件期间隐式创建的目录的默认权限设置,例如,在make install
期间。添加
CMAKE_JOB_POOLS
变量,以指定用于JOB_POOLS
属性的值。这在使用 Ninja 生成器时,允许通过命令行配置参数控制构建并行性。添加
CMAKE_NETRC
和CMAKE_NETRC_FILE
变量,以指定file(DOWNLOAD)
和file(UPLOAD)
命令及ExternalProject
模块使用.netrc
文件。当创建目标时,已添加
CMAKE_CUDA_SEPARABLE_COMPILATION
变量以初始化CUDA_SEPARABLE_COMPILATION
目标属性。
属性¶
已了解
COMPILE_DEFINITIONS
源文件属性可支持生成器 表达式
。已添加
COMPILE_OPTIONS
源文件属性以管理要传给编译器的一系列选项。已添加
IMPORTED_GLOBAL
目标属性以指示 导入目标 是全局可见的。对于使用GLOBAL
选项通过add_library()
或add_executable()
而创建的目标,会自动将该属性设置为真值。此外,通过将此属性设置为TRUE
,现在项目代码可以将本地导入目标提升为全局可见。已添加
INCLUDE_DIRECTORIES
源文件属性以指定预处理器包含文件搜索目录系列。源文件属性
VS_SHADER_DISABLE_OPTIMIZATIONS
和VS_SHADER_ENABLE_DEBUG
已添加以指定Visual Studio 生成器 sources 的更多详细信息,其中包含。
模块¶
CheckIncludeFiles
模块CHECK_INCLUDE_FILES()
命令获得了一个LANGUAGE
选项,用于指定是使用C
还是CXX
编译器进行检查。CMakePackageConfigHelpers
模块write_basic_package_version_file()
命令了解COMPATIBILITY
参数的SameMinorVersion
新模式。ExternalProject
模块学会了在注释、命令、工作目录和副产品中替换<DOWNLOAD_DIR>
。ExternalProject
模块获得了NETRC
和NETRC_FILE
选项,用于指定使用.netrc
文件。添加了新的
FetchContent
模块,支持使用ExternalProject_Add()
支持的任何下载/更新方法在配置时填充内容。这允许在配置阶段立即使用内容,比如使用add_subdirectory()
等。良好的分级项目结构支持,允许父项目重写子项目的内容详细信息并确保在整个项目树中不会多次填充内容。FindBLAS
和FindLAPACK
模块学习支持FLAMEblis
和libflame
。FindDoxygen
模块的doxygen_add_docs()
函数现在支持一个新的DOXYGEN_VERBATIM_VARS
列表变量。包含在该列表中的任何DOXYGEN_...
变量都将绕过自动引用逻辑,在将它们传输到输出Doxyfile
时保持其内容不变。添加了
FindIconv
模块以找到iconv支持。GenerateExportHeader
模块GENERATE_EXPORT_HEADER
命令提供了一个INCLUDE_GUARD_NAME
选项,用于更改写入到生成的导出头部的包含保护符号的名称。此外,它现在会在生成的导出头部的包含保护上添加一个关闭#endif
后的注释。UseJava
模块add_jar
命令获得GENERATE_NATIVE_HEADERS
选项,用于使用javac -h
(对于javac
1.8 及以上版本)生成原生头文件。它取代create_javah
,后者不再适用于 JDK 1.10 及以上版本,由于 JEP 313 删除javah
工具。
Autogen¶
当使用
AUTOMOC
或AUTOUIC
时,CMake 现在会启动多个并行的moc
或uic
进程来减少构建时间。新的CMAKE_AUTOGEN_PARALLEL
变量和AUTOGEN_PARALLEL
目标属性可用于指定要启动的并行moc
或uic
进程数。默认值取决于主机上的 CPU 数量。
CTest¶
ctest_start()
命令不再设置CTEST_RUN_CURRENT_SCRIPT
,原因是如果在函数内调用此命令,会导致作用域问题。但是,它在 CTest 中设置内部变量。不过,在全局作用域将CTEST_RUN_CURRENT_SCRIPT
设置为 0 仍会阻止在结尾重新运行脚本。
CPack¶
cpack(1)
获得--trace
和--trace-expand
选项。CPack IFW Generator
增加了新的CPACK_IFW_PACKAGE_REMOVE_TARGET_DIR
变量,以控制在卸载时是否不删除目标目录。CPack RPM Generator
学会启用对程序和共享库强制执行权限。参见CPACK_RPM_INSTALL_WITH_EXEC
变量。增加了
CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
变量,它的目的与CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
变量在安装期间提供相同的服务(例如,make install),在打包期间(例如,make package)提供服务。
其他¶
别名目标 现在可以别名 导入目标,这些目标使用
GLOBAL
选项创建为add_library()
。接口库 现在可以设置它们上的自定义属性,前提是它们以下划线(
_
)或小写 ASCII 字符开头。最初的目的是只允许对INTERFACE
库有意义的属性,但它也阻止了使用自定义属性。cmake(1)
--open <dir>
命令行选项被添加进来,以打开生成的 IDE 项目,例如 Visual Studio 解决方法或 Xcode 项目。
已弃用和已删除的功能¶
为
CMP0037
至CMP0054
(CMP0036
以下的已被弃用)策略添加了明确的弃用诊断。cmake-policies(7)
手册解释说,所有策略的 OLD 行为已被弃用,项目应移植到 NEW 行为。KDevelop3
生成器已被删除。
其他更改¶
策略
CMP0037
不再保留与可选特性相关的目标名称,例如test
和package
,除非启用了相应特性。FindOpenGL
模块现在优先选择 GLVND 库(如果可用)。参见策略CMP0072
。CMAKE_OSX_DEPLOYMENT_TARGET
变量中设置的最低部署目标过去只适用于 macOS,而不管所选 SDK 如何。现在已针对CMAKE_OSX_SYSROOT
选定的目标平台正确设置。例如,如果 sysroot 变量指定 iOS SDK,则CMAKE_OSX_DEPLOYMENT_TARGET
中的值将被解释为 iOS 最低版本。Xcode
生成器每次project()
命令生成一个项目文件的行为现在可以用CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY
变量来控制。这可能有助于加快大型项目的 CMake 生成步骤,并解决ZERO_CHECK
逻辑中的错误。由于
CMakeCache.txt
格式不支持值中的换行符,因此包含换行符的值现已在写入文件前被截断。此外,警告注释会写入缓存文件,并且警告消息会显示给控制台上的用户。
更新¶
自 CMake 3.11.0 起所做的更改包括以下内容。
3.11.1¶
CheckIncludeFile
模块check_include_file
宏、CheckIncludeFileCXX
模块check_include_file_cxx
宏,以及CheckIncludeFiles
模块check_include_files
宏在 CMake 3.11.0 中已学习尊重CMAKE_REQUIRED_LIBRARIES
变量。由于现有的项目的检查行为已发生改变,因此已对此进行了复原。它未来可能会通过兼容性策略进行恢复。
3.11.2¶
调用
add_library()
以创建不可全局查看的导入目标的别名现会再次引发错误,就像在 3.11.0 之前一样。诊断在从 CMake 3.11.0 和 3.11.1 中允许全局可见导入目标使用别名这一更改中被意外删除。FindQt4
模块qt4_wrap_cpp
、qt4_wrap_ui
和qt4_add_resources
宏现可在其生成的文件上设定SKIP_AUTOMOC
和SKIP_AUTOUIC
。这些文件永远不需要由 moc 或 uic 来处理,我们必须明确表示这一点来满足策略CMP0071
。
3.11.3¶
CMake 3.11.0 引入了在通常在 UNIX 上进行此操作的代码路径中解析 Windows 上符号链接的支持。此举已因
subst
驱动器故障而恢复。