
Linux 内核文档贡献指南从修复构建警告到构建高质量的文档体系【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本文以 Linux 内核源码树中的 Documentation/doc-guide/contributing.rst 为骨架面向希望参与内核文档维护的开发者系统讲解内核文档维护者documentation maintainer眼中最迫切需要完成的任务清单消除文档构建警告、收录被遗忘的 kerneldoc 注释、修正错别字、清理过时文档、推进文档成书体系化、改进样式与构建工具链等。读完本文你将掌握这些任务的具体操作路径与验证工具如make refcheckdocs、tools/docs/find-unused-docs.sh、scripts/get_maintainer.pl并能在源码树中直接定位对应实现迈出内核社区贡献的第一步。为什么内核文档需要更多贡献者文档是任何软件开发项目的重要组成部分优质文档能吸引新开发者加入帮助资深开发者更高效地工作缺少高质量的文档大量时间会被浪费在逆向代码和重蹈覆辙上。然而内核文档目前远未达到支撑这一体量与重要性项目应有的水准。好消息是内核文档改进工作对贡献者的技能水平要求门槛很低它恰好是学习内核开发流程、融入社区的相对轻松入口。本文的正文主体正是内核文档维护者列出的最迫切需要完成的任务清单The documentation TODO list。这份清单远未穷尽所有工作——如果你看到其他改进文档的方式也请不要犹豫直接去做。任务一消除文档构建警告最高优先级文档构建当前会输出数量惊人的警告。当警告多到一定程度效果等同于没有警告人们会无视它们也就永远不会注意到自己的改动新增了警告。因此消除警告是文档 TODO 清单中优先级最高的任务。为什么文档警告几乎总是真问题C 代码编译器产生的警告经常可以被当作误报而忽略于是出现了一类只为堵住编译器嘴的补丁。但文档构建产生的警告几乎总是指向真实的问题——让警告消失的正确方式是理解问题并在源头修复它。因此修复文档警告的补丁提交说明changelog的标题不应写成 fix a warning而应写明真正修复的问题是什么。另一个关键点文档警告常常源于 C 代码中 kerneldoc 注释的格式问题。虽然文档维护者乐于收到这些修复的副本但这类修复通常不应走文档树而应提交给相应子系统subsystem的维护者。实战案例修复 devfreq.c 中的两条警告文档维护者在一次文档构建中随手抓到两条警告./drivers/devfreq/devfreq.c:1818: warning: bad line: - Resource-managed devfreq_register_notifier() ./drivers/devfreq/devfreq.c:1854: warning: bad line: - Resource-managed devfreq_unregister_notifier()原文档中为便于阅读对行做了拆分。查看源码后发现问题出在 kerneldoc 注释中某一行缺少了*号导致构建系统简陋的注释块识别逻辑被搞混/** * devm_devfreq_register_notifier() - Resource-managed devfreq_register_notifier() * dev: The devfreq user device. (parent of devfreq) * devfreq: The devfreq object. * nb: The notifier block to be unregistered. * list: DEVFREQ_TRANSITION_NOTIFIER. */这个缺陷自 2016 年注释被添加时就存在整整潜伏了四年。修复方法仅仅是补上缺失的星号。通过查看该文件的提交历史确定规范的 subject 格式再用scripts/get_maintainer.pl将补丁涉及的路径作为参数传入确认收件人最终补丁长这样[PATCH] PM / devfreq: Fix two malformed kerneldoc comments Two kerneldoc comments in devfreq.c fail to adhere to the required format, resulting in these doc-build warnings: ./drivers/devfreq/devfreq.c:1818: warning: bad line: - Resource-managed devfreq_register_notifier() ./drivers/devfreq/devfreq.c:1854: warning: bad line: - Resource-managed devfreq_unregister_notifier() Add a couple of missing asterisks and make kerneldoc a little happier. Signed-off-by: Jonathan Corbet corbetlwn.net --- drivers/devfreq/devfreq.c | 4 -- 1 file changed, 2 insertions(), 2 deletions(-) diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 57f6944d65a6..00c9b80b3d33 100644 --- a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c -1814,7 1814,7 static void devm_devfreq_notifier_release(struct device *dev, void *res) /** * devm_devfreq_register_notifier() - - Resource-managed devfreq_register_notifier() * - Resource-managed devfreq_register_notifier() * dev: The devfreq user device. (parent of devfreq) * devfreq: The devfreq object. * nb: The notifier block to be unregistered. -1850,7 1850,7 EXPORT_SYMBOL(devm_devfreq_register_notifier); /** * devm_devfreq_unregister_notifier() - - Resource-managed devfreq_unregister_notifier() * - Resource-managed devfreq_unregister_notifier() * dev: The devfreq user device. (parent of devfreq) * devfreq: The devfreq object. * nb: The notifier block to be unregistered. -- 2.24.1整个过程只花了几分钟。当然随后发现别人在另一棵树上已经修好了同一问题这又引出一个重要教训动手之前先检查 linux-next确认问题是否已被修复。在本仓库中drivers/devfreq/devfreq.c 的这两个 kerneldoc 注释已经采用了规范格式*前缀 参数表可以作为修复后的对照样本。工具支撑make refcheckdocs 与自动检查除了常规文档构建的警告还可以运行make refcheckdocs来查找对不存在文档文件的引用。该目标定义在 Documentation/Makefile 中实际执行tools/docs/documentation-file-ref-check一个全树范围内扫描 Documentation 下文件引用、并向 stderr 报告不存在文件的 Perl 脚本位于 tools/docs/documentation-file-ref-check。此外Documentation/Makefile 显示当开启CONFIG_WARN_MISSING_DOCUMENTSy时每次文档构建都会自动执行documentation-file-ref-check --warn开启CONFIG_WARN_ABI_ERRORSy时则会用get_abi.py校验 ABI 文档。需要注意的是某些修复会耗时更长尤其是结构体成员或函数参数缺少文档的情况——这时需要弄清这些成员/参数的角色并正确描述。整体上这类任务偶尔会显得枯燥但极其重要如果真能消除文档构建的所有警告就能开始要求开发者避免新增警告。任务二收录被遗忘的 kerneldoc 注释内核鼓励开发者为代码编写 kerneldoc 注释但许多注释从未被拉入文档构建。这使信息更难被发现也让 Sphinx 无法为这些文档生成链接。在文档中加入kernel-doc指令把这些注释引入构建能让社区充分获取创建它们所投入工作的价值。可以使用 tools/docs/find-unused-docs.sh 找出这些被忽略的注释。该脚本的用法是在内核源码树顶层执行tools/docs/find-unused-docs.sh 目录例如tools/docs/find-unused-docs.sh drivers/scsi。其工作原理是先收集所有.rst文件中.. kernel-doc指令引用的文件列表再遍历目标目录下的每个.c文件用tools/docs/kernel-doc -export检查其中是否有导出的exported函数的 kerneldoc 注释未被收录并打印出这类文件参见 tools/docs/find-unused-docs.sh 的脚本实现。注意价值取舍收益最大的是把导出函数与数据结构的文档拉入构建。许多子系统也有仅供内部使用的 kerneldoc 注释除非把它们放进专门面向该子系统开发者的文档中否则不应拉入文档构建。任务三修正错别字与格式错误修正文档中的拼写或格式错误是学会如何创建并发送补丁的快捷途径也是一项有价值的服务。文档维护者乐意接受这类补丁。不过修完几处之后请考虑转向更进阶的任务把一些错别字留给下一位初学者去处理。请注意有些东西并不是错别字不应去修正内核文档中英美两种拼写均被允许无需将一种替换为另一种句号后跟一个空格还是两个空格不在内核文档语境下争论的范围内其他合理的分歧点如 Oxford comma同样不是这里该讨论的话题。和任何项目的任何补丁一样请先思考你的改动是否真的让事情变得更好。任务四更新或移除古老文档部分内核文档是时新、受维护且有价值的另一部分则不然。陈旧、失修、不准确的文档会误导读者并让读者对整个文档体系产生怀疑。任何能解决这类问题的努力都备受欢迎。每当你处理一份文档时请评估它是否仍然时新、是否需要更新、或者是否应整体删除。可以留意的警示信号包括引用 2.x 内核的内容指向 SourceForge 仓库的链接提交历史中多年只有错别字修复讨论 pre-Git 工作流的文字。最好的做法当然是让文档回到时新状态补充所需信息——这通常需要熟悉相关子系统的开发者配合。只要礼貌地请教并认真听取、落实他们的回答开发者往往非常乐意合作。有些文档则彻底没救了——例如引用了早已从内核删除的代码。虽然删除过时文档会遇到出人意料的阻力但我们应该照做多余的垃圾对任何人都没有帮助。如果文档虽严重过时但仍含一些有用信息、而你又无力更新最好的做法是在开头添加警告。推荐使用以下文本.. warning :: This document is outdated and in need of attention. Please use this information with caution, and please consider sending patches to update it.这样至少能让长期受苦的读者提前知道这份文档可能会把他们带偏。任务五推进文档连贯性——把零散文件编成书老一辈开发者会记得 1990 年代货架上的 Linux 书籍——它们不过是网上各处搜罗的文档文件的合集。书籍本身此后大多有所改进但内核文档至今仍基本沿用这一模式数千个文件几乎每个都与其他文件孤立写成。我们拥有的不是一个连贯的内核文档整体而是成千上万份独立文档。社区一直试图通过创建一组面向特定读者的书books来改善现状包括Documentation/admin-guide/index.rst管理员指南Documentation/core-api/index.rst内核核心 APIDocumentation/driver-api/index.rst驱动开发者 APIDocumentation/userspace-api/index.rst用户空间 API此外还有关于文档本身的书——即本文所在的 Documentation/doc-guide/index.rst其 toctree 收录了 sphinx、kernel-doc、parse-headers、contributing、maintainer-profile、checktransupdate 等文档。把文档移入合适的书是一项重要且需要持续进行的工作但伴随两大挑战移动文件会给正在使用这些文件的人带来短期阵痛他们对此缺乏热情通常一次的说服尚可但不应反复挪动文档。即使所有文档都各归其位我们也不过是把一个大堆变成了几个小堆。把所有这些文档编织成一个整体的工作尚未真正开始——如果你有这方面的好点子社区非常乐意倾听。任务六样式表改进与 PDF 构建路线改进 Sphinx 样式表采用 Sphinx 之后HTML 输出比过去美观许多但仍大有改进空间——Knuth 和 Tufte 看了会摇头。这需要调整样式表产出在排版、可访问性和可读性上更出色的输出。警告接手这项任务你就进入了经典的自行车棚bikeshed争论区——即便相对显而易见的改动也会引来大量意见和讨论。这就是我们身处的世界。摆脱 LaTeX 的非 LaTeX PDF 构建这是一个需要大量时间和 Python 技能、绝非轻而易举的任务。Sphinx 工具链相对小而封闭容易装进开发系统但构建 PDF 或 EPUB 输出需要安装 LaTeX——它一点都不小、也不封闭。能消灭这个依赖是件好事。最初社区曾希望用 rst2pdf 工具生成 PDF但它未能胜任不过近期 rst2pdf 的开发似乎重新活跃起来这是希望的信号。如果有动力足够的开发者与该项目合作让 rst2pdf 能用于内核文档构建全世界都会感激不尽。就本仓库而言常规构建入口集中在 Documentation/Makefilehtmldocs、pdfdocs、epubdocs、mandocs等目标以及SPHINXDIRS、DOCS_THEME、DOCS_CSS、PAPER等构建变量顶层 Makefile 的 dochelp 目标 也列出了linkcheckdocs dochelp refcheckdocs texinfodocs infodocs mandocs等文档相关目标可供对照。任务七撰写更多文档自然内核有大量区域被严重地欠文档化。如果你具备为某个内核子系统撰写文档的知识和意愿请不要犹豫动笔并把成果贡献给内核——无数内核开发者和用户都会感谢你。参与文档贡献的完整路径小结综合上述任务清单一条从零开始的贡献路径大致是建立文档构建环境安装 Sphinx详见 Documentation/doc-guide/sphinx.rst运行make htmldocs观察基线警告从小处入手从修正错别字或修复一条具体的 kerneldoc 警告开始通过 scripts/get_maintainer.pl用法perl scripts/get_maintainer.pl -f file或直接传补丁路径确定收件人遵守提交说明规范标题说明真正修复的问题而非 fix warning先查重再动手动手前检查 linux-next 是否已有人修复同一问题用工具验证make refcheckdocs检查失效引用tools/docs/find-unused-docs.sh 找出未被收录的导出函数 kerneldoc 注释逐步进阶从简单修复过渡到结构体成员/函数参数补文档、文档归档入书、甚至样式与构建工具链改进。文档贡献是理解内核开发流程成本最低的路径之一也是社区永远稀缺的宝贵劳动力——每消除一条警告、每收录一段 kerneldoc、每更新一份过时文档都是在为整个内核生态降低未来每一个人的检索与理解成本。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考