1kernel-doc nano-HOWTO 2===================== 3 4How to format kernel-doc comments 5--------------------------------- 6 7In order to provide embedded, 'C' friendly, easy to maintain, 8but consistent and extractable documentation of the functions and 9data structures in the Linux kernel, the Linux kernel has adopted 10a consistent style for documenting functions and their parameters, 11and structures and their members. 12 13The format for this documentation is called the kernel-doc format. 14It is documented in this Documentation/kernel-doc-nano-HOWTO.txt file. 15 16This style embeds the documentation within the source files, using 17a few simple conventions. The scripts/kernel-doc perl script, some 18SGML templates in Documentation/DocBook, and other tools understand 19these conventions, and are used to extract this embedded documentation 20into various documents. 21 22In order to provide good documentation of kernel functions and data 23structures, please use the following conventions to format your 24kernel-doc comments in Linux kernel source. 25 26We definitely need kernel-doc formatted documentation for functions 27that are exported to loadable modules using EXPORT_SYMBOL. 28 29We also look to provide kernel-doc formatted documentation for 30functions externally visible to other kernel files (not marked 31"static"). 32 33We also recommend providing kernel-doc formatted documentation 34for private (file "static") routines, for consistency of kernel 35source code layout. But this is lower priority and at the 36discretion of the MAINTAINER of that kernel source file. 37 38Data structures visible in kernel include files should also be 39documented using kernel-doc formatted comments. 40 41The opening comment mark "/**" is reserved for kernel-doc comments. 42Only comments so marked will be considered by the kernel-doc scripts, 43and any comment so marked must be in kernel-doc format. Do not use 44"/**" to be begin a comment block unless the comment block contains 45kernel-doc formatted comments. The closing comment marker for 46kernel-doc comments can be either "*/" or "**/". 47 48Kernel-doc comments should be placed just before the function 49or data structure being described. 50 51Example kernel-doc function comment: 52 53/** 54 * foobar() - short function description of foobar 55 * @arg1: Describe the first argument to foobar. 56 * @arg2: Describe the second argument to foobar. 57 * One can provide multiple line descriptions 58 * for arguments. 59 * 60 * A longer description, with more discussion of the function foobar() 61 * that might be useful to those using or modifying it. Begins with 62 * empty comment line, and may include additional embedded empty 63 * comment lines. 64 * 65 * The longer description can have multiple paragraphs. 66 **/ 67 68The first line, with the short description, must be on a single line. 69 70The @argument descriptions must begin on the very next line following 71this opening short function description line, with no intervening 72empty comment lines. 73 74Example kernel-doc data structure comment. 75 76/** 77 * struct blah - the basic blah structure 78 * @mem1: describe the first member of struct blah 79 * @mem2: describe the second member of struct blah, 80 * perhaps with more lines and words. 81 * 82 * Longer description of this structure. 83 **/ 84 85The kernel-doc function comments describe each parameter to the 86function, in order, with the @name lines. 87 88The kernel-doc data structure comments describe each structure member 89in the data structure, with the @name lines. 90 91The longer description formatting is "reflowed", losing your line 92breaks. So presenting carefully formatted lists within these 93descriptions won't work so well; derived documentation will lose 94the formatting. 95 96See the section below "How to add extractable documentation to your 97source files" for more details and notes on how to format kernel-doc 98comments. 99 100Components of the kernel-doc system 101----------------------------------- 102 103Many places in the source tree have extractable documentation in the 104form of block comments above functions. The components of this system 105are: 106 107- scripts/kernel-doc 108 109 This is a perl script that hunts for the block comments and can mark 110 them up directly into DocBook, man, text, and HTML. (No, not 111 texinfo.) 112 113- Documentation/DocBook/*.tmpl 114 115 These are SGML template files, which are normal SGML files with 116 special place-holders for where the extracted documentation should 117 go. 118 119- scripts/basic/docproc.c 120 121 This is a program for converting SGML template files into SGML 122 files. When a file is referenced it is searched for symbols 123 exported (EXPORT_SYMBOL), to be able to distinguish between internal 124 and external functions. 125 It invokes kernel-doc, giving it the list of functions that 126 are to be documented. 127 Additionally it is used to scan the SGML template files to locate 128 all the files referenced herein. This is used to generate dependency 129 information as used by make. 130 131- Makefile 132 133 The targets 'sgmldocs', 'psdocs', 'pdfdocs', and 'htmldocs' are used 134 to build DocBook files, PostScript files, PDF files, and html files 135 in Documentation/DocBook. 136 137- Documentation/DocBook/Makefile 138 139 This is where C files are associated with SGML templates. 140 141 142How to extract the documentation 143-------------------------------- 144 145If you just want to read the ready-made books on the various 146subsystems (see Documentation/DocBook/*.tmpl), just type 'make 147psdocs', or 'make pdfdocs', or 'make htmldocs', depending on your 148preference. If you would rather read a different format, you can type 149'make sgmldocs' and then use DocBook tools to convert 150Documentation/DocBook/*.sgml to a format of your choice (for example, 151'db2html ...' if 'make htmldocs' was not defined). 152 153If you want to see man pages instead, you can do this: 154 155$ cd linux 156$ scripts/kernel-doc -man $(find -name '*.c') | split-man.pl /tmp/man 157$ scripts/kernel-doc -man $(find -name '*.h') | split-man.pl /tmp/man 158 159Here is split-man.pl: 160 161--> 162#!/usr/bin/perl 163 164if ($#ARGV < 0) { 165 die "where do I put the results?\n"; 166} 167 168mkdir $ARGV[0],0777; 169$state = 0; 170while (<STDIN>) { 171 if (/^\.TH \"[^\"]*\" 9 \"([^\"]*)\"/) { 172 if ($state == 1) { close OUT } 173 $state = 1; 174 $fn = "$ARGV[0]/$1.9"; 175 print STDERR "Creating $fn\n"; 176 open OUT, ">$fn" or die "can't open $fn: $!\n"; 177 print OUT $_; 178 } elsif ($state != 0) { 179 print OUT $_; 180 } 181} 182 183close OUT; 184<-- 185 186If you just want to view the documentation for one function in one 187file, you can do this: 188 189$ scripts/kernel-doc -man -function fn file | nroff -man | less 190 191or this: 192 193$ scripts/kernel-doc -text -function fn file 194 195 196How to add extractable documentation to your source files 197--------------------------------------------------------- 198 199The format of the block comment is like this: 200 201/** 202 * function_name(:)? (- short description)? 203(* @parameterx(space)*: (description of parameter x)?)* 204(* a blank line)? 205 * (Description:)? (Description of function)? 206 * (section header: (section description)? )* 207(*)?*/ 208 209The short function description ***cannot be multiline***, but the other 210descriptions can be (and they can contain blank lines). If you continue 211that initial short description onto a second line, that second line will 212appear further down at the beginning of the description section, which is 213almost certainly not what you had in mind. 214 215Avoid putting a spurious blank line after the function name, or else the 216description will be repeated! 217 218All descriptive text is further processed, scanning for the following special 219patterns, which are highlighted appropriately. 220 221'funcname()' - function 222'$ENVVAR' - environment variable 223'&struct_name' - name of a structure (up to two words including 'struct') 224'@parameter' - name of a parameter 225'%CONST' - name of a constant. 226 227NOTE 1: The multi-line descriptive text you provide does *not* recognize 228line breaks, so if you try to format some text nicely, as in: 229 230 Return codes 231 0 - cool 232 1 - invalid arg 233 2 - out of memory 234 235this will all run together and produce: 236 237 Return codes 0 - cool 1 - invalid arg 2 - out of memory 238 239NOTE 2: If the descriptive text you provide has lines that begin with 240some phrase followed by a colon, each of those phrases will be taken as 241a new section heading, which means you should similarly try to avoid text 242like: 243 244 Return codes: 245 0: cool 246 1: invalid arg 247 2: out of memory 248 249every line of which would start a new section. Again, probably not 250what you were after. 251 252Take a look around the source tree for examples. 253 254 255kernel-doc for structs, unions, enums, and typedefs 256--------------------------------------------------- 257 258Beside functions you can also write documentation for structs, unions, 259enums and typedefs. Instead of the function name you must write the name 260of the declaration; the struct/union/enum/typedef must always precede 261the name. Nesting of declarations is not supported. 262Use the argument mechanism to document members or constants. 263 264Inside a struct description, you can use the "private:" and "public:" 265comment tags. Structure fields that are inside a "private:" area 266are not listed in the generated output documentation. 267 268Example: 269 270/** 271 * struct my_struct - short description 272 * @a: first member 273 * @b: second member 274 * 275 * Longer description 276 */ 277struct my_struct { 278 int a; 279 int b; 280/* private: */ 281 int c; 282}; 283 284 285How to make new SGML template files 286----------------------------------- 287 288SGML template files (*.tmpl) are like normal SGML files, except that 289they can contain escape sequences where extracted documentation should 290be inserted. 291 292!E<filename> is replaced by the documentation, in <filename>, for 293functions that are exported using EXPORT_SYMBOL: the function list is 294collected from files listed in Documentation/DocBook/Makefile. 295 296!I<filename> is replaced by the documentation for functions that are 297_not_ exported using EXPORT_SYMBOL. 298 299!D<filename> is used to name additional files to search for functions 300exported using EXPORT_SYMBOL. 301 302!F<filename> <function [functions...]> is replaced by the 303documentation, in <filename>, for the functions listed. 304 305 306Tim. 307*/ <twaugh@redhat.com> 308

