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_DEFINITIONS
、INCLUDE_DIRECTORIES
、COMPILE_OPTIONS
和file(GENERATE)
中支持COMPILE_LANGUAGE
generator expression
。 有关注意事项,请参阅生成器表达式文档。Xcode
生成器学会了在目标范围的COMPILE_DEFINITIONS
和INCLUDE_DIRECTORIES
中支持COMPILE_LANGUAGE
generator expression
。 它以前仅支持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
源文件属性学会了支持generator expressions
。添加了
COMPILE_OPTIONS
源文件属性,用于管理传递给编译器的选项列表。添加了
IMPORTED_GLOBAL
目标属性,用于指示 导入目标 是否全局可见。 对于使用GLOBAL
选项通过add_library()
或add_executable()
创建的目标,该属性会自动设置为真值。 此外,项目代码现在可以通过将此属性设置为TRUE
来提升本地导入目标以使其全局可见。添加了
INCLUDE_DIRECTORIES
源文件属性,用于指定预处理器包含文件搜索目录列表。添加了源文件属性
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
模块学会了支持 FLAMEblis
和libflame
。FindDoxygen
模块doxygen_add_docs()
函数现在支持新的DOXYGEN_VERBATIM_VARS
列表变量。 包含在该列表中的任何DOXYGEN_...
变量都将绕过自动引用逻辑,在将其传输到输出Doxyfile
时保持其内容不变。添加了
FindIconv
模块,用于定位 iconv 支持。GenerateExportHeader
模块generate_export_header
命令获得了INCLUDE_GUARD_NAME
选项,用于更改写入生成的导出头文件的 include guard 符号的名称。 此外,它现在在生成的导出头文件的 include guard 的结尾#endif
上添加注释。UseJava
模块add_jar
命令获得了GENERATE_NATIVE_HEADERS
选项,用于为 1.8 或更高版本的javac
使用javac -h
生成原生头文件。 这取代了create_javah
,由于 JEP 313 移除了javah
工具,create_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 生成器
获得了新的CPACK_IFW_PACKAGE_REMOVE_TARGET_DIR
变量,用于控制在卸载时是否不应删除目标目录。CPack RPM 生成器
学会了启用对程序和共享库强制执行执行权限。 请参阅CPACK_RPM_INSTALL_WITH_EXEC
变量。添加了
CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
变量,它在打包期间(例如make package
)起着与CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
变量在安装期间(例如make install
)相同的作用。
其他¶
别名目标 现在可以别名使用
add_library()
的GLOBAL
选项创建的 导入目标。接口库 现在可以在其上设置自定义属性,如果它们以下划线 (
_
) 或小写 ASCII 字符开头。 最初的意图是仅允许对INTERFACE
库有意义的属性,但它也阻止了自定义属性的使用。添加了
cmake(1)
--open <dir>
命令行选项,以打开生成的 IDE 项目,如 Visual Studio 解决方案或 Xcode 项目。
已弃用和移除的特性¶
为策略
CMP0037
至CMP0054
添加了显式弃用诊断信息(CMP0036
及以下版本已弃用)。cmake-policies(7)
手册解释说,所有策略的旧行为都已被弃用,项目应移植到新行为。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 引入了对 Windows 上代码路径中解析符号链接的支持,这些代码路径通常在 UNIX 上执行此操作。由于
subst
驱动器上的崩溃,此更改已被还原。