| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539 |
- .. _sphinxdoc:
- =====================================
- Using Sphinx for kernel documentation
- =====================================
- 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.
- 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_install:
- Sphinx Install
- ==============
- The ReST markups currently used by the Documentation/ files are meant to be
- built with ``Sphinx`` version 2.4.4 or higher.
- There's a script that checks for the Sphinx requirements. Please see
- :ref:`sphinx-pre-install` for further details.
- Most distributions are shipped with Sphinx, but its toolchain is fragile,
- and it is not uncommon that upgrading it or some other Python packages
- on your machine would cause the documentation build to break.
- A way to avoid that is to use a different version than the one shipped
- with your distributions. In order to do so, it is recommended to install
- Sphinx inside a virtual environment, using ``virtualenv-3``
- or ``virtualenv``, depending on how your distribution packaged Python 3.
- .. note::
- #) It is recommended to use the RTD theme for html output. Depending
- on the Sphinx version, it should be installed separately,
- with ``pip install sphinx_rtd_theme``.
- In summary, if you want to install the latest version of Sphinx, you
- should do::
- $ virtualenv sphinx_latest
- $ . sphinx_latest/bin/activate
- (sphinx_latest) $ pip install -r Documentation/sphinx/requirements.txt
- After running ``. sphinx_latest/bin/activate``, the prompt will change,
- in order to indicate that you're using the new environment. If you
- open a new shell, you need to rerun this command to enter again at
- the virtual environment before building the documentation.
- Image output
- ------------
- The kernel documentation build system contains an extension that
- handles images in both GraphViz and SVG formats (see :ref:`sphinx_kfigure`).
- For it to work, you need to install both GraphViz and ImageMagick
- packages. If those packages are not installed, the build system will
- still build the documentation, but won't include any images at the
- output.
- PDF and LaTeX builds
- --------------------
- Such builds are currently supported only with Sphinx versions 2.4 and higher.
- For PDF and LaTeX output, you'll also need ``XeLaTeX`` version 3.14159265.
- Depending on the distribution, you may also need to install a series of
- ``texlive`` packages that provide the minimal set of functionalities
- required for ``XeLaTeX`` to work.
- Math Expressions in HTML
- ------------------------
- Some ReST pages contain math expressions. Due to the way Sphinx works,
- those expressions are written using LaTeX notation.
- There are two options for Sphinx to render math expressions in html output.
- One is an extension called `imgmath`_ which converts math expressions into
- images and embeds them in html pages.
- The other is an extension called `mathjax`_ which delegates math rendering
- to JavaScript capable web browsers.
- The former was the only option for pre-6.1 kernel documentation and it
- requires quite a few texlive packages including amsfonts and amsmath among
- others.
- Since kernel release 6.1, html pages with math expressions can be built
- without installing any texlive packages. See `Choice of Math Renderer`_ for
- further info.
- .. _imgmath: https://www.sphinx-doc.org/en/master/usage/extensions/math.html#module-sphinx.ext.imgmath
- .. _mathjax: https://www.sphinx-doc.org/en/master/usage/extensions/math.html#module-sphinx.ext.mathjax
- .. _sphinx-pre-install:
- Checking for Sphinx dependencies
- --------------------------------
- There's a script that automatically checks for Sphinx dependencies. If it can
- recognize your distribution, it will also give a hint about the install
- command line options for your distro::
- $ ./scripts/sphinx-pre-install
- Checking if the needed tools for Fedora release 26 (Twenty Six) are available
- Warning: better to also install "texlive-luatex85".
- You should run:
- sudo dnf install -y texlive-luatex85
- /usr/bin/virtualenv sphinx_2.4.4
- . sphinx_2.4.4/bin/activate
- pip install -r Documentation/sphinx/requirements.txt
- Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468.
- By default, it checks all the requirements for both html and PDF, including
- the requirements for images, math expressions and LaTeX build, and assumes
- that a virtual Python environment will be used. The ones needed for html
- builds are assumed to be mandatory; the others to be optional.
- It supports two optional parameters:
- ``--no-pdf``
- Disable checks for PDF;
- ``--no-virtualenv``
- Use OS packaging for Sphinx instead of Python virtual environment.
- 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 PDF output you'll also need ``XeLaTeX`` and ``convert(1)``
- from ImageMagick (https://www.imagemagick.org).\ [#ink]_ 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.
- It is also possible to pass an extra DOCS_CSS overlay file, in order to customize
- the html layout, by using the ``DOCS_CSS`` make variable.
- By default, the "Alabaster" theme is used to build the HTML documentation;
- this theme is bundled with Sphinx and need not be installed separately.
- The Sphinx theme can be overridden by using the ``DOCS_THEME`` make variable.
- There is another make variable ``SPHINXDIRS``, which is useful when test
- building a subset of documentation. For example, you can build documents
- under ``Documentation/doc-guide`` by running
- ``make SPHINXDIRS=doc-guide htmldocs``.
- The documentation section of ``make help`` will show you the list of
- subdirectories you can specify.
- To remove the generated documentation, run ``make cleandocs``.
- .. [#ink] Having ``inkscape(1)`` from Inkscape (https://inkscape.org)
- as well would improve the quality of images embedded in PDF
- documents, especially for kernel releases 5.18 and later.
- Choice of Math Renderer
- -----------------------
- Since kernel release 6.1, mathjax works as a fallback math renderer for
- html output.\ [#sph1_8]_
- Math renderer is chosen depending on available commands as shown below:
- .. table:: Math Renderer Choices for HTML
- ============= ================= ============
- Math renderer Required commands Image format
- ============= ================= ============
- imgmath latex, dvipng PNG (raster)
- mathjax
- ============= ================= ============
- The choice can be overridden by setting an environment variable
- ``SPHINX_IMGMATH`` as shown below:
- .. table:: Effect of Setting ``SPHINX_IMGMATH``
- ====================== ========
- Setting Renderer
- ====================== ========
- ``SPHINX_IMGMATH=yes`` imgmath
- ``SPHINX_IMGMATH=no`` mathjax
- ====================== ========
- .. [#sph1_8] Fallback of math renderer requires Sphinx >=1.8.
- 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. For the most part the documentation should be plain text with
- just enough consistency in formatting that it can be converted to
- other formats.
- * Please keep the formatting changes minimal when converting existing
- documentation to reStructuredText.
- * Also update the content, not just the formatting, when converting
- documentation.
- * 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.
- * For inserting fixed width text blocks (for code examples, use case
- examples, etc.), use ``::`` for anything that doesn't really benefit
- from syntax highlighting, especially short snippets. Use
- ``.. code-block:: <language>`` for longer code blocks that benefit
- from highlighting. For a short snippet of code embedded in the text, use \`\`.
- 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``.
- Please note that there is no need to use ``c:func:`` to generate cross
- references to function documentation. Due to some Sphinx extension magic,
- the documentation build system will automatically turn a reference to
- ``function()`` into a cross reference if an index entry for the given
- function name exists. If you see ``c:func:`` use in a kernel document,
- please feel free to remove it.
- Tables
- ------
- ReStructuredText provides several options for table syntax. Kernel style for
- tables is to prefer *simple table* syntax or *grid table* syntax. See the
- `reStructuredText user reference for table syntax`_ for more details.
- .. _reStructuredText user reference for table syntax:
- https://docutils.sourceforge.io/docs/user/rst/quickref.html#tables
- list tables
- ~~~~~~~~~~~
- The list-table formats can be useful for tables that are not easily laid
- out in the usual Sphinx ASCII-art formats. These formats are nearly
- impossible for readers of the plain-text documents to understand, though,
- and should be avoided in the absence of a strong justification for their
- use.
- 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
- * - row 1
- - field 1.1
- - field 1.2 with autospan
- * - row 2
- - field 2.1
- - :rspan:`1` :cspan:`1` field 2.2 - 3.3
- * .. _`last row`:
- - row 3
- Rendered as:
- .. flat-table:: table title
- :widths: 2 1 1 3
- * - head col 1
- - head col 2
- - head col 3
- - head col 4
- * - row 1
- - field 1.1
- - field 1.2 with autospan
- * - row 2
- - field 2.1
- - :rspan:`1` :cspan:`1` field 2.2 - 3.3
- * .. _`last row`:
- - row 3
- Cross-referencing
- -----------------
- Cross-referencing from one documentation page to another can be done simply by
- writing the path to the document file, no special syntax required. The path can
- be either absolute or relative. For absolute paths, start it with
- "Documentation/". For example, to cross-reference to this page, all the
- following are valid options, depending on the current document's directory (note
- that the ``.rst`` extension is required)::
- See Documentation/doc-guide/sphinx.rst. This always works.
- Take a look at sphinx.rst, which is at this same directory.
- Read ../sphinx.rst, which is one directory above.
- If you want the link to have a different rendered text other than the document's
- title, you need to use Sphinx's ``doc`` role. For example::
- See :doc:`my custom link text for document sphinx <sphinx>`.
- For most use cases, the former is preferred, as it is cleaner and more suited
- for people reading the source files. If you come across a ``:doc:`` usage that
- isn't adding any value, please feel free to convert it to just the document
- path.
- For information on cross-referencing to kernel-doc functions or types, see
- Documentation/doc-guide/kernel-doc.rst.
- Referencing commits
- ~~~~~~~~~~~~~~~~~~~
- References to git commits are automatically hyperlinked given that they are
- written in one of these formats::
- commit 72bf4f1767f0
- commit 72bf4f1767f0 ("net: do not leave an empty skb in write queue")
- .. _sphinx_kfigure:
- Figures & Images
- ================
- If you want to add an image, you should use the ``kernel-figure`` and
- ``kernel-image`` directives. E.g. to insert a figure with a scalable
- image format, use SVG (:ref:`svg_image_example`)::
- .. kernel-figure:: svg_image.svg
- :alt: simple SVG image
- SVG image example
- .. _svg_image_example:
- .. kernel-figure:: svg_image.svg
- :alt: simple SVG image
- SVG image example
- The kernel figure (and image) directive supports **DOT** formatted files, see
- * DOT: http://graphviz.org/pdf/dotguide.pdf
- * Graphviz: http://www.graphviz.org/content/dot-language
- A simple example (:ref:`hello_dot_file`)::
- .. kernel-figure:: hello.dot
- :alt: hello world
- DOT's hello world example
- .. _hello_dot_file:
- .. kernel-figure:: hello.dot
- :alt: hello world
- DOT's hello world example
- Embedded *render* markups (or languages) like Graphviz's **DOT** are provided by the
- ``kernel-render`` directives.::
- .. kernel-render:: DOT
- :alt: foobar digraph
- :caption: Embedded **DOT** (Graphviz) code
- digraph foo {
- "bar" -> "baz";
- }
- How this will be rendered depends on the installed tools. If Graphviz is
- installed, you will see a vector image. If not, the raw markup is inserted as
- *literal-block* (:ref:`hello_dot_render`).
- .. _hello_dot_render:
- .. kernel-render:: DOT
- :alt: foobar digraph
- :caption: Embedded **DOT** (Graphviz) code
- digraph foo {
- "bar" -> "baz";
- }
- The *render* directive has all the options known from the *figure* directive,
- plus option ``caption``. If ``caption`` has a value, a *figure* node is
- inserted. If not, an *image* node is inserted. A ``caption`` is also needed, if
- you want to refer to it (:ref:`hello_svg_render`).
- Embedded **SVG**::
- .. kernel-render:: SVG
- :caption: Embedded **SVG** markup
- :alt: so-nw-arrow
- <?xml version="1.0" encoding="UTF-8"?>
- <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...>
- ...
- </svg>
- .. _hello_svg_render:
- .. kernel-render:: SVG
- :caption: Embedded **SVG** markup
- :alt: so-nw-arrow
- <?xml version="1.0" encoding="UTF-8"?>
- <svg xmlns="http://www.w3.org/2000/svg"
- version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400">
- <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/>
- <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/>
- </svg>
|