多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

CMake 策略 CMP0106 详解:Documentation 模块移除与 VTK 专用构建逻辑的迁移指南

CMake 策略 CMP0106 详解:Documentation 模块移除与 VTK 专用构建逻辑的迁移指南 构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载CMake 策略 CMP0106 于 CMake 3.18 引入宣布随 CMake 发行的Documentation模块被移除该模块原本是 CMake 为 VTK 项目提供的文档构建支持机制其缓存变量与依赖查找逻辑与 VTK 深度耦合。本文以 CMP0106.rst 为骨架结合当前仓库中该策略的注册代码、include()命令的模块拦截实现以及模块本体源码说明 OLD/NEW 两种行为的具体差异、策略的触发与警告路径并给出面向普通项目的迁移与设置方法帮助读者在升级 CMake 时正确处置include(Documentation)调用。策略背景一个为 VTK 量身定做的模块Documentation模块最初并非通用工具而是 CMake 为 VTK 项目提供文档构建支持而添加的机制其内容专门针对 VTK 的文档框架做了调优。按照 CMP0106.rst 的说明CMake 不再随自身发行这个带有过时 VTK 模式now old VTK patterns的模块而是由 CMake 自己将其标记为废弃。从仓库中 Modules/Documentation.cmake 的旧逻辑可以看到它的真实面貌当BUILD_DOCUMENTATION选项开启后模块会依次find_package()查找UnixCommands、Doxygen、Gnuplot、HTMLHelp、Perl、Wget等一系列与文档生成链条相关的工具并定义DOCUMENTATION_HTML_HELP、DOCUMENTATION_HTML_TARZ等缓存选项——这些依赖集合正是围绕 VTK 的文档流水线设计的对绝大多数普通项目毫无意义。OLD 与 NEW 行为对比策略的核心分歧在于include(Documentation)被调用时会发生什么行为效果OLD模块正常加载添加BUILD_DOCUMENTATION、DOCUMENTATION_HTML_HELP、DOCUMENTATION_HTML_TARZ等缓存变量并查找 VTK 文档所依赖的包Doxygen、Perl、Wget 等NEW模块被视为空模块不添加任何缓存变量不查找任何包include(Documentation)实际不产生任何副作用需要注意策略文档中NEW 行为是充当空模块的表述在实现层面体现为两层机制include()层面的拦截在 Source/cmIncludeCommand.cxx 中Documentation被登记在DeprecatedModules映射表内对应cmPolicies::CMP0106。当include(Documentation)解析到系统模块时同一文件若策略状态为NEW模块文件路径会被置空mfile 即模块根本不会被加载等价于空操作。模块本体层面的防护Modules/Documentation.cmake开头通过cmake_policy(GET CMP0106 ...)读取策略若为NEW会直接message(FATAL_ERROR)拒绝执行提示该逻辑应随使用它的项目一同分发而非由 CMake 提供。策略如何被触发警告与未设置状态CMP0106 在 Source/cmPolicies.h 中以WARN状态注册版本为 3.18SELECT(POLICY, CMP0106, The Documentation module is removed., 3, 18, 0, WARN)按照 STANDARD_ADVICE.rst 的通用规则该策略由cmake_policy或cmake_minimum_required设置若项目未显式设置CMake 会发出警告并采用 OLD 行为。在实际行为中include()命令在策略处于WARN状态时会调用IssuePolicyWarning见 Source/cmIncludeCommand.cxx。而Modules/Documentation.cmake内部对未设置状态还有一处VTK 特赦如果检测到项目自身就是 VTKCMAKE_PROJECT_NAME或PROJECT_NAME为VTK则抑制警告避免干扰 VTK 自身的构建对非 VTK 项目则照常告警Modules/Documentation.cmake。如何设置与迁移方式一通过cmake_minimum_required按版本启用策略机制的设计原则是按 CMake 版本批量设置而不是逐个开关。在顶层CMakeLists.txt开头使用cmake_minimum_required(VERSION 3.18)此时 CMake 会把 3.18 及之前引入的所有策略含 CMP0106设置为 NEW 行为。若要保留较低的最低版本、同时按策略上限启用新行为可写成cmake_minimum_required(VERSION 3.10...3.18)形式详见 cmake_minimum_required.rst 对min[...policy_max]语法的说明。方式二显式cmake_policy(SET)需要局部或逐个控制时使用if(POLICY CMP0106) cmake_policy(SET CMP0106 NEW) endif()相关命令的完整签名SET、GET、PUSH/POP见 cmake_policy.rst。注意cmake_policy作用于策略栈顶include()和find_package()加载的脚本默认拥有独立策略作用域除非显式指定NO_POLICY_SCOPE。方式三命令行缓存变量不改项目文件用户在不修改项目的前提下可在cmake命令行传入缓存变量压制警告cmake -DCMAKE_POLICY_DEFAULT_CMP0106NEW ...该做法与cmake -DCMAKE_POLICY_DEFAULT_CMP0990OLD的通用形式一致见 cmake-policies.7.rst 的Transition Schedule一节。迁移建议把 VTK 专用逻辑带回项目自身CMP0106 给出的方向非常明确文档构建这类与具体项目强相关的逻辑最好随使用它的项目一起分发而不是放在 CMake 里。对仍依赖旧行为的项目建议把Modules/Documentation.cmake中的相关逻辑BUILD_DOCUMENTATION选项、Doxygen/Perl/Wget 查找等复制到项目自己的模块目录通过CMAKE_MODULE_PATH引入并移除对include(Documentation)的依赖。OLD 行为的寿命废弃时间线正如 DEPRECATED.rst 所强调的策略的OLD行为按定义即已废弃可能在未来版本中被移除。通用时间线见 cmake-policies.7.rst策略引入 2 年后显式设置OLD的版本可能开始警告其将被移除策略引入 6 年后主版本号更高的 CMake 可能直接报错拒绝继续使用OLD行为。因此长期维护的项目不应停留在OLD/警告静默阶段而应尽早迁移到NEW行为或自维护文档模块。从当前仓库的 cmake-policies.7.rst 策略清单可见CMP0106 与 CMP0107、CMP0108 等一同列于CMake 3.18 引入的策略分组中同时该清单也展示了本仓库已演进至包含 CMake 4.x 时代策略的较新开发版本CMP0106 的 OLD 行为正在逐步走向淘汰边缘。常见问题速查为什么include(Documentation)现在会警告因为策略未设置时默认走 OLD 并告警设置NEW后模块不再加载。我是普通项目用不到 VTK 文档怎么处理直接让项目版本不低于 3.18cmake_minimum_required(VERSION 3.18)或显式cmake_policy(SET CMP0106 NEW)。我是 VTK 或基于 VTK 的文档项目怎么办若项目名恰为VTK可免于警告否则把模块逻辑搬入项目自身或临时设置OLD并规划迁移。NEW行为下模块还会报 FATAL_ERROR 吗通过include(Documentation)正常加载时模块在NEW下根本不会被执行被include()拦截为空仅当模块文件被其他方式直接执行且策略为NEW时其内部才会触发致命错误这是模块自带的二次防护。延伸阅读策略文档正文Help/policy/CMP0106.rst模块源码含 OLD 行为实现Modules/Documentation.cmake模块文档入口Help/module/Documentation.rst策略注册表SELECT(POLICY, CMP0106, ...)Source/cmPolicies.hinclude()对废弃模块的拦截实现Source/cmIncludeCommand.cxx策略机制总览与过渡时间线Help/manual/cmake-policies.7.rst策略设置命令Help/command/cmake_policy.rst、Help/command/cmake_minimum_required.rst赞分享构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载相关推荐CMake 的 Documentation 模块与 CMP0106 策略VTK 专属文档框架的废弃与迁移指南CMake 的 Documentation 模块与 CMP0106 策略VTK 专属文档框架的废弃与迁移指南 导读 本文围绕 CMake 仓库中已废弃的 Do构建工具开发工具CLICMake 策略 CMP0120 详解WriteCompilerDetectionHeader 模块的移除与迁移实践CMake 策略 CMP0120 详解WriteCompilerDetectionHeader 模块的移除与迁移实践 导读 本文围绕 CMake 3.20 引构建工具开发工具CLICMake 策略 CMP0196 解析CMakeDetermineVSServicePack 模块移除与迁移指南CMake 策略 CMP0196 解析CMakeDetermineVSServicePack 模块移除与迁移指南 CMP0196 是 CMake 4.1 引入构建工具开发工具CLI上一篇Awesome-CV技能评分可视化星级与进度条设计下一篇如何快速解决大模型下载速度慢多源镜像终极加速指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表