1.. _sphinxdoc: 2 3===================================== 4Using Sphinx for kernel documentation 5===================================== 6 7The Linux kernel uses `Sphinx`_ to generate pretty documentation from 8`reStructuredText`_ files under ``Documentation``. To build the documentation in 9HTML or PDF formats, use ``make htmldocs`` or ``make pdfdocs``. The generated 10documentation is placed in ``Documentation/output``. 11 12.. _Sphinx: http://www.sphinx-doc.org/ 13.. _reStructuredText: http://docutils.sourceforge.net/rst.html 14 15The reStructuredText files may contain directives to include structured 16documentation comments, or kernel-doc comments, from source files. Usually these 17are used to describe the functions and types and design of the code. The 18kernel-doc comments have some special structure and formatting, but beyond that 19they are also treated as reStructuredText. 20 21Finally, there are thousands of plain text documentation files scattered around 22``Documentation``. Some of these will likely be converted to reStructuredText 23over time, but the bulk of them will remain in plain text. 24 25.. _sphinx_install: 26 27Sphinx Install 28============== 29 30The ReST markups currently used by the Documentation/ files are meant to be 31built with ``Sphinx`` version 1.7 or higher. 32 33There's a script that checks for the Sphinx requirements. Please see 34:ref:`sphinx-pre-install` for further details. 35 36Most distributions are shipped with Sphinx, but its toolchain is fragile, 37and it is not uncommon that upgrading it or some other Python packages 38on your machine would cause the documentation build to break. 39 40A way to avoid that is to use a different version than the one shipped 41with your distributions. In order to do so, it is recommended to install 42Sphinx inside a virtual environment, using ``virtualenv-3`` 43or ``virtualenv``, depending on how your distribution packaged Python 3. 44 45.. note:: 46 47 #) It is recommended to use the RTD theme for html output. Depending 48 on the Sphinx version, it should be installed separately, 49 with ``pip install sphinx_rtd_theme``. 50 51 #) Some ReST pages contain math expressions. Due to the way Sphinx works, 52 those expressions are written using LaTeX notation. It needs texlive 53 installed with amsfonts and amsmath in order to evaluate them. 54 55In summary, if you want to install Sphinx version 2.4.4, you should do:: 56 57 $ virtualenv sphinx_2.4.4 58 $ . sphinx_2.4.4/bin/activate 59 (sphinx_2.4.4) $ pip install -r Documentation/sphinx/requirements.txt 60 61After running ``. sphinx_2.4.4/bin/activate``, the prompt will change, 62in order to indicate that you're using the new environment. If you 63open a new shell, you need to rerun this command to enter again at 64the virtual environment before building the documentation. 65 66Image output 67------------ 68 69The kernel documentation build system contains an extension that 70handles images on both GraphViz and SVG formats (see 71:ref:`sphinx_kfigure`). 72 73For it to work, you need to install both GraphViz and ImageMagick 74packages. If those packages are not installed, the build system will 75still build the documentation, but won't include any images at the 76output. 77 78PDF and LaTeX builds 79-------------------- 80 81Such builds are currently supported only with Sphinx versions 2.4 and higher. 82 83For PDF and LaTeX output, you'll also need ``XeLaTeX`` version 3.14159265. 84 85Depending on the distribution, you may also need to install a series of 86``texlive`` packages that provide the minimal set of functionalities 87required for ``XeLaTeX`` to work. 88 89.. _sphinx-pre-install: 90 91Checking for Sphinx dependencies 92-------------------------------- 93 94There's a script that automatically check for Sphinx dependencies. If it can 95recognize your distribution, it will also give a hint about the install 96command line options for your distro:: 97 98 $ ./scripts/sphinx-pre-install 99 Checking if the needed tools for Fedora release 26 (Twenty Six) are available 100 Warning: better to also install "texlive-luatex85". 101 You should run: 102 103 sudo dnf install -y texlive-luatex85 104 /usr/bin/virtualenv sphinx_2.4.4 105 . sphinx_2.4.4/bin/activate 106 pip install -r Documentation/sphinx/requirements.txt 107 108 Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468. 109 110By default, it checks all the requirements for both html and PDF, including 111the requirements for images, math expressions and LaTeX build, and assumes 112that a virtual Python environment will be used. The ones needed for html 113builds are assumed to be mandatory; the others to be optional. 114 115It supports two optional parameters: 116 117``--no-pdf`` 118 Disable checks for PDF; 119 120``--no-virtualenv`` 121 Use OS packaging for Sphinx instead of Python virtual environment. 122 123 124Sphinx Build 125============ 126 127The usual way to generate the documentation is to run ``make htmldocs`` or 128``make pdfdocs``. There are also other formats available: see the documentation 129section of ``make help``. The generated documentation is placed in 130format-specific subdirectories under ``Documentation/output``. 131 132To generate documentation, Sphinx (``sphinx-build``) must obviously be 133installed. For prettier HTML output, the Read the Docs Sphinx theme 134(``sphinx_rtd_theme``) is used if available. For PDF output you'll also need 135``XeLaTeX`` and ``convert(1)`` from ImageMagick 136(https://www.imagemagick.org).\ [#ink]_ 137All of these are widely available and packaged in distributions. 138 139To pass extra options to Sphinx, you can use the ``SPHINXOPTS`` make 140variable. For example, use ``make SPHINXOPTS=-v htmldocs`` to get more verbose 141output. 142 143It is also possible to pass an extra DOCS_CSS overlay file, in order to customize 144the html layout, by using the ``DOCS_CSS`` make variable. 145 146By default, the build will try to use the Read the Docs sphinx theme: 147 148 https://github.com/readthedocs/sphinx_rtd_theme 149 150If the theme is not available, it will fall-back to the classic one. 151 152The Sphinx theme can be overridden by using the ``DOCS_THEME`` make variable. 153 154There is another make variable ``SPHINXDIRS``, which is useful when test 155building a subset of documentation. For example, you can build documents 156under ``Documentation/doc-guide`` by running 157``make SPHINXDIRS=doc-guide htmldocs``. 158The documentation section of ``make help`` will show you the list of 159subdirectories you can specify. 160 161To remove the generated documentation, run ``make cleandocs``. 162 163.. [#ink] Having ``inkscape(1)`` from Inkscape (https://inkscape.org) 164 as well would improve the quality of images embedded in PDF 165 documents, especially for kernel releases 5.18 and later. 166 167Writing Documentation 168===================== 169 170Adding new documentation can be as simple as: 171 1721. Add a new ``.rst`` file somewhere under ``Documentation``. 1732. Refer to it from the Sphinx main `TOC tree`_ in ``Documentation/index.rst``. 174 175.. _TOC tree: http://www.sphinx-doc.org/en/stable/markup/toctree.html 176 177This is usually good enough for simple documentation (like the one you're 178reading right now), but for larger documents it may be advisable to create a 179subdirectory (or use an existing one). For example, the graphics subsystem 180documentation is under ``Documentation/gpu``, split to several ``.rst`` files, 181and has a separate ``index.rst`` (with a ``toctree`` of its own) referenced from 182the main index. 183 184See the documentation for `Sphinx`_ and `reStructuredText`_ on what you can do 185with them. In particular, the Sphinx `reStructuredText Primer`_ is a good place 186to get started with reStructuredText. There are also some `Sphinx specific 187markup constructs`_. 188 189.. _reStructuredText Primer: http://www.sphinx-doc.org/en/stable/rest.html 190.. _Sphinx specific markup constructs: http://www.sphinx-doc.org/en/stable/markup/index.html 191 192Specific guidelines for the kernel documentation 193------------------------------------------------ 194 195Here are some specific guidelines for the kernel documentation: 196 197* Please don't go overboard with reStructuredText markup. Keep it 198 simple. For the most part the documentation should be plain text with 199 just enough consistency in formatting that it can be converted to 200 other formats. 201 202* Please keep the formatting changes minimal when converting existing 203 documentation to reStructuredText. 204 205* Also update the content, not just the formatting, when converting 206 documentation. 207 208* Please stick to this order of heading adornments: 209 210 1. ``=`` with overline for document title:: 211 212 ============== 213 Document title 214 ============== 215 216 2. ``=`` for chapters:: 217 218 Chapters 219 ======== 220 221 3. ``-`` for sections:: 222 223 Section 224 ------- 225 226 4. ``~`` for subsections:: 227 228 Subsection 229 ~~~~~~~~~~ 230 231 Although RST doesn't mandate a specific order ("Rather than imposing a fixed 232 number and order of section title adornment styles, the order enforced will be 233 the order as encountered."), having the higher levels the same overall makes 234 it easier to follow the documents. 235 236* For inserting fixed width text blocks (for code examples, use case 237 examples, etc.), use ``::`` for anything that doesn't really benefit 238 from syntax highlighting, especially short snippets. Use 239 ``.. code-block:: <language>`` for longer code blocks that benefit 240 from highlighting. For a short snippet of code embedded in the text, use \`\`. 241 242 243the C domain 244------------ 245 246The **Sphinx C Domain** (name c) is suited for documentation of C API. E.g. a 247function prototype: 248 249.. code-block:: rst 250 251 .. c:function:: int ioctl( int fd, int request ) 252 253The C domain of the kernel-doc has some additional features. E.g. you can 254*rename* the reference name of a function with a common name like ``open`` or 255``ioctl``: 256 257.. code-block:: rst 258 259 .. c:function:: int ioctl( int fd, int request ) 260 :name: VIDIOC_LOG_STATUS 261 262The func-name (e.g. ioctl) remains in the output but the ref-name changed from 263``ioctl`` to ``VIDIOC_LOG_STATUS``. The index entry for this function is also 264changed to ``VIDIOC_LOG_STATUS``. 265 266Please note that there is no need to use ``c:func:`` to generate cross 267references to function documentation. Due to some Sphinx extension magic, 268the documentation build system will automatically turn a reference to 269``function()`` into a cross reference if an index entry for the given 270function name exists. If you see ``c:func:`` use in a kernel document, 271please feel free to remove it. 272 273 274list tables 275----------- 276 277The list-table formats can be useful for tables that are not easily laid 278out in the usual Sphinx ASCII-art formats. These formats are nearly 279impossible for readers of the plain-text documents to understand, though, 280and should be avoided in the absence of a strong justification for their 281use. 282 283The ``flat-table`` is a double-stage list similar to the ``list-table`` with 284some additional features: 285 286* column-span: with the role ``cspan`` a cell can be extended through 287 additional columns 288 289* row-span: with the role ``rspan`` a cell can be extended through 290 additional rows 291 292* auto span rightmost cell of a table row over the missing cells on the right 293 side of that table-row. With Option ``:fill-cells:`` this behavior can 294 changed from *auto span* to *auto fill*, which automatically inserts (empty) 295 cells instead of spanning the last cell. 296 297options: 298 299* ``:header-rows:`` [int] count of header rows 300* ``:stub-columns:`` [int] count of stub columns 301* ``:widths:`` [[int] [int] ... ] widths of columns 302* ``:fill-cells:`` instead of auto-spanning missing cells, insert missing cells 303 304roles: 305 306* ``:cspan:`` [int] additional columns (*morecols*) 307* ``:rspan:`` [int] additional rows (*morerows*) 308 309The example below shows how to use this markup. The first level of the staged 310list is the *table-row*. In the *table-row* there is only one markup allowed, 311the list of the cells in this *table-row*. Exceptions are *comments* ( ``..`` ) 312and *targets* (e.g. a ref to ``:ref:`last row <last row>``` / :ref:`last row 313<last row>`). 314 315.. code-block:: rst 316 317 .. flat-table:: table title 318 :widths: 2 1 1 3 319 320 * - head col 1 321 - head col 2 322 - head col 3 323 - head col 4 324 325 * - row 1 326 - field 1.1 327 - field 1.2 with autospan 328 329 * - row 2 330 - field 2.1 331 - :rspan:`1` :cspan:`1` field 2.2 - 3.3 332 333 * .. _`last row`: 334 335 - row 3 336 337Rendered as: 338 339 .. flat-table:: table title 340 :widths: 2 1 1 3 341 342 * - head col 1 343 - head col 2 344 - head col 3 345 - head col 4 346 347 * - row 1 348 - field 1.1 349 - field 1.2 with autospan 350 351 * - row 2 352 - field 2.1 353 - :rspan:`1` :cspan:`1` field 2.2 - 3.3 354 355 * .. _`last row`: 356 357 - row 3 358 359Cross-referencing 360----------------- 361 362Cross-referencing from one documentation page to another can be done simply by 363writing the path to the document file, no special syntax required. The path can 364be either absolute or relative. For absolute paths, start it with 365"Documentation/". For example, to cross-reference to this page, all the 366following are valid options, depending on the current document's directory (note 367that the ``.rst`` extension is required):: 368 369 See Documentation/doc-guide/sphinx.rst. This always works. 370 Take a look at sphinx.rst, which is at this same directory. 371 Read ../sphinx.rst, which is one directory above. 372 373If you want the link to have a different rendered text other than the document's 374title, you need to use Sphinx's ``doc`` role. For example:: 375 376 See :doc:`my custom link text for document sphinx <sphinx>`. 377 378For most use cases, the former is preferred, as it is cleaner and more suited 379for people reading the source files. If you come across a ``:doc:`` usage that 380isn't adding any value, please feel free to convert it to just the document 381path. 382 383For information on cross-referencing to kernel-doc functions or types, see 384Documentation/doc-guide/kernel-doc.rst. 385 386.. _sphinx_kfigure: 387 388Figures & Images 389================ 390 391If you want to add an image, you should use the ``kernel-figure`` and 392``kernel-image`` directives. E.g. to insert a figure with a scalable 393image format, use SVG (:ref:`svg_image_example`):: 394 395 .. kernel-figure:: svg_image.svg 396 :alt: simple SVG image 397 398 SVG image example 399 400.. _svg_image_example: 401 402.. kernel-figure:: svg_image.svg 403 :alt: simple SVG image 404 405 SVG image example 406 407The kernel figure (and image) directive supports **DOT** formatted files, see 408 409* DOT: http://graphviz.org/pdf/dotguide.pdf 410* Graphviz: http://www.graphviz.org/content/dot-language 411 412A simple example (:ref:`hello_dot_file`):: 413 414 .. kernel-figure:: hello.dot 415 :alt: hello world 416 417 DOT's hello world example 418 419.. _hello_dot_file: 420 421.. kernel-figure:: hello.dot 422 :alt: hello world 423 424 DOT's hello world example 425 426Embedded *render* markups (or languages) like Graphviz's **DOT** are provided by the 427``kernel-render`` directives.:: 428 429 .. kernel-render:: DOT 430 :alt: foobar digraph 431 :caption: Embedded **DOT** (Graphviz) code 432 433 digraph foo { 434 "bar" -> "baz"; 435 } 436 437How this will be rendered depends on the installed tools. If Graphviz is 438installed, you will see a vector image. If not, the raw markup is inserted as 439*literal-block* (:ref:`hello_dot_render`). 440 441.. _hello_dot_render: 442 443.. kernel-render:: DOT 444 :alt: foobar digraph 445 :caption: Embedded **DOT** (Graphviz) code 446 447 digraph foo { 448 "bar" -> "baz"; 449 } 450 451The *render* directive has all the options known from the *figure* directive, 452plus option ``caption``. If ``caption`` has a value, a *figure* node is 453inserted. If not, an *image* node is inserted. A ``caption`` is also needed, if 454you want to refer to it (:ref:`hello_svg_render`). 455 456Embedded **SVG**:: 457 458 .. kernel-render:: SVG 459 :caption: Embedded **SVG** markup 460 :alt: so-nw-arrow 461 462 <?xml version="1.0" encoding="UTF-8"?> 463 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...> 464 ... 465 </svg> 466 467.. _hello_svg_render: 468 469.. kernel-render:: SVG 470 :caption: Embedded **SVG** markup 471 :alt: so-nw-arrow 472 473 <?xml version="1.0" encoding="UTF-8"?> 474 <svg xmlns="http://www.w3.org/2000/svg" 475 version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400"> 476 <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/> 477 <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/> 478 </svg> 479