aboutsummaryrefslogtreecommitdiff
path: root/pw_docgen/docs.rst
blob: 6971384a34b72b5334a62424f91b53e7ae0f92b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
.. _module-pw_docgen:

---------
pw_docgen
---------
The docgen module provides tools to generate documentation for Pigweed-based
projects, and for Pigweed itself.

Pigweed-based projects typically use a subset of Pigweed's modules and add their
own product-specific modules on top of that, which may have product-specific
documentation. Docgen provides a convenient way to combine all of the relevant
documentation for a project into one place, allowing downstream consumers of
release bundles (e.g. factory teams, QA teams, beta testers, etc.) to have a
unified source of documentation early on.

The documentation generation is integrated directly into the build system. Any
build target can depend on documentation, which allows it to be included as part
of a factory release build, for example. Additionally, documentation itself can
depend on other build targets, such as report cards for binary size/profiling.
Any time the code is changed, documentation will be regenerated with the updated
reports.

Documentation Overview
======================
Each Pigweed module provides documentation describing its functionality, use
cases, and programming API.

Included in a module's documentation are report cards which show an overview of
the module's size cost and performance benchmarks. These allow prospective users
to evaluate the impact of including the module in their projects.

Build Integration
=================

Pigweed documentation files are written in `reStructuredText`_ format and
rendered to HTML using `Sphinx`_ through Pigweed's GN build system.

.. _reStructuredText: http://docutils.sourceforge.net/rst.html
.. inclusive-language: ignore
.. _Sphinx: http://www.sphinx-doc.org/en/master

There are additonal Sphinx plugins used for rendering diagrams within
reStructuredText files including:

* `mermaid <https://mermaid-js.github.io/>`_ via the `sphinxcontrib-mermaid
  <https://pypi.org/project/sphinxcontrib-mermaid/>`_ package.

Documentation source and asset files are placed alongside code within a module
and registered as a ``pw_doc_group`` target within a ``BUILD.gn`` file. These
groups become available for import within a special documentation generation
target, which accumulates all of them and renders the resulting HTML. This
system can either be used directly within Pigweed, or integrated into a
downstream project.

GN Templates
------------

pw_doc_group
____________
The main template for defining documentation files is ``pw_doc_group``. It is
used to logically group a collection of documentation source files and assets.
Each Pigweed module is expected to provide at least one ``pw_doc_group`` target
defining the module's documentation. A ``pw_doc_group`` can depend on other
groups, causing them to be built with it.

**Arguments**

* ``sources``: RST documentation source files.
* ``inputs``: Additional resources required for the docs (images, data files,
  etc.)
* ``group_deps``: Other ``pw_doc_group`` targets required by this one.
* ``report_deps``: Report card generating targets (e.g. ``pw_size_diff``) on
  which the docs depend.

**Example**

.. code::

  pw_doc_group("my_doc_group") {
    sources = [ "docs.rst" ]
    inputs = [ "face-with-tears-of-joy-emoji.svg" ]
    group_deps = [ ":sub_doc_group" ]
    report_deps = [ ":my_size_report" ]
  }

pw_doc_gen
__________
The ``pw_doc_gen`` template creates a target which renders complete HTML
documentation for a project. It depends on registered ``pw_doc_group`` targets
and creates an action which collects and renders them.

To generate the complete docs, the template also requires a ``conf.py`` file
configuring Sphinx's output, and a top level ``index.rst`` for the main page of
the documentation. These are added at the root level of the built documentation
to tie everything together.

**Arguments**

* ``conf``: Path to the ``conf.py`` to use for Sphinx.
* ``index``: Path to the top-level ``index.rst`` file.
* ``output_directory``: Directory in which to render HTML output.
* ``deps``: List of all ``pw_doc_group`` targets required for the documentation.

**Example**

