123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680 |
- ==========================
- Linux Kernel Documentation
- ==========================
- Introduction
- ============
- The Linux kernel uses `Sphinx`_ to generate pretty documentation from
- `reStructuredText`_ files under ``Documentation``. To build the documentation in
- HTML or PDF formats, use ``make htmldocs`` or ``make pdfdocs``. The generated
- documentation is placed in ``Documentation/output``.
- .. _Sphinx: http://www.sphinx-doc.org/
- .. _reStructuredText: http://docutils.sourceforge.net/rst.html
- The reStructuredText files may contain directives to include structured
- documentation comments, or kernel-doc comments, from source files. Usually these
- are used to describe the functions and types and design of the code. The
- kernel-doc comments have some special structure and formatting, but beyond that
- they are also treated as reStructuredText.
- There is also the deprecated DocBook toolchain to generate documentation from
- DocBook XML template files under ``Documentation/DocBook``. The DocBook files
- are to be converted to reStructuredText, and the toolchain is slated to be
- removed.
- Finally, there are thousands of plain text documentation files scattered around
- ``Documentation``. Some of these will likely be converted to reStructuredText
- over time, but the bulk of them will remain in plain text.
- Sphinx Build
- ============
- The usual way to generate the documentation is to run ``make htmldocs`` or
- ``make pdfdocs``. There are also other formats available, see the documentation
- section of ``make help``. The generated documentation is placed in
- format-specific subdirectories under ``Documentation/output``.
- To generate documentation, Sphinx (``sphinx-build``) must obviously be
- installed. For prettier HTML output, the Read the Docs Sphinx theme
- (``sphinx_rtd_theme``) is used if available. For PDF output, ``rst2pdf`` is also
- needed. All of these are widely available and packaged in distributions.
- To pass extra options to Sphinx, you can use the ``SPHINXOPTS`` make
- variable. For example, use ``make SPHINXOPTS=-v htmldocs`` to get more verbose
- output.
- To remove the generated documentation, run ``make cleandocs``.
- Writing Documentation
- =====================
- Adding new documentation can be as simple as:
- 1. Add a new ``.rst`` file somewhere under ``Documentation``.
- 2. Refer to it from the Sphinx main `TOC tree`_ in ``Documentation/index.rst``.
- .. _TOC tree: http://www.sphinx-doc.org/en/stable/markup/toctree.html
- This is usually good enough for simple documentation (like the one you're
- reading right now), but for larger documents it may be advisable to create a
- subdirectory (or use an existing one). For example, the graphics subsystem
- documentation is under ``Documentation/gpu``, split to several ``.rst`` files,
- and has a separate ``index.rst`` (with a ``toctree`` of its own) referenced from
- the main index.
- See the documentation for `Sphinx`_ and `reStructuredText`_ on what you can do
- with them. In particular, the Sphinx `reStructuredText Primer`_ is a good place
- to get started with reStructuredText. There are also some `Sphinx specific
- markup constructs`_.
- .. _reStructuredText Primer: http://www.sphinx-doc.org/en/stable/rest.html
- .. _Sphinx specific markup constructs: http://www.sphinx-doc.org/en/stable/markup/index.html
- Specific guidelines for the kernel documentation
- ------------------------------------------------
- Here are some specific guidelines for the kernel documentation:
- * Please don't go overboard with reStructuredText markup. Keep it simple.
- * Please stick to this order of heading adornments:
- 1. ``=`` with overline for document title::
- ==============
- Document title
- ==============
- 2. ``=`` for chapters::
- Chapters
- ========
- 3. ``-`` for sections::
- Section
- -------
- 4. ``~`` for subsections::
- Subsection
- ~~~~~~~~~~
- Although RST doesn't mandate a specific order ("Rather than imposing a fixed
- number and order of section title adornment styles, the order enforced will be
- the order as encountered."), having the higher levels the same overall makes
- it easier to follow the documents.
- the C domain
- ------------
- The `Sphinx C Domain`_ (name c) is suited for documentation of C API. E.g. a
- function prototype:
- .. code-block:: rst
- .. c:function:: int ioctl( int fd, int request )
- The C domain of the kernel-doc has some additional features. E.g. you can
- *rename* the reference name of a function with a common name like ``open`` or
- ``ioctl``:
- .. code-block:: rst
- .. c:function:: int ioctl( int fd, int request )
- :name: VIDIOC_LOG_STATUS
- The func-name (e.g. ioctl) remains in the output but the ref-name changed from
- ``ioctl`` to ``VIDIOC_LOG_STATUS``. The index entry for this function is also
- changed to ``VIDIOC_LOG_STATUS`` and the function can now referenced by:
- .. code-block:: rst
- :c:func:`VIDIOC_LOG_STATUS`
- list tables
- -----------
- We recommend the use of *list table* formats. The *list table* formats are
- double-stage lists. Compared to the ASCII-art they might not be as
- comfortable for
- readers of the text files. Their advantage is that they are easy to
- create or modify and that the diff of a modification is much more meaningful,
- because it is limited to the modified content.
- The ``flat-table`` is a double-stage list similar to the ``list-table`` with
- some additional features:
- * column-span: with the role ``cspan`` a cell can be extended through
- additional columns
- * row-span: with the role ``rspan`` a cell can be extended through
- additional rows
- * auto span rightmost cell of a table row over the missing cells on the right
- side of that table-row. With Option ``:fill-cells:`` this behavior can
- changed from *auto span* to *auto fill*, which automatically inserts (empty)
- cells instead of spanning the last cell.
- options:
- * ``:header-rows:`` [int] count of header rows
- * ``:stub-columns:`` [int] count of stub columns
- * ``:widths:`` [[int] [int] ... ] widths of columns
- * ``:fill-cells:`` instead of auto-spanning missing cells, insert missing cells
- roles:
- * ``:cspan:`` [int] additional columns (*morecols*)
- * ``:rspan:`` [int] additional rows (*morerows*)
- The example below shows how to use this markup. The first level of the staged
- list is the *table-row*. In the *table-row* there is only one markup allowed,
- the list of the cells in this *table-row*. Exceptions are *comments* ( ``..`` )
- and *targets* (e.g. a ref to ``:ref:`last row <last row>``` / :ref:`last row
- <last row>`).
- .. code-block:: rst
- .. flat-table:: table title
- :widths: 2 1 1 3
- * - head col 1
- - head col 2
- - head col 3
- - head col 4
- * - column 1
- - field 1.1
- - field 1.2 with autospan
- * - column 2
- - field 2.1
- - :rspan:`1` :cspan:`1` field 2.2 - 3.3
- * .. _`last row`:
- - column 3
- Rendered as:
- .. flat-table:: table title
- :widths: 2 1 1 3
- * - head col 1
- - head col 2
- - head col 3
- - head col 4
- * - column 1
- - field 1.1
- - field 1.2 with autospan
- * - column 2
- - field 2.1
- - :rspan:`1` :cspan:`1` field 2.2 - 3.3
- * .. _`last row`:
- - column 3
- Including kernel-doc comments
- =============================
- The Linux kernel source files may contain structured documentation comments, or
- kernel-doc comments to describe the functions and types and design of the
- code. The documentation comments may be included to 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:
- 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
- functions: *function* *[...]*
- Include documentation for each *function* in *source*.
- Example::
- .. kernel-doc:: lib/bitmap.c
- :functions: bitmap_parselist bitmap_parselist_user
- 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/kernel-doc.py``. Internally, it uses the
- ``scripts/kernel-doc`` script to extract the documentation comments from the
- source.
- .. _kernel_doc:
- Writing kernel-doc comments
- ===========================
- In order to provide embedded, "C" friendly, easy to maintain, but consistent and
- extractable overview, function and type documentation, the Linux kernel has
- adopted a consistent style for documentation comments. The format for this
- documentation is called the kernel-doc format, described below. This style
- embeds the documentation within the source files, using a few simple conventions
- for adding documentation paragraphs and documenting functions and their
- parameters, structures and unions and their members, enumerations, and typedefs.
- .. note:: The kernel-doc format is deceptively similar to 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.
- The ``scripts/kernel-doc`` script is used by the Sphinx kernel-doc extension in
- the documentation build to extract this embedded documentation into the various
- HTML, PDF, and other format documents.
- In order to provide good documentation of kernel functions and data structures,
- please use the following conventions to format your kernel-doc comments in the
- Linux kernel source.
- How to format kernel-doc comments
- ---------------------------------
- The opening comment mark ``/**`` is reserved for kernel-doc comments. Only
- comments so marked will be considered by the ``kernel-doc`` tool. Use it only
- for comment blocks that contain kernel-doc formatted comments. The usual ``*/``
- should be used as the closing comment marker. The lines in between should be
- prefixed by `` * `` (space star space).
- The function and type kernel-doc comments should be placed just before the
- function or type being described. The overview kernel-doc comments may be freely
- placed at the top indentation level.
- Example kernel-doc function comment::
- /**
- * foobar() - Brief description of foobar.
- * @arg: Description of argument of foobar.
- *
- * Longer description of foobar.
- *
- * Return: Description of return value of foobar.
- */
- int foobar(int arg)
- The format is similar for documentation for structures, enums, paragraphs,
- etc. See the sections below for details.
- The kernel-doc structure is extracted from the comments, and proper `Sphinx C
- Domain`_ function and type descriptions with anchors are generated for 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
- 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.)
- ``$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
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- To cross-reference the functions and types defined in the kernel-doc comments
- from reStructuredText documents, please use the `Sphinx C Domain`_
- references. For example::
- See function :c:func:`foo` and struct/union/enum/typedef :c:type:`bar`.
- While the type reference works with just the type name, without the
- struct/union/enum/typedef part in front, you may want to use::
- See :c:type:`struct foo <foo>`.
- See :c:type:`union bar <bar>`.
- See :c:type:`enum baz <baz>`.
- See :c:type:`typedef meh <meh>`.
- This will produce prettier links, and is in line with how kernel-doc does the
- cross-references.
- For further details, please refer to the `Sphinx C Domain`_ documentation.
- 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.
- *
- * Return: Describe the return value of foobar.
- *
- * 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.
- The kernel-doc function comments describe each parameter to the function, in
- order, with the ``@argument:`` descriptions. The ``@argument:`` descriptions
- must begin on the very next line following the opening brief function
- description line, with no intervening blank comment lines. The ``@argument:``
- descriptions may span multiple lines. The continuation lines may contain
- indentation. If a function parameter is ``...`` (varargs), it should be listed
- in kernel-doc notation as: ``@...:``.
- The return value, if any, should be described in a dedicated section at the end
- of the comment starting with "Return:".
- Structure, union, and enumeration documentation
- -----------------------------------------------
- The general format of a struct, union, and enum kernel-doc comment is::
- /**
- * struct struct_name - Brief description.
- * @member_name: Description of member member_name.
- *
- * Description of the structure.
- */
- Below, "struct" is used to mean structs, unions and enums, and "member" is used
- to mean struct and union members 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.
- The kernel-doc data structure comments describe each member of the structure, in
- order, with the ``@member:`` descriptions. The ``@member:`` descriptions must
- begin on the very next line following the opening brief function description
- line, with no intervening blank comment lines. The ``@member:`` descriptions may
- span multiple lines. The continuation lines may contain indentation.
- In-line member documentation comments
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The structure members may also be documented in-line within the definition::
- /**
- * 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;
- }
- Private members
- ~~~~~~~~~~~~~~~
- Inside a struct 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
- *
- * Longer description
- */
- struct my_struct {
- int a;
- int b;
- /* private: internal use only */
- int c;
- };
- Typedef documentation
- ---------------------
- The general format of a typedef kernel-doc comment is::
- /**
- * typedef type_name - Brief description.
- *
- * Description of the type.
- */
- 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.
- Recommendations
- ---------------
- We definitely need kernel-doc formatted documentation for functions that are
- exported to loadable modules using ``EXPORT_SYMBOL`` or ``EXPORT_SYMBOL_GPL``.
- We also look to 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. But this is
- lower priority and at the discretion of the MAINTAINER of that kernel source
- file.
- Data structures visible in kernel include files should also be documented using
- kernel-doc formatted comments.
- DocBook XML [DEPRECATED]
- ========================
- .. attention::
- This section describes the deprecated DocBook XML toolchain. Please do not
- create new DocBook XML template files. Please consider converting existing
- DocBook XML templates files to Sphinx/reStructuredText.
- Converting DocBook to Sphinx
- ----------------------------
- Over time, we expect all of the documents under ``Documentation/DocBook`` to be
- converted to Sphinx and reStructuredText. For most DocBook XML documents, a good
- enough solution is to use the simple ``Documentation/sphinx/tmplcvt`` script,
- which uses ``pandoc`` under the hood. For example::
- $ cd Documentation/sphinx
- $ ./tmplcvt ../DocBook/in.tmpl ../out.rst
- Then edit the resulting rst files to fix any remaining issues, and add the
- document in the ``toctree`` in ``Documentation/index.rst``.
- Components of the kernel-doc system
- -----------------------------------
- Many places in the source tree have extractable documentation in the form of
- block comments above functions. The components of this system are:
- - ``scripts/kernel-doc``
- This is a perl script that hunts for the block comments and can mark them up
- directly into reStructuredText, DocBook, man, text, and HTML. (No, not
- texinfo.)
- - ``Documentation/DocBook/*.tmpl``
- These are XML template files, which are normal XML files with special
- place-holders for where the extracted documentation should go.
- - ``scripts/docproc.c``
- This is a program for converting XML template files into XML files. When a
- file is referenced it is searched for symbols exported (EXPORT_SYMBOL), to be
- able to distinguish between internal and external functions.
- It invokes kernel-doc, giving it the list of functions that are to be
- documented.
- Additionally it is used to scan the XML template files to locate all the files
- referenced herein. This is used to generate dependency information as used by
- make.
- - ``Makefile``
- The targets 'xmldocs', 'psdocs', 'pdfdocs', and 'htmldocs' are used to build
- DocBook XML files, PostScript files, PDF files, and html files in
- Documentation/DocBook. The older target 'sgmldocs' is equivalent to 'xmldocs'.
- - ``Documentation/DocBook/Makefile``
- This is where C files are associated with SGML templates.
- How to use kernel-doc comments in DocBook XML template files
- ------------------------------------------------------------
- DocBook XML template files (\*.tmpl) are like normal XML files, except that they
- can contain escape sequences where extracted documentation should be inserted.
- ``!E<filename>`` is replaced by the documentation, in ``<filename>``, for
- functions that are exported using ``EXPORT_SYMBOL``: the function list is
- collected from files listed in ``Documentation/DocBook/Makefile``.
- ``!I<filename>`` is replaced by the documentation for functions that are **not**
- exported using ``EXPORT_SYMBOL``.
- ``!D<filename>`` is used to name additional files to search for functions
- exported using ``EXPORT_SYMBOL``.
- ``!F<filename> <function [functions...]>`` is replaced by the documentation, in
- ``<filename>``, for the functions listed.
- ``!P<filename> <section title>`` is replaced by the contents of the ``DOC:``
- section titled ``<section title>`` from ``<filename>``. Spaces are allowed in
- ``<section title>``; do not quote the ``<section title>``.
- ``!C<filename>`` is replaced by nothing, but makes the tools check that all DOC:
- sections and documented functions, symbols, etc. are used. This makes sense to
- use when you use ``!F`` or ``!P`` only and want to verify that all documentation
- is included.
|