CMake 3.11 发行说明¶
自 CMake 3.10 以来所做的更改包括以下内容。
新功能¶
平台¶
Ninja 生成器现在支持 TI C/C++ 编译器。
生成器¶
CodeBlocks额外的生成器学会了检查CMAKE_CODEBLOCKS_COMPILER_ID变量以获取自定义编译器标识值以放置在项目文件中。Makefile 生成器 和
Ninja生成器学会了添加编译器启动器工具以及用于Fortran语言(C、CXX和 之前支持 CUDA)。有关详细信息,请参阅 :variable:`CMAKE_<LANG>_COMPILER_LAUNCHER 变量和<LANG>_COMPILER_LAUNCHER目标属性。Visual Studio 生成器 学会了在目标范围内支持``COMPILE_LANGUAGE``
generator expressionCOMPILE_DEFINITIONS,INCLUDE_DIRECTORIES `、 :prop_tgt:`COMPILE_OPTIONS和file(GENERATE)。有关注意事项,请参阅生成器表达式文档。Xcode生成器学会了在目标范围内支持COMPILE_LANGUAGEgenerator expressionCOMPILE_DEFINITIONS和INCLUDE_DIRECTORIES `。它以前只支持 :prop_tgt:`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)使用.netrc文件命令和ExternalProject模块。添加了
CMAKE_CUDA_SEPARABLE_COMPILATION变量以在创建目标时初始化目标上的CUDA_SEPARABLE_COMPILATION目标属性。
特性¶
COMPILE_DEFINITIONS源文件属性学会了支持generator expressions。添加了
COMPILE_OPTIONS源文件属性来管理要传递给编译器的选项列表。添加了
IMPORTED_GLOBAL目标属性以指示 IMPORTED 目标 是否全局可见。对于使用GLOBAL选项为add_library()或add_executable()创建的目标,它会自动设置为真值。此外,项目代码现在可以通过将此属性设置为“TRUE”来*提升*本地导入目标为全局可见。添加了
INCLUDE_DIRECTORIES源文件属性以指定预处理器包含文件搜索目录的列表。添加了源文件属性
VS_SHADER_DISABLE_OPTIMIZATIONS和VS_SHADER_ENABLE_DEBUG以使用 Visual Studio Generators 指定 `.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 上的结束#endif之后添加注释。UseJava模块``add_jar`` 命令获得了``GENERATE_NATIVE_HEADERS`` 选项,可以使用``javac -h`` 为``javac`` 1.8 或更高版本生成本机头文件。这取代了create_javah,由于 JEP 313 删除了javah工具,它不再适用于 JDK 1.10 及更高版本。
自动生成器¶
C测试¶
ctest_start()命令不再设置CTEST_RUN_CURRENT_SCRIPT,因为如果从函数内部调用它,则会出现范围问题。相反,它在 CTest 中设置了一个内部变量。但是,在全局范围内将 CTEST_RUN_CURRENT_SCRIPT 设置为 0 仍然会阻止脚本在最后重新运行。
包装¶
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)。
其他¶
弃用和删除的功能¶
为策略“CMP0037”到“CMP0054”添加了明确的弃用诊断(“CMP0036”及以下已弃用)。
cmake-policies(7)手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。KDevelop3生成器已被删除。
其他变化¶
策略:policy:CMP0037 不再保留与可选功能相关的目标名称,例如
test和package,除非启用了相应的功能。FindOpenGL模块现在更喜欢 GLVND 库(如果可用)。请参阅政策:policy: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”驱动器损坏,这已被恢复。