.. code::

  pw_doc_gen("my_docs") {
    conf = "//my_docs/conf.py"
    index = "//my_docs/index.rst"
    output_directory = target_gen_dir
    deps = [
      "//my_module:my_doc_group",
    ]
  }

Generating Documentation
------------------------
All source files listed under a ``pw_doc_gen`` target and its ``pw_doc_group``
dependencies get copied out into a directory structure mirroring the original
layout of the modules in which the sources appear. This is demonstrated below
using a subset of Pigweed's core documentation.

Consider the following target in ``$dir_pigweed/docs/BUILD.gn``:

.. code::

  pw_doc_gen("docs") {
    conf = "conf.py"
    index = "index.rst"
    output_directory = target_gen_dir
    deps = [
      "$dir_pw_bloat:docs",
      "$dir_pw_docgen:docs",
      "$dir_pw_preprocessor:docs",
    ]
  }

A documentation tree is created under the output directory. Each of the sources
and inputs in the target's dependency graph is copied under this tree in the
same directory structure as they appear under the root GN build directory
(``$dir_pigweed`` in this case). The ``conf.py`` and ``index.rst`` provided
directly to the ``pw_doc_gen`` template are copied in at the root of the tree.

.. code::

  out/gen/docs/pw_docgen_tree/
  ├── conf.py
  ├── index.rst
  ├── pw_bloat
  │   ├── bloat.rst
  │   └── examples
  │       └── simple_bloat.rst
  ├── pw_docgen
  │   └── docgen.rst
  └── pw_preprocessor
      └── docs.rst

This is the documentation tree which gets passed to Sphinx to build HTML output.
Imports within documentation files must be relative to this structure. In
practice, relative imports from within modules' documentation groups are
identical to the project's directory structure. The only special case is the
top-level ``index.rst`` file's imports; they must start from the project's build
root.

Sphinx Extensions
=================
This module houses Pigweed-specific extensions for the Sphinx documentation
generator. Extensions are included and configured in ``docs/conf.py``.

module_metadata
---------------
Per :ref:`SEED-0102 <seed-0102>`, Pigweed module documentation has a standard
format. The ``pigweed-module`` Sphinx directive provides that format and
registers module metadata that can be used elsewhere in the Sphinx build.

We need to add the directive after the document title, and add a class *to*
the document title to achieve the title & subtitle formatting. Here's an
example:

.. code-block:: rst

   .. rst-class:: with-subtitle

   =========
   pw_string
   =========

   .. pigweed-module::
      :name: pw_string
      :tagline: Efficient, easy, and safe string manipulation
      :status: stable
      :languages: C++14, C++17
      :code-size-impact: 500 to 1500 bytes
      :get-started: module-pw_string-get-started
      :design: module-pw_string-design
      :guides: module-pw_string-guide
      :api: module-pw_string-api

      Module sales pitch goes here!

Directive options
_________________
- ``name``: The module name (required)
- ``tagline``: A very short tagline that summarizes the module (required)
- ``status``: One of ``experimental``, ``unstable``, and ``stable`` (required)
- ``is-deprecated``: A flag indicating that the module is deprecated
- ``languages``: A comma-separated list of languages the module supports
- ``code-size-impact``: A summarize of the average code size impact
- ``get-started``: A reference to the getting started section (required)
- ``tutorials``: A reference to the tutorials section
- ``guides``: A reference to the guides section
- ``design``: A reference to the design considerations section (required)
- ``concepts``: A reference to the concepts documentation
- ``api``: A reference to the API documentation

google_analytics
----------------
When this extension is included and a ``google_analytics_id`` is set in the
Sphinx configuration, a Google Analytics tracking tag will be added to each
page of the documentation when it is rendered to HTML.

By default, the Sphinx configuration's ``google_analytics_id`` is set
automatically based on the value of the GN argument
``pw_docs_google_analytics_id``, allowing you to control whether tracking is
enabled or not in your build configuration. Typically, you would only enable
this for documentation builds intended for deployment on the web.