xref: /linux/Documentation/doc-guide/sphinx.rst (revision e58e871becec2d3b04ed91c0c16fe8deac9c9dfa)
1Introduction
2============
3
4The Linux kernel uses `Sphinx`_ to generate pretty documentation from
5`reStructuredText`_ files under ``Documentation``. To build the documentation in
6HTML or PDF formats, use ``make htmldocs`` or ``make pdfdocs``. The generated
7documentation is placed in ``Documentation/output``.
8
9.. _Sphinx: http://www.sphinx-doc.org/
10.. _reStructuredText: http://docutils.sourceforge.net/rst.html
11
12The reStructuredText files may contain directives to include structured
13documentation comments, or kernel-doc comments, from source files. Usually these
14are used to describe the functions and types and design of the code. The
15kernel-doc comments have some special structure and formatting, but beyond that
16they are also treated as reStructuredText.
17
18There is also the deprecated DocBook toolchain to generate documentation from
19DocBook XML template files under ``Documentation/DocBook``. The DocBook files
20are to be converted to reStructuredText, and the toolchain is slated to be
21removed.
22
23Finally, there are thousands of plain text documentation files scattered around
24``Documentation``. Some of these will likely be converted to reStructuredText
25over time, but the bulk of them will remain in plain text.
26
27Sphinx Build
28============
29
30The usual way to generate the documentation is to run ``make htmldocs`` or
31``make pdfdocs``. There are also other formats available, see the documentation
32section of ``make help``. The generated documentation is placed in
33format-specific subdirectories under ``Documentation/output``.
34
35To generate documentation, Sphinx (``sphinx-build``) must obviously be
36installed. For prettier HTML output, the Read the Docs Sphinx theme
37(``sphinx_rtd_theme``) is used if available. For PDF output you'll also need
38``XeLaTeX`` and ``convert(1)`` from ImageMagick (https://www.imagemagick.org).
39All of these are widely available and packaged in distributions.
40
41To pass extra options to Sphinx, you can use the ``SPHINXOPTS`` make
42variable. For example, use ``make SPHINXOPTS=-v htmldocs`` to get more verbose
43output.
44
45To remove the generated documentation, run ``make cleandocs``.
46
47Writing Documentation
48=====================
49
50Adding new documentation can be as simple as:
51
521. Add a new ``.rst`` file somewhere under ``Documentation``.
532. Refer to it from the Sphinx main `TOC tree`_ in ``Documentation/index.rst``.
54
55.. _TOC tree: http://www.sphinx-doc.org/en/stable/markup/toctree.html
56
57This is usually good enough for simple documentation (like the one you're
58reading right now), but for larger documents it may be advisable to create a
59subdirectory (or use an existing one). For example, the graphics subsystem
60documentation is under ``Documentation/gpu``, split to several ``.rst`` files,
61and has a separate ``index.rst`` (with a ``toctree`` of its own) referenced from
62the main index.
63
64See the documentation for `Sphinx`_ and `reStructuredText`_ on what you can do
65with them. In particular, the Sphinx `reStructuredText Primer`_ is a good place
66to get started with reStructuredText. There are also some `Sphinx specific
67markup constructs`_.
68
69.. _reStructuredText Primer: http://www.sphinx-doc.org/en/stable/rest.html
70.. _Sphinx specific markup constructs: http://www.sphinx-doc.org/en/stable/markup/index.html
71
72Specific guidelines for the kernel documentation
73------------------------------------------------
74
75Here are some specific guidelines for the kernel documentation:
76
77* Please don't go overboard with reStructuredText markup. Keep it
78  simple. For the most part the documentation should be plain text with
79  just enough consistency in formatting that it can be converted to
80  other formats.
81
82* Please keep the formatting changes minimal when converting existing
83  documentation to reStructuredText.
84
85* Also update the content, not just the formatting, when converting
86  documentation.
87
88* Please stick to this order of heading adornments:
89
90  1. ``=`` with overline for document title::
91
92       ==============
93       Document title
94       ==============
95
96  2. ``=`` for chapters::
97
98       Chapters
99       ========
100
101  3. ``-`` for sections::
102
103       Section
104       -------
105
106  4. ``~`` for subsections::
107
108       Subsection
109       ~~~~~~~~~~
110
111  Although RST doesn't mandate a specific order ("Rather than imposing a fixed
112  number and order of section title adornment styles, the order enforced will be
113  the order as encountered."), having the higher levels the same overall makes
114  it easier to follow the documents.
115
116* For inserting fixed width text blocks (for code examples, use case
117  examples, etc.), use ``::`` for anything that doesn't really benefit
118  from syntax highlighting, especially short snippets. Use
119  ``.. code-block:: <language>`` for longer code blocks that benefit
120  from highlighting.
121
122
123the C domain
124------------
125
126The `Sphinx C Domain`_ (name c) is suited for documentation of C API. E.g. a
127function prototype:
128
129.. code-block:: rst
130
131    .. c:function:: int ioctl( int fd, int request )
132
133The C domain of the kernel-doc has some additional features. E.g. you can
134*rename* the reference name of a function with a common name like ``open`` or
135``ioctl``:
136
137.. code-block:: rst
138
139     .. c:function:: int ioctl( int fd, int request )
140        :name: VIDIOC_LOG_STATUS
141
142The func-name (e.g. ioctl) remains in the output but the ref-name changed from
143``ioctl`` to ``VIDIOC_LOG_STATUS``. The index entry for this function is also
144changed to ``VIDIOC_LOG_STATUS`` and the function can now referenced by:
145
146.. code-block:: rst
147
148     :c:func:`VIDIOC_LOG_STATUS`
149
150
151list tables
152-----------
153
154We recommend the use of *list table* formats. The *list table* formats are
155double-stage lists. Compared to the ASCII-art they might not be as
156comfortable for
157readers of the text files. Their advantage is that they are easy to
158create or modify and that the diff of a modification is much more meaningful,
159because it is limited to the modified content.
160
161The ``flat-table`` is a double-stage list similar to the ``list-table`` with
162some additional features:
163
164* column-span: with the role ``cspan`` a cell can be extended through
165  additional columns
166
167* row-span: with the role ``rspan`` a cell can be extended through
168  additional rows
169
170* auto span rightmost cell of a table row over the missing cells on the right
171  side of that table-row.  With Option ``:fill-cells:`` this behavior can
172  changed from *auto span* to *auto fill*, which automatically inserts (empty)
173  cells instead of spanning the last cell.
174
175options:
176
177* ``:header-rows:``   [int] count of header rows
178* ``:stub-columns:``  [int] count of stub columns
179* ``:widths:``        [[int] [int] ... ] widths of columns
180* ``:fill-cells:``    instead of auto-spanning missing cells, insert missing cells
181
182roles:
183
184* ``:cspan:`` [int] additional columns (*morecols*)
185* ``:rspan:`` [int] additional rows (*morerows*)
186
187The example below shows how to use this markup.  The first level of the staged
188list is the *table-row*. In the *table-row* there is only one markup allowed,
189the list of the cells in this *table-row*. Exceptions are *comments* ( ``..`` )
190and *targets* (e.g. a ref to ``:ref:`last row <last row>``` / :ref:`last row
191<last row>`).
192
193.. code-block:: rst
194
195   .. flat-table:: table title
196      :widths: 2 1 1 3
197
198      * - head col 1
199        - head col 2
200        - head col 3
201        - head col 4
202
203      * - column 1
204        - field 1.1
205        - field 1.2 with autospan
206
207      * - column 2
208        - field 2.1
209        - :rspan:`1` :cspan:`1` field 2.2 - 3.3
210
211      * .. _`last row`:
212
213        - column 3
214
215Rendered as:
216
217   .. flat-table:: table title
218      :widths: 2 1 1 3
219
220      * - head col 1
221        - head col 2
222        - head col 3
223        - head col 4
224
225      * - column 1
226        - field 1.1
227        - field 1.2 with autospan
228
229      * - column 2
230        - field 2.1
231        - :rspan:`1` :cspan:`1` field 2.2 - 3.3
232
233      * .. _`last row`:
234
235        - column 3
236
237
238Figures & Images
239================
240
241If you want to add an image, you should use the ``kernel-figure`` and
242``kernel-image`` directives. E.g. to insert a figure with a scalable
243image format use SVG (:ref:`svg_image_example`)::
244
245    .. kernel-figure::  svg_image.svg
246       :alt:    simple SVG image
247
248       SVG image example
249
250.. _svg_image_example:
251
252.. kernel-figure::  svg_image.svg
253   :alt:    simple SVG image
254
255   SVG image example
256
257The kernel figure (and image) directive support **DOT** formated files, see
258
259* DOT: http://graphviz.org/pdf/dotguide.pdf
260* Graphviz: http://www.graphviz.org/content/dot-language
261
262A simple example (:ref:`hello_dot_file`)::
263
264  .. kernel-figure::  hello.dot
265     :alt:    hello world
266
267     DOT's hello world example
268
269.. _hello_dot_file:
270
271.. kernel-figure::  hello.dot
272   :alt:    hello world
273
274   DOT's hello world example
275
276Embed *render* markups (or languages) like Graphviz's **DOT** is provided by the
277``kernel-render`` directives.::
278
279  .. kernel-render:: DOT
280     :alt: foobar digraph
281     :caption: Embedded **DOT** (Graphviz) code
282
283     digraph foo {
284      "bar" -> "baz";
285     }
286
287How this will be rendered depends on the installed tools. If Graphviz is
288installed, you will see an vector image. If not the raw markup is inserted as
289*literal-block* (:ref:`hello_dot_render`).
290
291.. _hello_dot_render:
292
293.. kernel-render:: DOT
294   :alt: foobar digraph
295   :caption: Embedded **DOT** (Graphviz) code
296
297   digraph foo {
298      "bar" -> "baz";
299   }
300
301The *render* directive has all the options known from the *figure* directive,
302plus option ``caption``.  If ``caption`` has a value, a *figure* node is
303inserted. If not, a *image* node is inserted. A ``caption`` is also needed, if
304you want to refer it (:ref:`hello_svg_render`).
305
306Embedded **SVG**::
307
308  .. kernel-render:: SVG
309     :caption: Embedded **SVG** markup
310     :alt: so-nw-arrow
311
312     <?xml version="1.0" encoding="UTF-8"?>
313     <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...>
314        ...
315     </svg>
316
317.. _hello_svg_render:
318
319.. kernel-render:: SVG
320   :caption: Embedded **SVG** markup
321   :alt: so-nw-arrow
322
323   <?xml version="1.0" encoding="UTF-8"?>
324   <svg xmlns="http://www.w3.org/2000/svg"
325     version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400">
326   <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/>
327   <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/>
328   </svg>
329