CMake 3.11 发布说明¶
自 CMake 3.10 以来进行的更改包括以下内容。
新功能¶
平台¶
TI C/C++ 编译器现在受
Ninja生成器的支持。
生成器¶
CodeBlocks附加生成器学会了检查CMAKE_CODEBLOCKS_COMPILER_ID变量以获取自定义编译器标识值,并将其放入项目文件中。Makefile 生成器 和
Ninja生成器学会了为Fortran语言添加编译器启动器工具以及编译器(之前支持C、CXX和CUDA)。有关详细信息,请参阅CMAKE_<LANG>_COMPILER_LAUNCHER变量和<LANG>_COMPILER_LAUNCHER目标属性。Visual Studio 生成器 学会了在目标范围的
COMPILE_DEFINITIONS、INCLUDE_DIRECTORIES、COMPILE_OPTIONS和file(GENERATE)中支持COMPILE_LANGUAGE生成表达式。有关注意事项,请参阅生成表达式文档。Xcode生成器学会了在目标范围的COMPILE_DEFINITIONS和INCLUDE_DIRECTORIES中支持COMPILE_LANGUAGE生成表达式。它以前只支持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。此外,项目代码现在可以通过将此属性设置为TRUE来将本地导入的目标提升为全局可见。添加了
INCLUDE_DIRECTORIES源文件属性,用于指定预处理器包含文件搜索目录的列表。为 Visual Studio 生成器 添加了
VS_SHADER_DISABLE_OPTIMIZATIONS和VS_SHADER_ENABLE_DEBUG源文件属性,以指定.hlsl源文件的更多详细信息。
模块¶
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为javac1.8 或更高版本生成原生头文件。这取代了create_javah,因为javah工具已从 JDK 1.10 及更高版本中移除(JEP 313)。
自动生成¶
在使用
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变量,该变量在打包(例如make package)期间的作用与CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS变量在安装(例如make install)期间的作用相同。
其他¶
别名目标 现在可以别名使用
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驱动器上的中断,此功能已被撤销。