123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552 |
- .. title:: Kernel-doc comments
- ===========================
- Writing kernel-doc comments
- ===========================
- The Linux kernel source files may contain structured documentation
- comments in the kernel-doc format to describe the functions, types
- and design of the code. It is easier to keep documentation up-to-date
- when it is embedded in source files.
- .. note:: The kernel-doc format is deceptively similar to javadoc,
- gtk-doc or Doxygen, yet distinctively different, for historical
- reasons. The kernel source contains tens of thousands of kernel-doc
- comments. Please stick to the style described here.
- .. note:: kernel-doc does not cover Rust code: please see
- Documentation/rust/general-information.rst instead.
- The kernel-doc structure is extracted from the comments, and proper
- `Sphinx C Domain`_ function and type descriptions with anchors are
- generated from them. The descriptions are filtered for special kernel-doc
- highlights and cross-references. See below for details.
- .. _Sphinx C Domain: http://www.sphinx-doc.org/en/stable/domains.html
- Every function that is exported to loadable modules using
- ``EXPORT_SYMBOL`` or ``EXPORT_SYMBOL_GPL`` should have a kernel-doc
- comment. Functions and data structures in header files which are intended
- to be used by modules should also have kernel-doc comments.
- It is good practice to also provide kernel-doc formatted documentation
- for functions externally visible to other kernel files (not marked
- ``static``). We also recommend providing kernel-doc formatted
- documentation for private (file ``static``) routines, for consistency of
- kernel source code layout. This is lower priority and at the discretion
- of the maintainer of that kernel source file.
- How to format kernel-doc comments
- ---------------------------------
- The opening comment mark ``/**`` is used for kernel-doc comments. The
- ``kernel-doc`` tool will extract comments marked this way. The rest of
- the comment is formatted like a normal multi-line comment with a column
- of asterisks on the left side, closing with ``*/`` on a line by itself.
- The function and type kernel-doc comments should be placed just before
- the function or type being described in order to maximise the chance
- that somebody changing the code will also change the documentation. The
- overview kernel-doc comments may be placed anywhere at the top indentation
- level.
- Running the ``kernel-doc`` tool with increased verbosity and without actual
- output generation may be used to verify proper formatting of the
- documentation comments. For example::
- scripts/kernel-doc -v -none drivers/foo/bar.c
- The documentation format is verified by the kernel build when it is
- requested to perform extra gcc checks::
- make W=n
- Function documentation
- ----------------------
- The general format of a function and function-like macro kernel-doc comment is::
- /**
- * function_name() - Brief description of function.
- * @arg1: Describe the first argument.
- * @arg2: Describe the second argument.
- * One can provide multiple line descriptions
- * for arguments.
- *
- * A longer description, with more discussion of the function function_name()
- * that might be useful to those using or modifying it. Begins with an
- * empty comment line, and may include additional embedded empty
- * comment lines.
- *
- * The longer description may have multiple paragraphs.
- *
- * Context: Describes whether the function can sleep, what locks it takes,
- * releases, or expects to be held. It can extend over multiple
- * lines.
- * Return: Describe the return value of function_name.
- *
- * The return value description can also have multiple paragraphs, and should
- * be placed at the end of the comment block.
- */
- The brief description following the function name may span multiple lines, and
- ends with an argument description, a blank comment line, or the end of the
- comment block.
- Function parameters
- ~~~~~~~~~~~~~~~~~~~
- Each function argument should be described in order, immediately following
- the short function description. Do not leave a blank line between the
- function description and the arguments, nor between the arguments.
- Each ``@argument:`` description may span multiple lines.
- .. note::
- If the ``@argument`` description has multiple lines, the continuation
- of the description should start at the same column as the previous line::
- * @argument: some long description
- * that continues on next lines
- or::
- * @argument:
- * some long description
- * that continues on next lines
- If a function has a variable number of arguments, its description should
- be written in kernel-doc notation as::
- * @...: description
- Function context
- ~~~~~~~~~~~~~~~~
- The context in which a function can be called should be described in a
- section named ``Context``. This should include whether the function
- sleeps or can be called from interrupt context, as well as what locks
- it takes, releases and expects to be held by its caller.
- Examples::
- * Context: Any context.
- * Context: Any context. Takes and releases the RCU lock.
- * Context: Any context. Expects <lock> to be held by caller.
- * Context: Process context. May sleep if @gfp flags permit.
- * Context: Process context. Takes and releases <mutex>.
- * Context: Softirq or process context. Takes and releases <lock>, BH-safe.
- * Context: Interrupt context.
- Return values
- ~~~~~~~~~~~~~
- The return value, if any, should be described in a dedicated section
- named ``Return``.
- .. note::
- #) The multi-line descriptive text you provide does *not* recognize
- line breaks, so if you try to format some text nicely, as in::
- * Return:
- * 0 - OK
- * -EINVAL - invalid argument
- * -ENOMEM - out of memory
- this will all run together and produce::
- Return: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory
- So, in order to produce the desired line breaks, you need to use a
- ReST list, e. g.::
- * Return:
- * * 0 - OK to runtime suspend the device
- * * -EBUSY - Device should not be runtime suspended
- #) If the descriptive text you provide has lines that begin with
- some phrase followed by a colon, each of those phrases will be taken
- as a new section heading, which probably won't produce the desired
- effect.
- Structure, union, and enumeration documentation
- -----------------------------------------------
- The general format of a struct, union, and enum kernel-doc comment is::
- /**
- * struct struct_name - Brief description.
- * @member1: Description of member1.
- * @member2: Description of member2.
- * One can provide multiple line descriptions
- * for members.
- *
- * Description of the structure.
- */
- You can replace the ``struct`` in the above example with ``union`` or
- ``enum`` to describe unions or enums. ``member`` is used to mean struct
- and union member names as well as enumerations in an enum.
- The brief description following the structure name may span multiple
- lines, and ends with a member description, a blank comment line, or the
- end of the comment block.
- Members
- ~~~~~~~
- Members of structs, unions and enums should be documented the same way
- as function parameters; they immediately succeed the short description
- and may be multi-line.
- Inside a struct or union description, you can use the ``private:`` and
- ``public:`` comment tags. Structure fields that are inside a ``private:``
- area are not listed in the generated output documentation.
- The ``private:`` and ``public:`` tags must begin immediately following a
- ``/*`` comment marker. They may optionally include comments between the
- ``:`` and the ending ``*/`` marker.
- Example::
- /**
- * struct my_struct - short description
- * @a: first member
- * @b: second member
- * @d: fourth member
- *
- * Longer description
- */
- struct my_struct {
- int a;
- int b;
- /* private: internal use only */
- int c;
- /* public: the next one is public */
- int d;
- };
- Nested structs/unions
- ~~~~~~~~~~~~~~~~~~~~~
- It is possible to document nested structs and unions, like::
- /**
- * struct nested_foobar - a struct with nested unions and structs
- * @memb1: first member of anonymous union/anonymous struct
- * @memb2: second member of anonymous union/anonymous struct
- * @memb3: third member of anonymous union/anonymous struct
- * @memb4: fourth member of anonymous union/anonymous struct
- * @bar: non-anonymous union
- * @bar.st1: struct st1 inside @bar
- * @bar.st2: struct st2 inside @bar
- * @bar.st1.memb1: first member of struct st1 on union bar
- * @bar.st1.memb2: second member of struct st1 on union bar
- * @bar.st2.memb1: first member of struct st2 on union bar
- * @bar.st2.memb2: second member of struct st2 on union bar
- */
- struct nested_foobar {
- /* Anonymous union/struct*/
- union {
- struct {
- int memb1;
- int memb2;
- };
- struct {
- void *memb3;
- int memb4;
- };
- };
- union {
- struct {
- int memb1;
- int memb2;
- } st1;
- struct {
- void *memb1;
- int memb2;
- } st2;
- } bar;
- };
- .. note::
- #) When documenting nested structs or unions, if the struct/union ``foo``
- is named, the member ``bar`` inside it should be documented as
- ``@foo.bar:``
- #) When the nested struct/union is anonymous, the member ``bar`` in it
- should be documented as ``@bar:``
- In-line member documentation comments
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The structure members may also be documented in-line within the definition.
- There are two styles, single-line comments where both the opening ``/**`` and
- closing ``*/`` are on the same line, and multi-line comments where they are each
- on a line of their own, like all other kernel-doc comments::
- /**
- * struct foo - Brief description.
- * @foo: The Foo member.
- */
- struct foo {
- int foo;
- /**
- * @bar: The Bar member.
- */
- int bar;
- /**
- * @baz: The Baz member.
- *
- * Here, the member description may contain several paragraphs.
- */
- int baz;
- union {
- /** @foobar: Single line description. */
- int foobar;
- };
- /** @bar2: Description for struct @bar2 inside @foo */
- struct {
- /**
- * @bar2.barbar: Description for @barbar inside @foo.bar2
- */
- int barbar;
- } bar2;
- };
- Typedef documentation
- ---------------------
- The general format of a typedef kernel-doc comment is::
- /**
- * typedef type_name - Brief description.
- *
- * Description of the type.
- */
- Typedefs with function prototypes can also be documented::
- /**
- * typedef type_name - Brief description.
- * @arg1: description of arg1
- * @arg2: description of arg2
- *
- * Description of the type.
- *
- * Context: Locking context.
- * Return: Meaning of the return value.
- */
- typedef void (*type_name)(struct v4l2_ctrl *arg1, void *arg2);
- Highlights and cross-references
- -------------------------------
- The following special patterns are recognized in the kernel-doc comment
- descriptive text and converted to proper reStructuredText markup and `Sphinx C
- Domain`_ references.
- .. attention:: The below are **only** recognized within kernel-doc comments,
- **not** within normal reStructuredText documents.
- ``funcname()``
- Function reference.
- ``@parameter``
- Name of a function parameter. (No cross-referencing, just formatting.)
- ``%CONST``
- Name of a constant. (No cross-referencing, just formatting.)
- ````literal````
- A literal block that should be handled as-is. The output will use a
- ``monospaced font``.
- Useful if you need to use special characters that would otherwise have some
- meaning either by kernel-doc script or by reStructuredText.
- This is particularly useful if you need to use things like ``%ph`` inside
- a function description.
- ``$ENVVAR``
- Name of an environment variable. (No cross-referencing, just formatting.)
- ``&struct name``
- Structure reference.
- ``&enum name``
- Enum reference.
- ``&typedef name``
- Typedef reference.
- ``&struct_name->member`` or ``&struct_name.member``
- Structure or union member reference. The cross-reference will be to the struct
- or union definition, not the member directly.
- ``&name``
- A generic type reference. Prefer using the full reference described above
- instead. This is mostly for legacy comments.
- Cross-referencing from reStructuredText
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- No additional syntax is needed to cross-reference the functions and types
- defined in the kernel-doc comments from reStructuredText documents.
- Just end function names with ``()`` and write ``struct``, ``union``, ``enum``
- or ``typedef`` before types.
- For example::
- See foo().
- See struct foo.
- See union bar.
- See enum baz.
- See typedef meh.
- However, if you want custom text in the cross-reference link, that can be done
- through the following syntax::
- See :c:func:`my custom link text for function foo <foo>`.
- See :c:type:`my custom link text for struct bar <bar>`.
- For further details, please refer to the `Sphinx C Domain`_ documentation.
- Overview documentation comments
- -------------------------------
- To facilitate having source code and comments close together, you can include
- kernel-doc documentation blocks that are free-form comments instead of being
- kernel-doc for functions, structures, unions, enums, or typedefs. This could be
- used for something like a theory of operation for a driver or library code, for
- example.
- This is done by using a ``DOC:`` section keyword with a section title.
- The general format of an overview or high-level documentation comment is::
- /**
- * DOC: Theory of Operation
- *
- * The whizbang foobar is a dilly of a gizmo. It can do whatever you
- * want it to do, at any time. It reads your mind. Here's how it works.
- *
- * foo bar splat
- *
- * The only drawback to this gizmo is that is can sometimes damage
- * hardware, software, or its subject(s).
- */
- The title following ``DOC:`` acts as a heading within the source file, but also
- as an identifier for extracting the documentation comment. Thus, the title must
- be unique within the file.
- =============================
- Including kernel-doc comments
- =============================
- The documentation comments may be included in any of the reStructuredText
- documents using a dedicated kernel-doc Sphinx directive extension.
- The kernel-doc directive is of the format::
- .. kernel-doc:: source
- :option:
- The *source* is the path to a source file, relative to the kernel source
- tree. The following directive options are supported:
- export: *[source-pattern ...]*
- Include documentation for all functions in *source* that have been exported
- using ``EXPORT_SYMBOL`` or ``EXPORT_SYMBOL_GPL`` either in *source* or in any
- of the files specified by *source-pattern*.
- The *source-pattern* is useful when the kernel-doc comments have been placed
- in header files, while ``EXPORT_SYMBOL`` and ``EXPORT_SYMBOL_GPL`` are next to
- the function definitions.
- Examples::
- .. kernel-doc:: lib/bitmap.c
- :export:
- .. kernel-doc:: include/net/mac80211.h
- :export: net/mac80211/*.c
- internal: *[source-pattern ...]*
- Include documentation for all functions and types in *source* that have
- **not** been exported using ``EXPORT_SYMBOL`` or ``EXPORT_SYMBOL_GPL`` either
- in *source* or in any of the files specified by *source-pattern*.
- Example::
- .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c
- :internal:
- identifiers: *[ function/type ...]*
- Include documentation for each *function* and *type* in *source*.
- If no *function* is specified, the documentation for all functions
- and types in the *source* will be included.
- Examples::
- .. kernel-doc:: lib/bitmap.c
- :identifiers: bitmap_parselist bitmap_parselist_user
- .. kernel-doc:: lib/idr.c
- :identifiers:
- no-identifiers: *[ function/type ...]*
- Exclude documentation for each *function* and *type* in *source*.
- Example::
- .. kernel-doc:: lib/bitmap.c
- :no-identifiers: bitmap_parselist
- functions: *[ function/type ...]*
- This is an alias of the 'identifiers' directive and deprecated.
- doc: *title*
- Include documentation for the ``DOC:`` paragraph identified by *title* in
- *source*. Spaces are allowed in *title*; do not quote the *title*. The *title*
- is only used as an identifier for the paragraph, and is not included in the
- output. Please make sure to have an appropriate heading in the enclosing
- reStructuredText document.
- Example::
- .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c
- :doc: High Definition Audio over HDMI and Display Port
- Without options, the kernel-doc directive includes all documentation comments
- from the source file.
- The kernel-doc extension is included in the kernel source tree, at
- ``Documentation/sphinx/kerneldoc.py``. Internally, it uses the
- ``scripts/kernel-doc`` script to extract the documentation comments from the
- source.
- .. _kernel_doc:
- How to use kernel-doc to generate man pages
- -------------------------------------------
- If you just want to use kernel-doc to generate man pages you can do this
- from the kernel git tree::
- $ scripts/kernel-doc -man \
- $(git grep -l '/\*\*' -- :^Documentation :^tools) \
- | scripts/split-man.pl /tmp/man
- Some older versions of git do not support some of the variants of syntax for
- path exclusion. One of the following commands may work for those versions::
- $ scripts/kernel-doc -man \
- $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \
- | scripts/split-man.pl /tmp/man
- $ scripts/kernel-doc -man \
- $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools") \
- | scripts/split-man.pl /tmp/man
|