Note
This how-to guide is yet not complete.
BASIS supports two well-known and established documentation generation tools: Doxygen and Sphinx.
When you use the basisproject tool to generate a project as described in
Create/Modify a Project, you will have a tree with a /doc
directory preconfigured to generate a starter documentation website and PDF
just like the BASIS website.
Here is how to create a new project that supports documentation:
basisproject --name docProject --description "This is a BASIS project." --full
We will assume that you ran this command in your ~/
directory for simplicity in the steps below.
Now you can simply open the ~/docProject/doc/*.rst files and start editing
the existing  reStructuredText files to create your Sphinx documentation.
You can also update your
doxygen mainpage
by opening ~/docProject/doc/apidoc/apidoc.dox.
We also suggest taking a look at the /doc folder of the BASIS source code
itself for more examples of how to write documentation.
Once you have the project ready the docs can be generated.
mkdir ~/docProject-build
cd ~/docProject-build
cmake ../docProject -DBUILD_DOCUMENTATION=ON -DCMAKE_INSTALL_PREFIX=~/docProject-install
make doc
make install
The web documentation will be in ~/docProject-install/doc/html/index.html,
and the PDF docs will be in ~/docProject-install/doc/docProject_Software_Manual.pdf.
Note that simply opening the documentation will not render all pages correctly due to the use of the iframe HTML tag to embed the Doxygen generated API docs and the security settings built into modern browsers. Instead, display your docs via a server, for example, using Python by running the following command in the root directory of the (installed) documentation.
Python 2:
python -m SimpleHTTPServer
Python 3:
python -m http.server
Then go to localhost:8000 to view the pages.
Since version 1.8.0, Doxygen can natively generate documentation from
The markup language used to format documentation comments was originally a set of commands inherited from Javadoc. Recently Doxygen also adopted Markdown and elements from Markdown Extra.
To extend the reportoire of programming languages processed by Doxygen, so-called custom Doxygen filters can be provided which transform any source code into the syntax of one of the languages well understood by Doxygen. The target language used is commonly C/C++ as this is the language best understood by Doxygen.
BASIS includes Doxygen filters for:
The basis_add_doxygen_doc() CMake command can be used to create your own custom doxygen documentation.
BASIS makes use of Sphinx for the alternative documentation generation from Python source code and corresponding doc strings. The markup language used by Sphinx is reStructuredText (reST).
Sphinx Documentation has the advantages of being able to be produced in many different formats, and it can be used inline in Python code, and producing documentation in a much more usable layout. However, it cannot generate documentaiton from inline code for C++ in the way that doxygen can.
Sphinx and restructured text allow documentation to be generated in a wide number of useful formats, including:
These can be used to produce:
This is accomplished by providing text files marked up using reST which are then processed by Sphinx to generate documentation in the desired output format.
BASIS includes two Sphinx extensions breathe and doxylink which are included with BASIS can be used to include, respectively, link to the the documentation generated by Doxygen from the documentation generated by Sphinx. The latter only for the HTML output, which, however, is the most commonly used and preferred output format. Given that the project web site and manuals are generated by Sphinx and only the more advanced reference documentation is generated by Doxygen, this one directional linking of documentation pages is sufficient for most use cases. Currently BASIS uses doxylink because it is able to work with more complete and better organized output than breathe can handle as of the time of writing.
A number of Sphinx themes are provided with BASIS, and the recommended default theme is readable-wide that is used by the BASIS website.
You can also use your own theme from the web or include it yourself by simply providing a path to the theme using the HTML_THEME parameter of basis_add_doc() and basis_add_sphinx_doc().
Markdown, GitHub flavored Markdown and Markdown Extra can be used for the root package documentation files such as the AUTHORS.md, README.md, INSTALL.md, and COPYING.md files. Many online hosting platforms for the distribution of open source software such as SourceForge and GitHub render markdown on the project page with the marked up formatting.
Note
Not all of these documentation tools are supported for all languages.
The best example for creating documenation is the BASIS documentation itself,
which can be found in the doc/apidoc folder. The most important function
for generating documentation is basis_add_doc(), which can handle
the parameters of the related basis_add_sphinx_doc() and
basis_add_doxygen_doc() commands.
Here is the code that generates the integrated Sphinx and Doxygen Documentation:
# ============================================================================
# Copyright (c) 2011-2012 University of Pennsylvania
# Copyright (c) 2013-2014 Carnegie Mellon University
# Copyright (c) 2013-2016 Andreas Schuh
# All rights reserved.
#
# See COPYING file for license information or visit
# https://cmake-basis.github.io/download.html#license
# ============================================================================
##############################################################################
# @file  CMakeLists.txt
# @brief Build configuration of software documentation.
#
# This build configuration builds and/or installs the documentation of the
# software package. The documentation can be divided into user documentation
# (e.g., software manual) and developer documentation (e.g., developer's guide).
# For developers, both those using a library provided by this package and the
# package maintainers, the documentation of the API is of particular interest.
# Developers who are responsible for maintaining this software may be provided
# with even more detailed documentation of the implementation in the so-called
# developer's guide.
#
# See the basis_add_doc() command for details on the documentation build tools
# supported by BASIS for the generation of documentation from plain text files
# and in-source code comments.
##############################################################################
# ============================================================================
# generic targets
# ============================================================================
# create custom targets so "make site" and "make manual" always work
# note that the "doc" target is added automatically which will trigger
# the build of the complete documentation unless the EXCLUDE_FROM_ALL
# option is passed to basis_add_doc
basis_add_custom_target (site)   # build HTML pages
basis_add_custom_target (manual) # build PDF manual
# ============================================================================
# API reference (in-source code comments)
# ============================================================================
basis_find_package(Doxygen REQUIRED)
# replace < year|contact|copyright|license > pattern in template file which
# shall be included in documentation to avoid unrecognized xml/html tag warning
function (basis_sanitize_template_for_doxygen OUTPUT_FILE_VAR TEMPLATE_FILE)
  get_filename_component (TEMPLATE_NAME "${TEMPLATE_FILE}" NAME)
  file (READ "${TEMPLATE_FILE}" TEMPLATE)
  string (REGEX REPLACE "<year>"      "<year>"      TEMPLATE "${TEMPLATE}")
  string (REGEX REPLACE "<contact>"   "<contact>"   TEMPLATE "${TEMPLATE}")
  string (REGEX REPLACE "<copyright>" "<copyright>" TEMPLATE "${TEMPLATE}")
  string (REGEX REPLACE "<license>"   "<license>"   TEMPLATE "${TEMPLATE}")
  set (OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TEMPLATE_NAME}")
  file (WRITE "${OUTPUT_FILE}" "${TEMPLATE}")
  set (${OUTPUT_FILE_VAR} "${OUTPUT_FILE}" PARENT_SCOPE)
endfunction ()
set (BASIS_TEMPLATE_DIR "${PROJECT_TOOLS_DIR}/basisproject/templates/basis")
basis_sanitize_template_for_doxygen (DEPENDS_MODULE   "${BASIS_TEMPLATE_DIR}/1.0/config/Depends.cmake")
basis_sanitize_template_for_doxygen (BOOTSTRAP_MODULE "${BASIS_TEMPLATE_DIR}/1.1/BasisBootstrapping.cmake")
basis_add_doc (
  apidoc 
  GENERATOR             Doxygen
  INPUT                 "${DEPENDS_MODULE}" "${BOOTSTRAP_MODULE}"
  EXCLUDE_PATTERNS      # External libraries packaged with BASIS to exclude from final documentation
                        "*/gmock/*"            # Google Mock
                        "*/gtest/*"            # Google Test
                        "*/tclap/*"            # TCLAP library
                        "*/breathe/*"          # Sphinx extension
                        "*/doxylink/*"         # Sphinx extension
                        "*/argh/*"             # Python Argh
                        "*/test.cxx"           # Google Mock and Test
                        "*/test_main.cxx"      # main() of unit tests based on GMock
                        "*/testdriver.cxx"     # testdriver which includes *.inc files
  HTML_DESTINATION      "${INSTALL_DOC_DIR}/html/apidoc/latest"
  HTML_HEADER	          "apidoc/doxygen_header.html.in"
  HTML_FOOTER           "apidoc/doxygen_footer.html.in"
  HTML_EXTRA_STYLESHEET "apidoc/doxygen_extra.css.in"
  OUTPUT                html xml
)
# ============================================================================
# software manual
# ============================================================================
# add build target for the generation of the web pages and PDF manual
# from the same set of reStructuredText input source files
basis_set_if_not_set (BUILD_SOFTWAREMANUAL ON)
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/manual.rst" AND
    EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/sidebar.rst" AND
    BUILD_SOFTWAREMANUAL)
  basis_find_package (Sphinx REQUIRED COMPONENTS build)
  basis_find_package (LATEX  REQUIRED COMPONENTS PDFLATEX)
 
  # software manual output formats
  set (SOFTWAREMANUAl_BUILDER html pdf)
  if (UNIX)
    list (APPEND SOFTWAREMANUAL_BUILDER man)
  endif ()
  # add target to build software manual
  basis_add_doc (
    softwaremanual                                        # documenation build target name
    GENERATOR        Sphinx                               # select Sphinx as the generator
    BUILDER          ${SOFTWAREMANUAl_BUILDER}            # selected Sphinx output formats
    MAN_SECTION      7                                    # http://en.wikipedia.org/wiki/Man_page#Manual_sections
    HTML_THEME       cmake-basis                          # select the Sphinx layout theme
    HTML_LOGO        logo_title.svg                       # logo to use at heading of documentation
    HTML_FAVICON     favicon.ico                          # icon for bookmark and tab title
    HTML_SIDEBARS    searchbox globaltoc links            # sidebar options to use
    HTML_DESTINATION "${INSTALL_DOC_DIR}/html"            # output directory for completed documentation
    SIDEBARWIDTH     300                                  # sidebar width in pixels
    MASTER_DOC       "sidebar"                            # .rst file to start with when generating HTML
    LATEX_MASTER_DOC "manual"                             # .rst file to start with when generating LaTeX/PDF
    LATEX_TITLE      "${PROJECT_NAME} Software Manual"    # title within LaTeX/PDF documents
    OUTPUT_NAME      "${PROJECT_NAME}_Software_Manual"    # general output file name, e.g., LaTeX/PDF files
    DOXYLINK         apidoc                               # Doxygen generator build target for integrated API reference
    DOXYLINK_URL     "${PROJECT_WEBSITE}/apidoc/latest"   # location of Doxygen output files
    NO_HTML_MODINDEX NO_HTML_INDEX                        # disable currently unused index page
    EXCLUDE_PATTERN  intro.rst                            # .rst files which are included by other .rst
    EXCLUDE_PATTERN  faq.rst                              # each pattern must be preceeded by EXCLUDE_PATTERN
    EXCLUDE_PATTERN  features.rst
  )
  # PDF manual required for build of HTML download page
  #
  # Note that the Sphinx :download: link directive requires the download file
  # to be present in the source tree; thus copy generated PDF to source tree
  add_custom_command (TARGET softwaremanual_pdf POST_BUILD
    COMMAND "${CMAKE_COMMAND}" -E copy_if_different
      "${CMAKE_CURRENT_BINARY_DIR}/latex/${PROJECT_NAME}_Software_Manual.pdf" 
      "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}_Software_Manual.pdf"
  )
  basis_add_dependencies (softwaremanual_html softwaremanual_pdf)
  # add dependency to more readable target names
  basis_add_dependencies (manual softwaremanual_pdf)
  basis_add_dependencies (site   softwaremanual_html)
