14bcd95a3SBarry Smith# Developing PETSc Documentation 24bcd95a3SBarry Smith 34bcd95a3SBarry Smith```{toctree} 44bcd95a3SBarry Smith:maxdepth: 2 54bcd95a3SBarry Smith``` 64bcd95a3SBarry Smith 74bcd95a3SBarry Smith## General Guidelines 84bcd95a3SBarry Smith 94bcd95a3SBarry Smith- Good documentation should be like a bonsai tree: alive, on display, frequently tended, and as small as possible (adapted from [these best practices](https://github.com/google/styleguide/blob/gh-pages/docguide/best_practices.md)). 104bcd95a3SBarry Smith- Wrong, irrelevant, or confusing documentation is worse than no documentation. 114bcd95a3SBarry Smith 124bcd95a3SBarry Smith(sphinx_documentation)= 134bcd95a3SBarry Smith 144bcd95a3SBarry Smith## Documentation with Sphinx 154bcd95a3SBarry Smith 164bcd95a3SBarry SmithWe use [Sphinx](https://www.sphinx-doc.org/en/master/) to build our web pages and documentation. Most content is written using [reStructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html), a simple markup language. 174bcd95a3SBarry Smith 184bcd95a3SBarry Smith[These slides](https://gitlab.com/psanan/petsc-sphinx-slides) contain an overview of Sphinx and how we use(d) it, as of October 2020. 194bcd95a3SBarry Smith 204bcd95a3SBarry Smith(sec_local_html_docs)= 214bcd95a3SBarry Smith 224bcd95a3SBarry Smith### Building the HTML docs locally 234bcd95a3SBarry Smith 244bcd95a3SBarry SmithWe use a [Python 3 virtual environment](https://docs.python.org/3/tutorial/venv.html) to build the documentation since not all developers can trivially install the needed Python modules directly. 254bcd95a3SBarry Smith 264bcd95a3SBarry Smith```console 274bcd95a3SBarry Smith$ cd $PETSC_DIR 284bcd95a3SBarry Smith$ make docs 294bcd95a3SBarry Smith$ open doc/_build/html/index.html # in a browser 304bcd95a3SBarry Smith``` 314bcd95a3SBarry Smith 324bcd95a3SBarry Smithor 334bcd95a3SBarry Smith 344bcd95a3SBarry Smith```console 354bcd95a3SBarry Smith$ cd $PETSC_DIR/doc 364bcd95a3SBarry Smith$ make sphinxhtml 374bcd95a3SBarry Smith$ open _build/html/index.html 384bcd95a3SBarry Smith``` 394bcd95a3SBarry Smith 404bcd95a3SBarry Smith(sec_local_docs_latex)= 414bcd95a3SBarry Smith 424bcd95a3SBarry Smith### Building the manual locally as a PDF via LaTeX 434bcd95a3SBarry Smith 444bcd95a3SBarry Smith:::{admonition} Note 454bcd95a3SBarry SmithBefore following these instructions, you need to have a working 464bcd95a3SBarry Smithlocal LaTeX installation and the ability to install additional packages, 474bcd95a3SBarry Smithif need be, to resolve LaTeX errors. 484bcd95a3SBarry Smith::: 494bcd95a3SBarry Smith 504bcd95a3SBarry SmithSet up your local Python environment (e.g., ref:`as above <sec_local_html_docs>`), then 514bcd95a3SBarry Smith 524bcd95a3SBarry Smith```console 534bcd95a3SBarry Smith$ cd doc 544bcd95a3SBarry Smith$ make sphinxpdf 554bcd95a3SBarry Smith$ open _build/latex/manual.pdf # in PDF viewer 564bcd95a3SBarry Smith``` 574bcd95a3SBarry Smith 584bcd95a3SBarry Smith(sphinx_guidelines)= 594bcd95a3SBarry Smith 604bcd95a3SBarry Smith### Sphinx Documentation Guidelines 614bcd95a3SBarry Smith 624bcd95a3SBarry SmithRefer to Sphinx's [own documentation](https://https://www.sphinx-doc.org) for general information on how to use Sphinx, and note the following additional guidelines. 634bcd95a3SBarry Smith 644bcd95a3SBarry Smith- Use the [literalinclude directive](https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-literalinclude) to directly include pieces of source code. Use a path beginning with `/`, relative to the root for the Sphinx docs (where `conf.py` is found). 654bcd95a3SBarry Smith 664bcd95a3SBarry Smith ```rst 674bcd95a3SBarry Smith .. literalinclude:: /../src/sys/error/err.c 684bcd95a3SBarry Smith :start-at: PetscErrorCode PetscError( 694bcd95a3SBarry Smith :end-at: PetscFunctionReturn(PETSC_SUCCESS) 704bcd95a3SBarry Smith :append: } 714bcd95a3SBarry Smith ``` 724bcd95a3SBarry Smith 734bcd95a3SBarry Smith For robustness to changes in the source files, Use `:start-at:` and related options when possible, noting that you can also use (positive) values of `:lines:` relative to this. Use the `:language:` option to appropriately highlight languages other than C. 744bcd95a3SBarry Smith 754bcd95a3SBarry Smith- Any invocable command line statements longer than a few words should be in 764bcd95a3SBarry Smith `.. code-block::` sections. Double backticks must enclose any such statements not in code-block statements"\`\`". For example `make all` is acceptable but 774bcd95a3SBarry Smith 784bcd95a3SBarry Smith ```console 794bcd95a3SBarry Smith $ make PETSC_DIR=/my/path/to/petsc PETSC_ARCH=my-petsc-arch all 804bcd95a3SBarry Smith ``` 814bcd95a3SBarry Smith 824bcd95a3SBarry Smith should be in a `.. code-block::`. 834bcd95a3SBarry Smith 844bcd95a3SBarry Smith- All code blocks showing command line invocation must use the "console" block 854bcd95a3SBarry Smith directive. E.g. 864bcd95a3SBarry Smith 874bcd95a3SBarry Smith ```rst 884bcd95a3SBarry Smith .. code-block:: console 894bcd95a3SBarry Smith 904bcd95a3SBarry Smith $ cd $PETSC_DIR/src/snes/interface 914bcd95a3SBarry Smith $ ./someprog 924bcd95a3SBarry Smith output1 934bcd95a3SBarry Smith output2 944bcd95a3SBarry Smith ``` 954bcd95a3SBarry Smith 964bcd95a3SBarry Smith The only exception to this is when displaying raw output, i.e., with no preceding 974bcd95a3SBarry Smith commands. Then one may use just the "::" directive to improve visibility, e.g., 984bcd95a3SBarry Smith 994bcd95a3SBarry Smith ```rst 1004bcd95a3SBarry Smith :: 1014bcd95a3SBarry Smith 1024bcd95a3SBarry Smith output1 1034bcd95a3SBarry Smith output2 1044bcd95a3SBarry Smith ``` 1054bcd95a3SBarry Smith 1064bcd95a3SBarry Smith- Any code blocks that show command line invocations must be preceded by `$`, e.g. 1074bcd95a3SBarry Smith 1084bcd95a3SBarry Smith ```rst 1094bcd95a3SBarry Smith .. code-block:: console 1104bcd95a3SBarry Smith 1114bcd95a3SBarry Smith $ ./configure --some-args 1124bcd95a3SBarry Smith $ make libs 1134bcd95a3SBarry Smith $ make ./ex1 1144bcd95a3SBarry Smith $ ./ex1 --some-args 1154bcd95a3SBarry Smith ``` 1164bcd95a3SBarry Smith 1174bcd95a3SBarry Smith- Environment variables such as `$PETSC_DIR` or `$PATH` must be preceded by 1184bcd95a3SBarry Smith `$` and be enclosed in double backticks, e.g. 1194bcd95a3SBarry Smith 1204bcd95a3SBarry Smith ```rst 1214bcd95a3SBarry Smith Set ``$PETSC_DIR`` and ``$PETSC_ARCH`` 1224bcd95a3SBarry Smith ``` 1234bcd95a3SBarry Smith 1244bcd95a3SBarry Smith- For internal links, use explicit labels, e.g 1254bcd95a3SBarry Smith 1264bcd95a3SBarry Smith ```rst 1274bcd95a3SBarry Smith .. _sec_short_name: 1284bcd95a3SBarry Smith 1294bcd95a3SBarry Smith Section name 1304bcd95a3SBarry Smith ============ 1314bcd95a3SBarry Smith ``` 1324bcd95a3SBarry Smith 1334bcd95a3SBarry Smith and elsewhere (in any document), 1344bcd95a3SBarry Smith 1354bcd95a3SBarry Smith ```rst 1364bcd95a3SBarry Smith See :ref:`link text <sec_short_name>` 1374bcd95a3SBarry Smith ``` 1384bcd95a3SBarry Smith 1394bcd95a3SBarry Smith- For internal links in the manual with targets outside the manual, always provide alt text 1404bcd95a3SBarry Smith so that the text will be properly formatted in the {ref}`standalone PDF manual <sec_local_docs_latex>`, e.g. 1414bcd95a3SBarry Smith 1424bcd95a3SBarry Smith > ```rst 1434bcd95a3SBarry Smith > PETSc has :doc:`mailing lists </community/mailing>`. 1444bcd95a3SBarry Smith > ``` 1454bcd95a3SBarry Smith 1464bcd95a3SBarry Smith- We use the [sphinxcontrib-bibtex extension](https://sphinxcontrib-bibtex.readthedocs.io/en/latest/) 1474bcd95a3SBarry Smith to include citations from BibTeX files. 1484bcd95a3SBarry Smith You must include `.. bibliography::` blocks at the bottom of a page, including citations ([example](https://gitlab.com/petsc/petsc/-/raw/main/doc/manual/ksp.rst)). 1494bcd95a3SBarry Smith To cite the same reference on more than one page, use [this workaround](https://sphinxcontrib-bibtex.readthedocs.io/en/latest/usage.html#key-prefixing) on one of them ([example](https://gitlab.com/petsc/petsc/-/raw/main/doc/developers/articles.rst)) [^bibtex-footnote]. 1504bcd95a3SBarry Smith 1514bcd95a3SBarry Smith- See special instructions on {any}`docs_images`. 1524bcd95a3SBarry Smith 1534bcd95a3SBarry Smith- Prefer formatting styles that are easy to modify and maintain. In particular, the use of [list-table](https://docutils.sourceforge.io/docs/ref/rst/directives.html#list-table) is recommended. 1544bcd95a3SBarry Smith 1554bcd95a3SBarry Smith- When using external links with inline URLs, prefer to use [anonymous hyperlink references](https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#anonymous-hyperlinks) with two trailing underscores, e.g. 1564bcd95a3SBarry Smith 1574bcd95a3SBarry Smith ```rst 1584bcd95a3SBarry Smith `link text <https://external.org>`__ 1594bcd95a3SBarry Smith ``` 1604bcd95a3SBarry Smith 1614bcd95a3SBarry Smith- To pluralize something with inline markup, e.g. `DM`s, escape the trailing character to avoid `WARNING: Inline literal start-string without end-string`. 1624bcd95a3SBarry Smith 1634bcd95a3SBarry Smith ```rst 1644bcd95a3SBarry Smith ``DM``\s 1654bcd95a3SBarry Smith ``` 1664bcd95a3SBarry Smith 1674bcd95a3SBarry Smith- Use restraint in adding new Sphinx extensions, in particular, those which aren't 1684bcd95a3SBarry Smith widely used and well-supported, or those with hidden system dependencies. 1694bcd95a3SBarry Smith 1704bcd95a3SBarry Smith(petsc_repositories)= 1714bcd95a3SBarry Smith 1724bcd95a3SBarry Smith## Other PETSc repositories 1734bcd95a3SBarry Smith 174c3bbc914SBarry SmithIn addition to the [PETSc repository](https://gitlab.com/petsc/petsc), there are three other PETSc repositories which contain large data 175c3bbc914SBarry Smithfiles that are unnecessary for most PETSc usages and thus are not stored in the main repository. 176c3bbc914SBarry Smith 177c3bbc914SBarry Smith- [Images](https://gitlab.com/petsc/images) contains images that are used in the PETSc documentation or have other uses. See {any}`docs_images` 178c3bbc914SBarry Smith for details on its use. 179c3bbc914SBarry Smith- [Annual-Meetings](https://gitlab.com/petsc/annual-meetings) contains various documents from the {any}`meetings`. See {any}`docs_meetings`. 180c3bbc914SBarry Smith- [Datafiles](https://gitlab.com/petsc/datafiles) contains large matrices, meshes, and various other data files that 181c3bbc914SBarry Smith are used in the {any}`PETSc CI<test_harness_data>`. 182*f2cd86d6SBarry Smith- [Tutorials]((https://gitlab.com/petsc/annual-meetings) contains slides from {any}`tutorials`. See {any}`docs_tutorials`. 183c3bbc914SBarry Smith 184c3bbc914SBarry SmithOther repositories containing software PETSc uses are located at [GitLab](https://gitlab.com/petsc/) 185c3bbc914SBarry Smithand [BitBucket](https://bitbucket.org/petsc/workspace/repositories). The BitBucket location is used for historical reasons, 186c3bbc914SBarry Smiththere are many links on the web to these locations thus the repositories have not been migrated to GitLab. 1874bcd95a3SBarry Smith 1884bcd95a3SBarry Smith(docs_images)= 1894bcd95a3SBarry Smith 1904bcd95a3SBarry Smith## Images 1914bcd95a3SBarry Smith 1924bcd95a3SBarry SmithPETSc's documentation is tightly coupled to the source code and tests and 1934bcd95a3SBarry Smithis tracked in the primary PETSc Git repository. However, image files are 194c3bbc914SBarry Smithtoo large to track directly this way (especially because they persist in the integration branches' histories). Thus we do not put images 195c3bbc914SBarry Smithinto the PETSc git repository. 1964bcd95a3SBarry Smith 197c3bbc914SBarry SmithTherefore, we store image files in a separate Git repository, [Images](https://gitlab.com/petsc/petsc). This repository is automatically cloned 198c3bbc914SBarry Smith(if not already available) and updated when building the documentation. It can also be cloned by running 1994bcd95a3SBarry Smith`make images` in the `doc/` directory. 2004bcd95a3SBarry SmithAny new images required must be added to the currently-used branch of this repository. 2014bcd95a3SBarry Smith 2024bcd95a3SBarry Smith### Image Guidelines 2034bcd95a3SBarry Smith 2044bcd95a3SBarry Smith- Whenever possible, use SVG files. SVG is a web-friendly vector format and will be automatically converted to PDF using `rsvg-convert` [^svg-footnote] 2054bcd95a3SBarry Smith- Avoid large files and large numbers of images. 2064bcd95a3SBarry Smith- Do not add movies or other non-image files. 2074bcd95a3SBarry Smith 2084bcd95a3SBarry Smith### Adding new images 2094bcd95a3SBarry Smith 2104bcd95a3SBarry Smith- Decide where in `doc/images` a new image should go. Use the structure of the `doc/` tree as a guide. 2114bcd95a3SBarry Smith- Create a Merge Request to the currently-used branch of the upstream images repository, adding this image [^maintainer-fast-image-footnote]. 212c3bbc914SBarry Smith- Once this Merge Request is merged, you may make a MR on the main PETSc Git repository relying on the new image(s). 2134bcd95a3SBarry Smith 2144bcd95a3SBarry SmithIt may be helpful to place working copies of the new image(s) in your local `doc/images` 2154bcd95a3SBarry Smithwhile iterating on documentation; don't forget to update the upstream images repository. 2164bcd95a3SBarry Smith 2174bcd95a3SBarry Smith### Removing, renaming, moving, or updating images 2184bcd95a3SBarry Smith 2194bcd95a3SBarry SmithDo not directly move, rename, or update images in the images repository. 2204bcd95a3SBarry SmithSimply add a logically-numbered new version of the image. 2214bcd95a3SBarry Smith 2224bcd95a3SBarry SmithIf an image is not used in *any* {any}`integration branch <sec_integration_branches>` (`main` or `release`), 2234bcd95a3SBarry Smithadd it to the top-level list of files to delete in the images repository. 2244bcd95a3SBarry Smith 2254bcd95a3SBarry Smith(docs_images_cleanup)= 2264bcd95a3SBarry Smith 2274bcd95a3SBarry Smith### Cleaning up the images repository (maintainers only) 2284bcd95a3SBarry Smith 2294bcd95a3SBarry SmithIf the size of the image repository grows too large, 2304bcd95a3SBarry Smith 2314bcd95a3SBarry Smith- Create a new branch `main-X`, where `X` increments the current value 2324bcd95a3SBarry Smith- Create a new commit deleting all files in the to-delete list and clearing the list 2334bcd95a3SBarry Smith- Reset the new `main-X` to a single commit with this new, cleaned-up state 2344bcd95a3SBarry Smith- Set `main-X` as the "default" branch on GitLab. 2354bcd95a3SBarry Smith- Update both `release` and `main` in the primary PETSc repository to clone this new branch 2364bcd95a3SBarry Smith 237c3bbc914SBarry Smith(docs_meetings)= 238c3bbc914SBarry Smith 239c3bbc914SBarry Smith## Annual meetings website 240c3bbc914SBarry Smith 241c3bbc914SBarry SmithLike {any}`docs_images` the material (slides, etc.) for the PETSc annual meetings is too large to store in the primary PETSc Git repository. 242c3bbc914SBarry SmithIt is stored in [Annual-Meetings](https://gitlab.com/petsc/annual-meetings) repository and linked from {any}`meetings`. 243c3bbc914SBarry Smith 244c3bbc914SBarry SmithThe files are all in the public directory of the repository so that the `.gitlab-ci.yml` file for the repository 245c3bbc914SBarry Smithautomatically displays all the files at https://petsc.gitlab.io/annual-meetings. Thus, all one needs to do is add files into 246c3bbc914SBarry Smith[Annual-Meetings](https://gitlab.com/petsc/annual-meetings) and provide appropriate links within that repository or from {any}`meetings` 247c3bbc914SBarry Smithin the primary PETSc Git repository. 248c3bbc914SBarry Smith 249*f2cd86d6SBarry Smith(docs_tutorials)= 250*f2cd86d6SBarry Smith 251*f2cd86d6SBarry Smith## Tutorials website 252*f2cd86d6SBarry Smith 253*f2cd86d6SBarry SmithLike {any}`docs_meetings` the material (slides, etc.) for the PETSc tutorials is too large to store in the primary PETSc Git repository. 254*f2cd86d6SBarry SmithIt is stored in [Tutorials](https://gitlab.com/petsc/tutorials) repository and linked from {any}`tutorials`. 255*f2cd86d6SBarry Smith 256*f2cd86d6SBarry SmithThe files are all in the public directory of the repository so that the `.gitlab-ci.yml` file for the repository 257*f2cd86d6SBarry Smithautomatically displays all the files at https://petsc.gitlab.io/tutorials. Thus, all one needs to do is add files into 258*f2cd86d6SBarry Smith[Tutorials](https://gitlab.com/petsc/tutorials) and provide appropriate links within that repository or from {any}`tutorials` 259*f2cd86d6SBarry Smithin the primary PETSc Git repository. 260c3bbc914SBarry Smith 2614bcd95a3SBarry Smith(manpages_c2html_build)= 2624bcd95a3SBarry Smith 2634bcd95a3SBarry Smith## Building Manual Pages and C2HTML Files 2644bcd95a3SBarry Smith 2654bcd95a3SBarry SmithThe manual pages and C2HTML-generated file as built in a process described below using the documentation tools listed below, which are 2664bcd95a3SBarry Smithautomatically downloaded and installed if needed while building the PETSc documentation./ 2674bcd95a3SBarry Smith 2684bcd95a3SBarry Smith- [Sowing](https://bitbucket.org/petsc/pkg-sowing): Developed by Bill Gropp, this produces the PETSc manual pages; see the [Sowing documentation](http://wgropp.cs.illinois.edu/projects/software/sowing/doctext/doctext.htm) and {ref}`manual_page_format`. 2694bcd95a3SBarry Smith- [C2html](https://gitlab.com/petsc/pkg-c2html): This generates the HTML versions of all the source code. 2704bcd95a3SBarry Smith 2714bcd95a3SBarry SmithSowing and C2html are build tools that do not use the compilers specified to PETSc's `configure`, as they 2724bcd95a3SBarry Smithneed to work in cross-compilation environments. Thus, they default to using `gcc`, `g++`, and `flex` from 2734bcd95a3SBarry Smiththe user's environment (or `configure` options like `--download-sowing-cxx`). Microsoft Windows users must install `gcc` 2744bcd95a3SBarry Smithetc., from Cygwin in order to be able to build the documentation. 2754bcd95a3SBarry Smith 2764bcd95a3SBarry Smith```{rubric} Footnotes 2774bcd95a3SBarry Smith``` 2784bcd95a3SBarry Smith 2794bcd95a3SBarry Smith[^bibtex-footnote]: The extensions's [development branch](https://github.com/mcmtroffaes/sphinxcontrib-bibtex) [supports our use case better](https://github.com/mcmtroffaes/sphinxcontrib-bibtex/pull/185) (`:footcite:`), which can be investigated if a release is ever made. This stuff is now in the main repository but does not work as advertised from .md files. 2804bcd95a3SBarry Smith 2814bcd95a3SBarry Smith[^svg-footnote]: `rsvg-convert` is installable with your package manager, e.g., `librsvg2-bin` on Debian/Ubuntu systems). 2824bcd95a3SBarry Smith 2834bcd95a3SBarry Smith[^maintainer-fast-image-footnote]: Maintainers may directly push commits. 284