xref: /petsc/doc/conf.py (revision 07cc1bcae9d0e9da7239f8f79d446c68948cdc99)
1ee12ae39SPatrick Sanan# Configuration file for the Sphinx documentation builder.
2ee12ae39SPatrick Sanan#
396b7068eSPatrick Sanan# For information on options, see
4ee12ae39SPatrick Sanan#   http://www.sphinx-doc.org/en/master/config
5ee12ae39SPatrick Sanan#
6862e4a30SBarry Smith# This file was generated by running "sphinx-quickstart" and then modified
796b7068eSPatrick Sanan
8ee12ae39SPatrick Sananimport os
9ee12ae39SPatrick Sananimport sys
10ee12ae39SPatrick Sananimport subprocess
11ee12ae39SPatrick Sananimport re
12ee12ae39SPatrick Sananimport datetime
13ee12ae39SPatrick Sanan
14ee12ae39SPatrick Sanansys.path.append(os.getcwd())
15ee12ae39SPatrick Sanansys.path.append(os.path.abspath('./ext'))
16ee12ae39SPatrick Sanan
1795216c61SPatrick Sananimport add_man_page_redirects
1802f5a9aaSPatrick Sananimport build_classic_docs
19c9f6b0acSPatrick Sananimport fix_man_page_edit_links
2002f5a9aaSPatrick Sananimport make_links_relative
215becb6a3SPatrick Sananimport update_htmlmap_links
2202f5a9aaSPatrick Sanan
2302f5a9aaSPatrick Sanan
24e6bab0d2SPatrick Sananif not os.path.isdir("images"):
25e6bab0d2SPatrick Sanan    print("-----------------------------------------------------------------------------")
26e6bab0d2SPatrick Sanan    print("ERROR")
27e6bab0d2SPatrick Sanan    print("images directory does not seem to exist.")
28e6bab0d2SPatrick Sanan    print("To clone the required repository, try")
29e6bab0d2SPatrick Sanan    print("   make images")
30e6bab0d2SPatrick Sanan    print("-----------------------------------------------------------------------------")
31e6bab0d2SPatrick Sanan    raise Exception("Aborting because images missing")
32e6bab0d2SPatrick Sanan
33e6bab0d2SPatrick Sanan
3496b7068eSPatrick Sanan# -- Project information -------------------------------------------------------
35ee12ae39SPatrick Sanan
36ee12ae39SPatrick Sananproject = 'PETSc'
37ee12ae39SPatrick Sanancopyright = '1991-%d, UChicago Argonne, LLC and the PETSc Development Team' % datetime.date.today().year
38ee12ae39SPatrick Sananauthor = 'The PETSc Development Team'
39ee12ae39SPatrick Sanan
40404447afSPatrick Sananwith open(os.path.join('..', 'include', 'petscversion.h'),'r') as version_file:
41ee12ae39SPatrick Sanan    buf = version_file.read()
42ee12ae39SPatrick Sanan    petsc_release_flag = re.search(' PETSC_VERSION_RELEASE[ ]*([0-9]*)',buf).group(1)
43ee12ae39SPatrick Sanan    major_version      = re.search(' PETSC_VERSION_MAJOR[ ]*([0-9]*)',buf).group(1)
44ee12ae39SPatrick Sanan    minor_version      = re.search(' PETSC_VERSION_MINOR[ ]*([0-9]*)',buf).group(1)
45ee12ae39SPatrick Sanan    subminor_version   = re.search(' PETSC_VERSION_SUBMINOR[ ]*([0-9]*)',buf).group(1)
46ee12ae39SPatrick Sanan
47ffebb2dfSPatrick Sanan    git_describe_version = subprocess.check_output(['git', 'describe', '--always']).strip().decode('utf-8')
48ee12ae39SPatrick Sanan    if petsc_release_flag == '0':
49ffebb2dfSPatrick Sanan        version = git_describe_version
50ffebb2dfSPatrick Sanan        release = git_describe_version
51ee12ae39SPatrick Sanan    else:
52ee12ae39SPatrick Sanan        version = '.'.join([major_version, minor_version])
53ee12ae39SPatrick Sanan        release = '.'.join([major_version,minor_version,subminor_version])
54ee12ae39SPatrick Sanan
55ee12ae39SPatrick Sanan
5696b7068eSPatrick Sanan# -- General configuration -----------------------------------------------------
5796b7068eSPatrick Sanan
5896b7068eSPatrick Sananneeds_sphinx='3.5'
5996b7068eSPatrick Sanannitpicky = True  # checks internal links. For external links, use "make linkcheck"
60ee12ae39SPatrick Sananmaster_doc = 'index'
61ee12ae39SPatrick Sanantemplates_path = ['_templates']
62589e537fSPatrick Sananexclude_patterns = ['_build*', 'images', 'Thumbs.db', '.DS_Store']
6396b7068eSPatrick Sananhighlight_language = 'c'
6496b7068eSPatrick Sanannumfig = True
65ee12ae39SPatrick Sanan
6696b7068eSPatrick Sanan# -- Extensions ----------------------------------------------------------------
67ee12ae39SPatrick Sanan
684b6f941bSPatrick Sananextensions = [
694b6f941bSPatrick Sanan    'sphinx_copybutton',
7099ed6026SPatrick Sanan    'sphinx_panels',
714b6f941bSPatrick Sanan    'sphinxcontrib.bibtex',
724b6f941bSPatrick Sanan    'sphinxcontrib.katex',
734b6f941bSPatrick Sanan    'sphinxcontrib.rsvgconverter',
748f2bcf5fSPatrick Sanan    'myst_parser',
754b6f941bSPatrick Sanan    'html5_petsc',
764707091fSPatrick Sanan    'sphinx_remove_toctrees',
774b6f941bSPatrick Sanan]
784b6f941bSPatrick Sanan
79f3c6b5cdSPatrick Sanancopybutton_prompt_text = '$ '
804b6f941bSPatrick Sanan
8154129d2fSPatrick Sananbibtex_bibfiles = ['petsc.bib']
824b6f941bSPatrick Sanan
838f2bcf5fSPatrick Sananmyst_enable_extensions = ["dollarmath", "amsmath", "deflist"]
848f2bcf5fSPatrick Sanan
858ca1a7daSBarry Smithremove_from_toctrees = ['docs/manualpages/*/*','docs/changes/2*','docs/changes/3*']
864707091fSPatrick Sanan
8796b7068eSPatrick Sanan# -- Options for HTML output ---------------------------------------------------
88ee12ae39SPatrick Sanan
89ee12ae39SPatrick Sananhtml_theme = 'pydata_sphinx_theme'
90ee12ae39SPatrick Sanan
9180dc5c2eSToby Isaachtml_logo_light = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc-TAO', 'web', 'PETSc-TAO_RGB.svg')
9280dc5c2eSToby Isaachtml_logo_dark = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc-TAO', 'web', 'PETSc-TAO_RGB_white.svg')
9380dc5c2eSToby Isaac
9480dc5c2eSToby Isaachtml_static_path = [html_logo_light, html_logo_dark]
9580dc5c2eSToby Isaac
96ee12ae39SPatrick Sananhtml_theme_options = {
97ee12ae39SPatrick Sanan    "icon_links": [
98ee12ae39SPatrick Sanan        {
99ee12ae39SPatrick Sanan            "name": "GitLab",
100ee12ae39SPatrick Sanan            "url": "https://gitlab.com/petsc/petsc",
101ee12ae39SPatrick Sanan            "icon": "fab fa-gitlab",
102ee12ae39SPatrick Sanan        },
103ee12ae39SPatrick Sanan    ],
104ee12ae39SPatrick Sanan    "use_edit_page_button": True,
105ffebb2dfSPatrick Sanan    "footer_items": ["copyright", "sphinx-version", "last-updated"],
106*07cc1bcaSSatish Balay    "secondary_sidebar_items" : ["edit-this-page"],
10780dc5c2eSToby Isaac    "logo": {
10880dc5c2eSToby Isaac        "image_light": os.path.basename(html_logo_light),
10980dc5c2eSToby Isaac        "image_dark": os.path.basename(html_logo_dark)
11080dc5c2eSToby Isaac    }
111ee12ae39SPatrick Sanan}
112ee12ae39SPatrick Sanan
113d3edb92dSPatrick Sanantry:
114d3edb92dSPatrick Sanan  git_ref = subprocess.check_output(["git", "rev-parse", "HEAD"]).rstrip()
115d3edb92dSPatrick Sanan  git_ref_release = subprocess.check_output(["git", "rev-parse", "origin/release"]).rstrip()
116d3edb92dSPatrick Sanan  edit_branch = "release" if git_ref == git_ref_release else "main"
117d3edb92dSPatrick Sananexcept subprocess.CalledProcessError:
118d3edb92dSPatrick Sanan  print("WARNING: determining branch for page edit links failed")
119d3edb92dSPatrick Sanan  edit_branch = "main"
120d3edb92dSPatrick Sanan
121ee12ae39SPatrick Sananhtml_context = {
122ee12ae39SPatrick Sanan    "github_url": "https://gitlab.com",
123ee12ae39SPatrick Sanan    "github_user": "petsc",
124ee12ae39SPatrick Sanan    "github_repo": "petsc",
125d3edb92dSPatrick Sanan    "github_version": edit_branch,
126ee12ae39SPatrick Sanan    "doc_path": "doc",
127ee12ae39SPatrick Sanan}
128ee12ae39SPatrick Sanan
12980dc5c2eSToby Isaachtml_logo = html_logo_light
130fc1137abSPatrick Sananhtml_favicon = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc', 'petsc_favicon.png')
13196b7068eSPatrick Sananhtml_last_updated_fmt = r'%Y-%m-%dT%H:%M:%S%z (' + git_describe_version + ')'
132ee12ae39SPatrick Sanan
133ee12ae39SPatrick Sanan
13496b7068eSPatrick Sanan# -- Options for LaTeX output --------------------------------------------------
135ee12ae39SPatrick Sananlatex_engine = 'xelatex'
136ee12ae39SPatrick Sanan
13796b7068eSPatrick Sanan# How to arrange the documents into LaTeX files, building only the manual.
138ee12ae39SPatrick Sananlatex_documents = [
1392cb00302SPatrick Sanan        ('docs/manual/index', 'manual.tex', 'PETSc/TAO Users Manual', author, 'manual', False)
140ee12ae39SPatrick Sanan        ]
141ee12ae39SPatrick Sanan
142ee12ae39SPatrick Sananlatex_additional_files = [
143c469c614SPatrick Sanan    'images/docs/manual/anl_tech_report/ArgonneLogo.pdf',
144c469c614SPatrick Sanan    'images/docs/manual/anl_tech_report/ArgonneReportTemplateLastPage.pdf',
145c469c614SPatrick Sanan    'images/docs/manual/anl_tech_report/ArgonneReportTemplatePage2.pdf',
1462cb00302SPatrick Sanan    'docs/manual/anl_tech_report/first.inc',
1472cb00302SPatrick Sanan    'docs/manual/anl_tech_report/last.inc',
148ee12ae39SPatrick Sanan]
149ee12ae39SPatrick Sanan
150ee12ae39SPatrick Sananlatex_elements = {
151ee12ae39SPatrick Sanan    'maketitle': r'\newcommand{\techreportversion}{%s}' % version +
152ee12ae39SPatrick Sananr'''
153ee12ae39SPatrick Sanan\input{first.inc}
154ee12ae39SPatrick Sanan''',
155ee12ae39SPatrick Sanan    'printindex': r'''
156ee12ae39SPatrick Sanan\printindex
157ee12ae39SPatrick Sanan\input{last.inc}
158ee12ae39SPatrick Sanan''',
159ee12ae39SPatrick Sanan    'fontpkg': r'''
160ee12ae39SPatrick Sanan\setsansfont{DejaVu Sans}
161ee12ae39SPatrick Sanan\setmonofont{DejaVu Sans Mono}
1621b671caaSPatrick Sanan''',
1631b671caaSPatrick Sanan    'tableofcontents' : r''
164ee12ae39SPatrick Sanan}
165ee12ae39SPatrick Sanan
166ee12ae39SPatrick Sanan
16796b7068eSPatrick Sanan# -- Setup and event callbacks -------------------------------------------------
168ee12ae39SPatrick Sanan
16975662446SPatrick Sanandef setup(app):
17075662446SPatrick Sanan        app.connect('builder-inited', builder_init_handler)
17175662446SPatrick Sanan        app.connect('build-finished', build_finished_handler)
17202f5a9aaSPatrick Sanan
17302f5a9aaSPatrick Sanan
17402f5a9aaSPatrick Sanandef builder_init_handler(app):
17575662446SPatrick Sanan    if app.builder.name.endswith('html'):
176b8a29d3aSPatrick Sanan        _build_classic_docs(app, 'pre')
177589e537fSPatrick Sanan        _copy_classic_docs(app, None, '.', 'pre')
1785becb6a3SPatrick Sanan        _update_htmlmap_links(app)
17902f5a9aaSPatrick Sanan
18002f5a9aaSPatrick Sanan
18102f5a9aaSPatrick Sanandef build_finished_handler(app, exception):
18275662446SPatrick Sanan    if app.builder.name.endswith('html'):
183b8a29d3aSPatrick Sanan        _build_classic_docs(app, 'post')
184589e537fSPatrick Sanan        _copy_classic_docs(app, exception, app.outdir, 'post')
1851540e0edSPatrick Sanan        _fix_links(app, exception)
186c9f6b0acSPatrick Sanan        _fix_man_page_edit_links(app, exception)
18795216c61SPatrick Sanan        if app.builder.name == 'dirhtml':
18895216c61SPatrick Sanan            _add_man_page_redirects(app, exception)
18930f5c8b0SPatrick Sanan        if app.builder.name == 'html':
19028cbf9b2SBarry Smith            print("==========================================================================")
19128cbf9b2SBarry Smith            print("    open %s/index.html in your browser to view the documentation " % app.outdir)
19228cbf9b2SBarry Smith            print("==========================================================================")
19302f5a9aaSPatrick Sanan
19495216c61SPatrick Sanandef _add_man_page_redirects(app, exception):
19595216c61SPatrick Sanan    if exception is None:
19695216c61SPatrick Sanan        print("============================================")
19795216c61SPatrick Sanan        print("    Adding man pages redirects")
19895216c61SPatrick Sanan        print("============================================")
19995216c61SPatrick Sanan        add_man_page_redirects.add_man_page_redirects(app.outdir)
2007553d27dSPatrick Sanan
20175662446SPatrick Sanandef _build_classic_docs(app, stage):
202862e4a30SBarry Smith    '''Builds the .md versions of the manual pages and the .html version of the source code'''
20375662446SPatrick Sanan    build_classic_docs.main(stage)
20475662446SPatrick Sanan
20575662446SPatrick Sanan
20675662446SPatrick Sanandef _copy_classic_docs(app, exception, destination, stage):
20775662446SPatrick Sanan    if exception is None:
2085becb6a3SPatrick Sanan        print("============================================")
20975662446SPatrick Sanan        print("    Copying classic docs (%s)" % stage)
21075662446SPatrick Sanan        print("============================================")
21175662446SPatrick Sanan        build_classic_docs.copy_classic_docs(destination, stage)
21275662446SPatrick Sanan
213c9f6b0acSPatrick Sanandef _fix_man_page_edit_links(app, exception):
214c9f6b0acSPatrick Sanan    if exception is None:
215c9f6b0acSPatrick Sanan        print("============================================")
216c9f6b0acSPatrick Sanan        print("    Fixing man page edit links")
217c9f6b0acSPatrick Sanan        print("============================================")
218c9f6b0acSPatrick Sanan        fix_man_page_edit_links.fix_man_page_edit_links(app.outdir)
219c9f6b0acSPatrick Sanan
220862e4a30SBarry Smith#
221862e4a30SBarry Smith#   The following two scripts are needed because the Sphinx html and dirhtml builds save the output html
222862e4a30SBarry Smith#   files at different levels of the directory hierarchy. file.rst -> file.html with html but
223862e4a30SBarry Smith#   file.rst -> file/index.html with dirhtml and we want both to work correctly using relative links.
224862e4a30SBarry Smith
225862e4a30SBarry Smithdef _fix_links(app, exception):
226862e4a30SBarry Smith    """We need to manage our own relative paths in the User's Manual for the source code files which
227862e4a30SBarry Smith       are auto-generated by c2html outside of Sphinx so Sphinx cannot directly handle those links for use.
228862e4a30SBarry Smith       We use the string PETSC_DOC_OUT_ROOT_PLACEHOLDER in URLs in the Sphinx .rst files as a stand in
229862e4a30SBarry Smith       for the root directory that needs to be constructed based on if the Sphinx build is html or dirhtml
230862e4a30SBarry Smith    """
231862e4a30SBarry Smith    if exception is None:
232862e4a30SBarry Smith        print("============================================")
233862e4a30SBarry Smith        print("    Fixing relative links")
234862e4a30SBarry Smith        print("============================================")
235862e4a30SBarry Smith        make_links_relative.make_links_relative(app.outdir)
236862e4a30SBarry Smith
237c9f6b0acSPatrick Sanan
23875662446SPatrick Sanandef _update_htmlmap_links(app):
239862e4a30SBarry Smith    """htmlmap maps from manualpage names to relative locations in the generated documentation directory
240862e4a30SBarry Smith       hierarchy. The format of the directory location needs to be different for the Sphinx html and dirhtml
241862e4a30SBarry Smith       builds
242862e4a30SBarry Smith    """
24375662446SPatrick Sanan    print("============================================")
24475662446SPatrick Sanan    print("    Updating htmlmap")
2455becb6a3SPatrick Sanan    print("============================================")
2465becb6a3SPatrick Sanan    update_htmlmap_links.update_htmlmap_links(app.builder)
247