endif ()
Introduces users to software tools and guides them through example application.
Describes implementation details.
Documentation generated from source code and in-source comments, integrated with default template.
A web site can be created using the documentation generation tool Sphinx.
The main input to this tool are text files written in the lightweight markup language
reStructuredText. A default theme for use at SBIA has been created which is part
of BASIS. This theme together with the text files that define the content and
structure of the site, the HTML pages of the software web site can be generated
by sphinx-build. The CMake function basis_add_doc() provides an easy way
to add such web site target to the build configuration. For example, the
template doc/CMakeLists.txt file contains the following section:
# ----------------------------------------------------------------------------
# web site (optional)
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/site/index.rst")
  basis_add_doc (
    site
    GENERATOR     Sphinx
    BUILDER       html dirhtml pdf man
    MAN_SECTION   7
    HTML_THEME    readable-wide
    HTML_SIDEBARS globaltoc
    RELLINKS      installation documentation publications people
    COPYRIGHT     "<year> University of Pennsylvania"
    AUTHOR        "<author>"
  )
endif ()
where <year> and <author> should be replaced by the proper values. This is usually done by the basisproject command-line tool upon creation of a new project.
This CMake code adds a build target named site which invokes sphinx-build
with the proper default configuration to generate a web site from the reST
source files with file name extension .rst found in the site/ subdirectory.
The source file of the main page, the so-called master document, of the web site
must be named index.rst. The main pages which are linked in the top
navigation bar are named using the RELLINKS option of basis_add_sphinx_doc(),
the CMake function which implements the addition of a Sphinx documentation target.
The corresponding source files must be named after these links. For example, given
above CMake code, the reStructuredText source of the page with the download
instructions has to be saved in the file site/download.rst.
See the corresponding section of the Installation
guide for details on how to generate the HTML pages from the reST source
files given the specification of a Sphinx documentation build target such as the
site target defined by above template CMake code.