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_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。此外,项目代码现在可以通过将此属性设置为TRUE
来将本地导入的目标提升为全局可见。添加了
INCLUDE_DIRECTORIES
源文件属性,用于指定预处理器头文件搜索目录列表。为
.hlsl
源文件添加了VS_SHADER_DISABLE_OPTIMIZATIONS
和VS_SHADER_ENABLE_DEBUG
源文件属性,以便为 Visual Studio 生成器 指定更多.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
模块已学会支持 FLAME 的blis
和libflame
。FindDoxygen
模块的doxygen_add_docs()
命令现在支持一个新的DOXYGEN_VERBATIM_VARS
列表变量。该列表中的任何DOXYGEN_...
变量都将绕过自动引用逻辑,在将其传输到输出Doxyfile
时保持其内容不变。添加了
FindIconv
模块来定位 iconv 支持。GenerateExportHeader
模块的generate_export_header
命令新增了INCLUDE_GUARD_NAME
选项,用于更改生成导出头文件时写入的包含保护符号的名称。此外,它现在会在生成导出头文件的包含保护的末尾添加一个注释。UseJava
模块的add_jar
命令新增了GENERATE_NATIVE_HEADERS
选项,用于使用javac -h
(适用于 1.8 及以上版本)生成本机头文件。这取代了create_javah
,因为 JEP 313 移除了javah
工具,该工具不再适用于 JDK 1.10 及以上版本。
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
变量,该变量在打包期间(例如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¶
在 CMake 3.11.0 中,
CheckIncludeFile
模块的check_include_file()
命令、CheckIncludeFileCXX
模块的check_include_file_cxx()
命令以及CheckIncludeFiles
模块的check_include_files()
命令被告知要遵守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
驱动器上的破坏,此功能已被撤销。