INTRODUCTION The Sphinx documentation system uses the fully installed Python tree to build a set of documents (generally in HTML). In GNU Radio, the documentation system is done through Doxygen in the public header (/include/foo.h) files. Doxygen first builds its documentation files, then the swig_docs program uses Doxygen's XML output and smashed the documentation from each header file into the SWIG'd Python block. Basically, using a single documentation markup, Doxygen, we expose the documentation strings in both the Doxygen-built manual and within the Python blocks themselves. Sphinx takes this process one step farther by reading the docstrings of all Python blocks and creating its own manual. This has two benefits. First, the Sphinx documentation looks nice and is formatted in such a way that Python users of GNU Radio can easy see the module structure and hierarchy. It also not only takes the Doxygen documentation from C++, but it also allows us to take any Python files and include their documentation. The end result is two manuals: one for Python and one for C++ users without having to duplicate comments, markup, or documentation. BUILDING THE SPHINX MANUAL Building the Sphinx docs takes some manual intervention as it requires GNU Radio to already be installed. So first follow the steps to build and install GNU Radio. In the build directory, a helper file is created called run_sphinx_build.sh. This is a Linux shell script that runs the sphinx-build command with all of the normal settings and important directories preloaded. For non Linux systems, it should be easy to pull out the executable and options to run it by hand. The run_sphinx_build.sh outputs the manual into $builddir/docs/sphinx/sphinx_out. Open up the index.html file in a browser to view it. ADDING NEW CONTENT TO THE SPHINX MANUAL Although the content of the sphinx manual is automatically generated, new blocks are not automatically added to the generated documentation. The procedure for adding new content is best illustrated with two examples. 1) Adding a new C++ signal processing block gnuradio.gr.myslicer Edit file gnuradio/docs/sphinx/source/gr/index.rst and add the line > gnuradio.gr.myslicer under the "Slicing and Dicing Streams" subheading. Edit file gnuradio/docs/sphinx/source/gr/slicedice_blk.rst and add the line >.. autooldblock:: gnuradio.gr.myslicer 2) Adding a new python hierarchical block gnuradio.digital.mymod Edit file gnruadio/docs/sphinx/source/digital/index.rst and add the line > gnuradio.digital.mymod under the "Signal Processing Blocks" subheading. Edit file gnuradio/docs/sphinx/source/digital/blocks.rst and add the line >.. autopyblock:: gnuradio.digital.mymod Notice that the 'autopyblock' directive is used rather than the 'autoblock' directive. This lets sphinx know that it is displaying a python hierarchical signal processing block so that it can format it appropriately. The process for documenting objects that are not signal processing blocks is similar but rather than using the 'autooldblock', and 'autopyblock' directives the standard sphinx directives such as 'autofunction' and 'autoclass' can be used. Finally for signal processing blocks using the 3.7 style the directive 'autoblock' rather than 'autooldblock' can be used.