[[sphinx]]
== Sphinx documentation

Erlang.mk includes targets for running the
http://www.sphinx-doc.org/[Sphinx documentation generator], which can produce
documentation in various formats, like HTML, man pages, Texinfo, LaTeX, and
others.

=== Writing Sphinx documentation

Sphinx generates documentation from a set of
http://www.sphinx-doc.org/en/stable/rest.html[reST] documents. There is
a http://www.sphinx-doc.org/en/stable/tutorial.html[quick start guide] on
Sphinx' website. For Erlang.mk, we'll set up a minimal environment instead.

=== Basic setup

By default, Erlang.mk expects Sphinx documentation to be placed in the 'doc'
directory, with 'doc/conf.py' config file in particular. The file contains
information about the project, among the other things.

A minimal 'doc/conf.py' will look similar to this:

[source,python]
----
project = 'My Project'
version = '0.0'
release = '0.0.1'
master_doc = 'index'
source_suffix = '.rst'
----

It points to a 'doc/index.rst' document. A simple skeleton includes a table of
contents for all documentation, and links to generated index of terms and
a search page:

----
My Project
==========

Contents:

.. toctree::
   :maxdepth: 2

   other_page

Indices and tables
==================

* :ref:`genindex`
* :ref:`search`
----

The skeleton above has a link to one other page, 'doc/other_page.rst'. Simple
header with some text will do for now:

----
Other Page
==========

Lorem ipsum dolor sit amet...
----

The files above are enough to build HTML documentation to the 'html' directory.

[source,bash]
$ make docs     # all the docs, including EDoc and AsciiDoc if applicable
$ make sphinx   # Sphinx docs specifically

=== Erlang.mk configuration

Erlang.mk defaults to the following configuration:

[source,make]
SPHINX_FORMATS = html
SPHINX_SOURCE = doc

To change the location of Sphinx sources, you need to set the `$(SPHINX_SOURCE)`
variable. The 'conf.py' file should also be placed in that directory, unless you
specify `$(SPHINX_CONFDIR)`.

The variable `$(SPHINX_OPTS)` allows to provide options to `sphinx-build`, which
is particularly useful for `-D name=value` options. You can even forego
'doc/conf.py' file, using `-D name=value` in combination with the `-C` option,
though in this case you will need to manually call `make sphinx` or add the
`sphinx` target to dependencies of `docs`.

The `$(SPHINX_FORMATS)` variable lists formats to generate. By default only HTML
is generated, but it can also build man pages or LaTeX documents which can later
be converted to PDF. See the
http://www.sphinx-doc.org/en/stable/invocation.html#cmdoption-sphinx-build-b[description of the `-b` option]
for `sphinx-build` for a list of known formats.

Formats are by default generated to a directory called after the format
('html' for HTML, 'man' for man pages, and so on). To change this behaviour
for a specific format, you can set the `$(sphinx_$(format)_output)` variable, e.g.
`$(sphinx_html_output)` for 'html' or `$(sphinx_man_output)` for 'man'.
There are also `$(sphinx_$(format)_opts)` variables for setting `sphinx-build`
options for a single format only.

=== Generating man pages

To generate man pages, you need to include `man` in `$(SPHINX_FORMATS)` in
your Makefile and define the `man_pages` option in 'doc/conf.py':

[source,python]
----
man_pages = [
    ('doc_name', 'page_name', 'Manpage Title', ['Page Author'], 1),
]
----

As the
http://www.sphinx-doc.org/en/stable/config.html#options-for-manual-page-output[Sphinx documentation]
indicates, the structure is:

* `doc_name` is the path to the man page's source (relative `$(SPHINX_SOURCE)`),
  without the '.rst' suffix
* `page_name` is the name of the resulting man page, which will be used as a base
  for the output file name and will be included in the generated man page
* `Manpage Title` is a short, one-line description, which will be included in
  the generated man page on a position that's used by the `apropos` command
* `Page Author` (or more of them) will be included in the autogenerated `AUTHOR`
  section. Leaving this field empty disables generating the `AUTHOR` section
* `1` is the man page section number

With the above configuration (and Erlang.mk's defaults), 'doc/doc_name.rst' will
be used to generate 'man/page_name.1'.
