Apache Mynewt Documentation
###########################

.. contents::

This is the project documentation for the `Apache Mynewt`_ project. It is built using `Sphinx`_.

Each component of Mynewt contains its own specific documentation in its repo under ``docs``. At
build time these are combined to create the full document set for publication.

The `Apache Mynewt`_ source code also contains inline comments in `Doxygen`_ format to document its APIs.

Writing Documentation
=======================

`Sphinx`_ use reStructuredText. http://www.sphinx-doc.org/en/stable/rest.html.

Embedding `Doxygen`_ generated source documentation is through the `Breathe`_
bridge. http://breathe.readthedocs.io/en/latest/. This bridge embeds source
documentation using `Sphinx`_'s C domain. For example:
``.. doxygenfile:: full/include/console/console.h``

Documents can then refer to code elements using the C domain syntax:
http://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
For example: ``:c:func:`console_read()``` or ``:c:data:`console_input```.

Linking to other files should be relative for ease of deployment and multi-version
support. For example ``:doc:`../../newt/install/newt_mac```.

Preview Changes
=================

``make clean && make docs && (cd _build/html && python -m SimpleHTTPServer 8080)``

Setup (MacOS)
===============

Note: This build toolchain is known to work on MacOS 10.11.

Prerequisites:
***************

* `homebrew`_

.. code-block:: bash

  $ brew --version
  Homebrew 1.1.7

* python

.. code-block:: bash

  $ python --version
  Python 2.7.10

* `pip`_

.. code-block:: bash

  $ pip --version
  pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)


Toolchain Install:
*******************

.. code-block:: bash

   $ git clone https://github.com/sphinx-doc/sphinx.git sphinx

   $ cd sphinx && sudo -E python setup.py install && cd ..

   $ git clone https://github.com/michaeljones/breathe.git breathe

   $ cd breathe && sudo -E python setup.py install && cd ..

   $ brew install doxygen

   $ sudo pip install recommonmark

Setup (Linux)
===============

Most Linux distributions provide necessary packages in their repositories.

Ubuntu/Debian
.. code-block:: bash

   sudo apt-get install doxygen python3-breathe python3-recommonmark

Fedora
.. code-block:: bash

   sudo dnf install doxygen python3-breathe python3-recommonmark

Deploying the latest docs
=========================

NOTE: These instructions assume that your workspace has all the mynewt repos
cloned under the same parent directory. 

* Ensure that all changes are merged into ``master`` and that the ``master``
  branch is checked out.
* Repeat for any mynewt code repo that has documentation changes.
* Follow the steps at `Site Docs`_ to release the docs.

Creating a versioned set of docs
================================

When the master/latest documentation is deemed representative of a Mynewt
version, it is time to create a versioned set.

* Make sure all your mynewt-* repos are up to date and that all changes are
  merged and committed.
* Add the new version to mynewt-documentation/docs/themes/mynewt/versions.html

  * Also add the new version to any existing archived set.
  * i.e ``mynewt-documentation/versions/*/mynewt-documentation/docs/themes/mynewt/versions.html``
  * Make sure the 'selected' flag is correct for the archived version

* Make a versions/vX_Y_Z directory
* Copy mynewt-documentation/* (except versions!) into versions/vX_Y_Z/mynewt-documentation
* Copy the mynewt-core repo into versions/vX_Y_Z/mynewt-core
* Repeat for other mynewt-* repos with doxygen docs and a /docs folder
* Update the version fields in

  * ``docs/conf.py``
  * and ``versions/vX_Y_Z/mynewt-documentation/docs/conf.py``

* Add a warning that this is not the most recent documentation to:

  * mynewt-documentation/versions/vX_Y_Z/mynewt-documentation/docs/themes/mynewt/layout.html
  * see an existing older version for example

To preview the changes:

.. code-block:: bash

  cd mynewt-documentation/versions/vX_Y_Z/mynewt-documentation
  make clean && make docs && (cd _build/html && python -m SimpleHTTPServer 8080)

.. _Apache Mynewt: https://mynewt.apache.org/
.. _Sphinx: http://www.sphinx-doc.org/
.. _Doxygen: http://www.doxygen.org/
.. _Homebrew: http://brew.sh/
.. _Pip: https://pip.readthedocs.io/en/stable/installing/
.. _Breathe: http://breathe.readthedocs.io/en/latest/
.. _Site Docs: https://github.com/apache/mynewt-site#deploying-the-latest-docs
