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# 696b7068eSPatrick Sanan 7ee12ae39SPatrick Sananimport os 8ee12ae39SPatrick Sananimport sys 9ee12ae39SPatrick Sananimport subprocess 10ee12ae39SPatrick Sananimport re 11ee12ae39SPatrick Sananimport datetime 129cd31cfbSBarry Smithimport shutil 13*ec83d434SBarry Smithimport time 14ee12ae39SPatrick Sanan 15ee12ae39SPatrick Sanansys.path.append(os.getcwd()) 16ee12ae39SPatrick Sanansys.path.append(os.path.abspath('./ext')) 17ee12ae39SPatrick Sanan 1895216c61SPatrick Sananimport add_man_page_redirects 1902f5a9aaSPatrick Sananimport build_classic_docs 20c9f6b0acSPatrick Sananimport fix_man_page_edit_links 2102f5a9aaSPatrick Sananimport make_links_relative 225becb6a3SPatrick Sananimport update_htmlmap_links 239f89e73bSBarry Smithimport fix_pydata_margins 2402f5a9aaSPatrick Sanan 2502f5a9aaSPatrick Sanan 26e6bab0d2SPatrick Sananif not os.path.isdir("images"): 27e6bab0d2SPatrick Sanan print("-----------------------------------------------------------------------------") 28e6bab0d2SPatrick Sanan print("ERROR") 29e6bab0d2SPatrick Sanan print("images directory does not seem to exist.") 30e6bab0d2SPatrick Sanan print("To clone the required repository, try") 31e6bab0d2SPatrick Sanan print(" make images") 32e6bab0d2SPatrick Sanan print("-----------------------------------------------------------------------------") 33e6bab0d2SPatrick Sanan raise Exception("Aborting because images missing") 34e6bab0d2SPatrick Sanan 35e6bab0d2SPatrick Sanan 3696b7068eSPatrick Sanan# -- Project information ------------------------------------------------------- 37ee12ae39SPatrick Sanan 38ee12ae39SPatrick Sananproject = 'PETSc' 39ee12ae39SPatrick Sanancopyright = '1991-%d, UChicago Argonne, LLC and the PETSc Development Team' % datetime.date.today().year 40ee12ae39SPatrick Sananauthor = 'The PETSc Development Team' 41ee12ae39SPatrick Sanan 42404447afSPatrick Sananwith open(os.path.join('..', 'include', 'petscversion.h'),'r') as version_file: 43ee12ae39SPatrick Sanan buf = version_file.read() 44ee12ae39SPatrick Sanan petsc_release_flag = re.search(' PETSC_VERSION_RELEASE[ ]*([0-9]*)',buf).group(1) 45ee12ae39SPatrick Sanan major_version = re.search(' PETSC_VERSION_MAJOR[ ]*([0-9]*)',buf).group(1) 46ee12ae39SPatrick Sanan minor_version = re.search(' PETSC_VERSION_MINOR[ ]*([0-9]*)',buf).group(1) 47ee12ae39SPatrick Sanan subminor_version = re.search(' PETSC_VERSION_SUBMINOR[ ]*([0-9]*)',buf).group(1) 48ee12ae39SPatrick Sanan 49ffebb2dfSPatrick Sanan git_describe_version = subprocess.check_output(['git', 'describe', '--always']).strip().decode('utf-8') 50ee12ae39SPatrick Sanan if petsc_release_flag == '0': 51ffebb2dfSPatrick Sanan version = git_describe_version 52ffebb2dfSPatrick Sanan release = git_describe_version 53ee12ae39SPatrick Sanan else: 54ee12ae39SPatrick Sanan version = '.'.join([major_version, minor_version]) 55ee12ae39SPatrick Sanan release = '.'.join([major_version,minor_version,subminor_version]) 56ee12ae39SPatrick Sanan 57ee12ae39SPatrick Sanan 5896b7068eSPatrick Sanan# -- General configuration ----------------------------------------------------- 5996b7068eSPatrick Sanan 6066c9fbddSBarry Smith# The information on the next line must also be the same in requirements.txt 61d1f92df0SBarry Smithneeds_sphinx='5.3' 6296b7068eSPatrick Sanannitpicky = True # checks internal links. For external links, use "make linkcheck" 63ee12ae39SPatrick Sananmaster_doc = 'index' 64ee12ae39SPatrick Sanantemplates_path = ['_templates'] 6566c9fbddSBarry Smithexclude_patterns = ['_build*', 'images', 'Thumbs.db', '.DS_Store','community/meetings/pre-2023'] 6696b7068eSPatrick Sananhighlight_language = 'c' 6796b7068eSPatrick Sanannumfig = True 68ee12ae39SPatrick Sanan 6996b7068eSPatrick Sanan# -- Extensions ---------------------------------------------------------------- 70ee12ae39SPatrick Sanan 714b6f941bSPatrick Sananextensions = [ 724b6f941bSPatrick Sanan 'sphinx_copybutton', 734a3b3e5fSJed Brown 'sphinx_design', 744b6f941bSPatrick Sanan 'sphinxcontrib.bibtex', 754b6f941bSPatrick Sanan 'sphinxcontrib.katex', 764b6f941bSPatrick Sanan 'sphinxcontrib.rsvgconverter', 778f2bcf5fSPatrick Sanan 'myst_parser', 784b6f941bSPatrick Sanan 'html5_petsc', 794707091fSPatrick Sanan 'sphinx_remove_toctrees', 804b6f941bSPatrick Sanan] 814b6f941bSPatrick Sanan 82f3c6b5cdSPatrick Sanancopybutton_prompt_text = '$ ' 834b6f941bSPatrick Sanan 8454129d2fSPatrick Sananbibtex_bibfiles = ['petsc.bib'] 854b6f941bSPatrick Sanan 863d8af492SBarry Smithmyst_enable_extensions = ["fieldlist", "dollarmath", "amsmath", "deflist"] 878f2bcf5fSPatrick Sanan 888a0d1e8bSBarry Smithremove_from_toctrees = ['manualpages/*/[A-Z]*','changes/2*','changes/3*'] 894707091fSPatrick Sanan 901d27aa22SBarry Smith# prevents incorrect WARNING: duplicate citation for key "xxxx" warnings 911d27aa22SBarry Smithsuppress_warnings = ['bibtex.duplicate_citation'] 921d27aa22SBarry Smith 9396b7068eSPatrick Sanan# -- Options for HTML output --------------------------------------------------- 94ee12ae39SPatrick Sanan 95ee12ae39SPatrick Sananhtml_theme = 'pydata_sphinx_theme' 96ee12ae39SPatrick Sanan 9780dc5c2eSToby Isaachtml_logo_light = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc-TAO', 'web', 'PETSc-TAO_RGB.svg') 9880dc5c2eSToby Isaachtml_logo_dark = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc-TAO', 'web', 'PETSc-TAO_RGB_white.svg') 9980dc5c2eSToby Isaac 1007c561f09SBarry Smithhtml_static_path = ['_static', html_logo_light, html_logo_dark] 1017c561f09SBarry Smith 1027c561f09SBarry Smith# use much smaller font for h1, h2 etc. They are absurdly large in the standard style 1037c561f09SBarry Smith# https://pydata-sphinx-theme.readthedocs.io/en/v0.12.0/user_guide/styling.html 1047c561f09SBarry Smithhtml_css_files = [ 1057c561f09SBarry Smith 'css/custom.css', 1067c561f09SBarry Smith] 10780dc5c2eSToby Isaac 108ee12ae39SPatrick Sananhtml_theme_options = { 109ee12ae39SPatrick Sanan "icon_links": [ 110ee12ae39SPatrick Sanan { 111ee12ae39SPatrick Sanan "name": "GitLab", 112ee12ae39SPatrick Sanan "url": "https://gitlab.com/petsc/petsc", 113ee12ae39SPatrick Sanan "icon": "fab fa-gitlab", 114ee12ae39SPatrick Sanan }, 115ee12ae39SPatrick Sanan ], 116ee12ae39SPatrick Sanan "use_edit_page_button": True, 117ffebb2dfSPatrick Sanan "footer_items": ["copyright", "sphinx-version", "last-updated"], 118d1f92df0SBarry Smith# "secondary_sidebar_items" : ["edit-this-page"], 1193d8af492SBarry Smith "header_links_before_dropdown": 10, 12080dc5c2eSToby Isaac "logo": { 12180dc5c2eSToby Isaac "image_light": os.path.basename(html_logo_light), 12280dc5c2eSToby Isaac "image_dark": os.path.basename(html_logo_dark) 123bc1908f0SBarry Smith }, 124bc1908f0SBarry Smith "navigation_with_keys":True 125ee12ae39SPatrick Sanan} 126ee12ae39SPatrick Sanan 127d3edb92dSPatrick Sanantry: 128d3edb92dSPatrick Sanan git_ref = subprocess.check_output(["git", "rev-parse", "HEAD"]).rstrip() 129d3edb92dSPatrick Sanan git_ref_release = subprocess.check_output(["git", "rev-parse", "origin/release"]).rstrip() 130d3edb92dSPatrick Sanan edit_branch = "release" if git_ref == git_ref_release else "main" 131d3edb92dSPatrick Sananexcept subprocess.CalledProcessError: 132d3edb92dSPatrick Sanan print("WARNING: determining branch for page edit links failed") 133d3edb92dSPatrick Sanan edit_branch = "main" 134d3edb92dSPatrick Sanan 135ee12ae39SPatrick Sananhtml_context = { 136ee12ae39SPatrick Sanan "github_url": "https://gitlab.com", 137ee12ae39SPatrick Sanan "github_user": "petsc", 138ee12ae39SPatrick Sanan "github_repo": "petsc", 139d3edb92dSPatrick Sanan "github_version": edit_branch, 140ee12ae39SPatrick Sanan "doc_path": "doc", 141ee12ae39SPatrick Sanan} 142ee12ae39SPatrick Sanan 14380dc5c2eSToby Isaachtml_logo = html_logo_light 144fc1137abSPatrick Sananhtml_favicon = os.path.join('images', 'logos', 'PETSc_TAO_logos', 'PETSc', 'petsc_favicon.png') 14596b7068eSPatrick Sananhtml_last_updated_fmt = r'%Y-%m-%dT%H:%M:%S%z (' + git_describe_version + ')' 146ee12ae39SPatrick Sanan 147ee12ae39SPatrick Sanan 14896b7068eSPatrick Sanan# -- Options for LaTeX output -------------------------------------------------- 149ee12ae39SPatrick Sananlatex_engine = 'xelatex' 150ee12ae39SPatrick Sanan 15196b7068eSPatrick Sanan# How to arrange the documents into LaTeX files, building only the manual. 152ee12ae39SPatrick Sananlatex_documents = [ 15373fdd05bSBarry Smith ('manual/index', 'manual.tex', 'PETSc/TAO Users Manual', author, 'manual', False) 154ee12ae39SPatrick Sanan ] 155ee12ae39SPatrick Sanan 156ee12ae39SPatrick Sananlatex_additional_files = [ 15773fdd05bSBarry Smith 'images/manual/anl_tech_report/ArgonneLogo.pdf', 15873fdd05bSBarry Smith 'images/manual/anl_tech_report/ArgonneReportTemplateLastPage.pdf', 15973fdd05bSBarry Smith 'images/manual/anl_tech_report/ArgonneReportTemplatePage2.pdf', 16073fdd05bSBarry Smith 'manual/anl_tech_report/first.inc', 16173fdd05bSBarry Smith 'manual/anl_tech_report/last.inc', 162ee12ae39SPatrick Sanan] 163ee12ae39SPatrick Sanan 164ee12ae39SPatrick Sananlatex_elements = { 165ee12ae39SPatrick Sanan 'maketitle': r'\newcommand{\techreportversion}{%s}' % version + 166ee12ae39SPatrick Sananr''' 167ee12ae39SPatrick Sanan\input{first.inc} 168ee12ae39SPatrick Sanan''', 169ee12ae39SPatrick Sanan 'printindex': r''' 170ee12ae39SPatrick Sanan\printindex 171ee12ae39SPatrick Sanan\input{last.inc} 172ee12ae39SPatrick Sanan''', 173ee12ae39SPatrick Sanan 'fontpkg': r''' 174ee12ae39SPatrick Sanan\setsansfont{DejaVu Sans} 175ee12ae39SPatrick Sanan\setmonofont{DejaVu Sans Mono} 1761b671caaSPatrick Sanan''', 1771b671caaSPatrick Sanan 'tableofcontents' : r'' 178ee12ae39SPatrick Sanan} 179ee12ae39SPatrick Sanan 18096b7068eSPatrick Sanan# -- Setup and event callbacks ------------------------------------------------- 181ee12ae39SPatrick Sanan 18275662446SPatrick Sanandef setup(app): 18375662446SPatrick Sanan app.connect('builder-inited', builder_init_handler) 18475662446SPatrick Sanan app.connect('build-finished', build_finished_handler) 18502f5a9aaSPatrick Sanan 18602f5a9aaSPatrick Sanan 18702f5a9aaSPatrick Sanandef builder_init_handler(app): 188*ec83d434SBarry Smith global xtime 18975662446SPatrick Sanan if app.builder.name.endswith('html'): 190b8a29d3aSPatrick Sanan _build_classic_docs(app, 'pre') 1915becb6a3SPatrick Sanan _update_htmlmap_links(app) 192*ec83d434SBarry Smith ptype = 'html' 193*ec83d434SBarry Smith else: ptype = 'pdf' 194*ec83d434SBarry Smith print("============================================") 195*ec83d434SBarry Smith print(" Running Sphinx on PETSc " + ptype) 196*ec83d434SBarry Smith xtime = time.clock_gettime(time.CLOCK_REALTIME) 19702f5a9aaSPatrick Sanan 19802f5a9aaSPatrick Sanan 19902f5a9aaSPatrick Sanandef build_finished_handler(app, exception): 200*ec83d434SBarry Smith global xtime 201*ec83d434SBarry Smith print("Time: "+str(time.clock_gettime(time.CLOCK_REALTIME) - xtime)) 202*ec83d434SBarry Smith print("============================================") 20375662446SPatrick Sanan if app.builder.name.endswith('html'): 204b8a29d3aSPatrick Sanan _build_classic_docs(app, 'post') 205c6c2e312SBarry Smith build_petsc4py_docs(app) 2061540e0edSPatrick Sanan _fix_links(app, exception) 207c9f6b0acSPatrick Sanan _fix_man_page_edit_links(app, exception) 2089f89e73bSBarry Smith fix_pydata_margins.fix_pydata_margins(app.outdir) 20995216c61SPatrick Sanan if app.builder.name == 'dirhtml': 21095216c61SPatrick Sanan _add_man_page_redirects(app, exception) 2119cd31cfbSBarry Smith # remove sources for manual pages since they are automatically generated and should not be looked at on the website 2129cd31cfbSBarry Smith if os.path.isdir(os.path.join(app.outdir,'_sources','manualpages')): 2139cd31cfbSBarry Smith shutil.rmtree(os.path.join(app.outdir,'_sources','manualpages')) 21430f5c8b0SPatrick Sanan if app.builder.name == 'html': 21528cbf9b2SBarry Smith print("==========================================================================") 21628cbf9b2SBarry Smith print(" open %s/index.html in your browser to view the documentation " % app.outdir) 21728cbf9b2SBarry Smith print("==========================================================================") 21802f5a9aaSPatrick Sanan 21995216c61SPatrick Sanandef _add_man_page_redirects(app, exception): 22095216c61SPatrick Sanan if exception is None: 2216058a5bfSBarry Smith import time 22295216c61SPatrick Sanan print("============================================") 22395216c61SPatrick Sanan print(" Adding man pages redirects") 2246058a5bfSBarry Smith x = time.clock_gettime(time.CLOCK_REALTIME) 22595216c61SPatrick Sanan add_man_page_redirects.add_man_page_redirects(app.outdir) 2266058a5bfSBarry Smith print("Time: "+str(time.clock_gettime(time.CLOCK_REALTIME) - x)) 2276058a5bfSBarry Smith print("============================================") 2287553d27dSPatrick Sanan 22975662446SPatrick Sanandef _build_classic_docs(app, stage): 230862e4a30SBarry Smith '''Builds the .md versions of the manual pages and the .html version of the source code''' 2319cd31cfbSBarry Smith build_classic_docs.main(stage,app.outdir) 23275662446SPatrick Sanan 233c9f6b0acSPatrick Sanandef _fix_man_page_edit_links(app, exception): 234c9f6b0acSPatrick Sanan if exception is None: 2356058a5bfSBarry Smith import time 236c9f6b0acSPatrick Sanan print("============================================") 2373ecf4727SBarry Smith print(" Fixing manual page edit links") 2386058a5bfSBarry Smith x = time.clock_gettime(time.CLOCK_REALTIME) 239c9f6b0acSPatrick Sanan fix_man_page_edit_links.fix_man_page_edit_links(app.outdir) 2406058a5bfSBarry Smith print("Time: "+str(time.clock_gettime(time.CLOCK_REALTIME) - x)) 2416058a5bfSBarry Smith print("============================================") 242c9f6b0acSPatrick Sanan 243862e4a30SBarry Smith# 244862e4a30SBarry Smith# The following two scripts are needed because the Sphinx html and dirhtml builds save the output html 245862e4a30SBarry Smith# files at different levels of the directory hierarchy. file.rst -> file.html with html but 246862e4a30SBarry Smith# file.rst -> file/index.html with dirhtml and we want both to work correctly using relative links. 247862e4a30SBarry Smith 248862e4a30SBarry Smithdef _fix_links(app, exception): 249862e4a30SBarry Smith """We need to manage our own relative paths in the User's Manual for the source code files which 250862e4a30SBarry Smith are auto-generated by c2html outside of Sphinx so Sphinx cannot directly handle those links for use. 251862e4a30SBarry Smith We use the string PETSC_DOC_OUT_ROOT_PLACEHOLDER in URLs in the Sphinx .rst files as a stand in 252862e4a30SBarry Smith for the root directory that needs to be constructed based on if the Sphinx build is html or dirhtml 253862e4a30SBarry Smith """ 254862e4a30SBarry Smith if exception is None: 2556058a5bfSBarry Smith import time 256862e4a30SBarry Smith print("============================================") 257862e4a30SBarry Smith print(" Fixing relative links") 2586058a5bfSBarry Smith x = time.clock_gettime(time.CLOCK_REALTIME) 259862e4a30SBarry Smith make_links_relative.make_links_relative(app.outdir) 2606058a5bfSBarry Smith print("Time: "+str(time.clock_gettime(time.CLOCK_REALTIME) - x)) 2616058a5bfSBarry Smith print("============================================") 262862e4a30SBarry Smith 263c9f6b0acSPatrick Sanan 26475662446SPatrick Sanandef _update_htmlmap_links(app): 265862e4a30SBarry Smith """htmlmap maps from manualpage names to relative locations in the generated documentation directory 266862e4a30SBarry Smith hierarchy. The format of the directory location needs to be different for the Sphinx html and dirhtml 267862e4a30SBarry Smith builds 268862e4a30SBarry Smith """ 2696058a5bfSBarry Smith import time 27075662446SPatrick Sanan print("============================================") 27175662446SPatrick Sanan print(" Updating htmlmap") 2726058a5bfSBarry Smith x = time.clock_gettime(time.CLOCK_REALTIME) 2739cd31cfbSBarry Smith update_htmlmap_links.update_htmlmap_links(app.builder,os.path.join('manualpages','htmlmap')) 2746058a5bfSBarry Smith print("Time: "+str(time.clock_gettime(time.CLOCK_REALTIME) - x)) 2756058a5bfSBarry Smith print("============================================") 276c6c2e312SBarry Smith 277c6c2e312SBarry Smithdef build_petsc4py_docs(app): 278c6c2e312SBarry Smith petsc_dir = os.path.dirname(os.path.abspath(os.path.join(__file__,'..'))) 279c6c2e312SBarry Smith petsc_arch = 'arch-classic-docs' 280c6c2e312SBarry Smith 2816058a5bfSBarry Smith # petsc4py needs to be built to build petsc4py docs via introspection 282c6c2e312SBarry Smith command = ['make', 'all', 283c6c2e312SBarry Smith 'PETSC_DIR=%s' % petsc_dir, 284c6c2e312SBarry Smith 'PETSC_ARCH=%s' % petsc_arch] 2856058a5bfSBarry Smith import time 286c6c2e312SBarry Smith print('==============================================') 287c6c2e312SBarry Smith print('Building library to make petsc4py docs') 288c6c2e312SBarry Smith print(command) 2896058a5bfSBarry Smith x = time.clock_gettime(time.CLOCK_REALTIME) 290c6c2e312SBarry Smith subprocess.run(command, cwd=petsc_dir, check=True) 291*ec83d434SBarry Smith print("End building library for petsc4py docs Time: "+str(time.clock_gettime(time.CLOCK_REALTIME) - x)) 2926058a5bfSBarry Smith print('==============================================') 293c6c2e312SBarry Smith 294c6c2e312SBarry Smith command = ['make', 'website', 295c6c2e312SBarry Smith 'PETSC_DIR=%s' % petsc_dir, 296c6c2e312SBarry Smith 'PETSC_ARCH=%s' % petsc_arch, 297c6c2e312SBarry Smith 'LOC=%s' % app.outdir] 298c6c2e312SBarry Smith print('============================================') 299c6c2e312SBarry Smith print('Building petsc4py docs') 300c6c2e312SBarry Smith print(command) 3016058a5bfSBarry Smith x = time.clock_gettime(time.CLOCK_REALTIME) 302c6c2e312SBarry Smith subprocess.run(command, cwd=os.path.join(petsc_dir,'src','binding','petsc4py'), check=True) 303*ec83d434SBarry Smith print("End petsc4py docs Time: "+str(time.clock_gettime(time.CLOCK_REALTIME) - x)) 3046058a5bfSBarry Smith print('============================================') 305