mirror of
https://github.com/Cantera/cantera.git
synced 2026-07-30 16:18:17 -05:00
142 lines
5.9 KiB
Python
142 lines
5.9 KiB
Python
from collections import namedtuple
|
|
from pathlib import Path
|
|
import subprocess
|
|
from SCons import Errors
|
|
|
|
from buildutils import multi_glob
|
|
|
|
Import('env', 'build', 'install')
|
|
|
|
localenv = env.Clone()
|
|
|
|
Page = namedtuple('Page', ['name', 'title', 'objects'])
|
|
|
|
|
|
if localenv['doxygen_docs'] or localenv['sphinx_docs']:
|
|
vars = {
|
|
"@INCLUDE@": "interfaces/clib",
|
|
"@ENABLED_SECTIONS@": "CLIB_GENERATED",
|
|
"@GENERATE_HTML@": "YES",
|
|
"@WARNINGS@": "YES",
|
|
"@WARN_IF_DOC_ERROR@": "YES",
|
|
"@WARN_IF_INCOMPLETE_DOC@": "YES",
|
|
}
|
|
env.Substfile(
|
|
"#build/doc/Doxyfile_html", "#doc/doxygen/Doxyfile.in", SUBST_DICT=vars)
|
|
|
|
docs = build(localenv.Command(
|
|
"#build/doc/html/cxx/index.html", "#build/doc/Doxyfile_html",
|
|
[
|
|
Delete("build/doc/html/cxx"),
|
|
'doxygen $SOURCE',
|
|
Copy("build/doc/html/cxx", "build/doc/doxygen/html")
|
|
]
|
|
))
|
|
env.Depends(docs, env.Glob('#doc/doxygen/*') +
|
|
multi_glob(env, '#include/cantera', 'h') +
|
|
multi_glob(env, '#include/cantera/*', 'h') +
|
|
multi_glob(env, '#src/cantera/*', 'h', 'cpp'))
|
|
|
|
env.Alias('doxygen', docs)
|
|
|
|
if localenv['sphinx_docs']:
|
|
localenv.PrependENVPath('PYTHONPATH', Dir('#build/python').abspath)
|
|
def build_sphinx(target, source, env):
|
|
cmd = [env['sphinx_cmd']] + env['sphinx_options'].split()
|
|
if not env['run_examples']:
|
|
cmd.extend(('-D', 'plot_gallery=0'))
|
|
if env['logging'] == 'debug':
|
|
cmd.append('-v')
|
|
cmd += ('-b', 'html', '-d', 'build/doc/sphinx/doctrees', 'build/doc/sphinx',
|
|
'build/doc/html')
|
|
code = subprocess.call(cmd, env=env['ENV'])
|
|
if code:
|
|
raise Errors.BuildError(target, action=env['sphinx_cmd'])
|
|
|
|
# RecursiveInstall knows to copy modified files, unlike Copy
|
|
copy_sphinx = localenv.RecursiveInstall("#build/doc/sphinx", "sphinx")
|
|
copy_python_samples = localenv.RecursiveInstall("#build/doc/samples/python",
|
|
"#samples/python")
|
|
copy_matlab_samples = localenv.RecursiveInstall(
|
|
"#build/doc/samples/matlab", "#samples/matlab")
|
|
copy_contrib = localenv.Command("#build/doc/sphinx/develop/CONTRIBUTING.md",
|
|
"#CONTRIBUTING.md",
|
|
Copy("$TARGET", "$SOURCE"))
|
|
|
|
copy_switcher = localenv.Command("#build/doc/html/dev/_static/doc-versions.json",
|
|
"sphinx/_static/doc-versions.json",
|
|
Copy("$TARGET", "$SOURCE"))
|
|
|
|
sphinxdocs = build(localenv.Command('#build/doc/html/index.html',
|
|
'sphinx/conf.py', build_sphinx))
|
|
env.Alias('sphinx', sphinxdocs)
|
|
env.Depends(sphinxdocs, [copy_sphinx, copy_contrib, copy_switcher])
|
|
env.Depends(sphinxdocs, [copy_python_samples, copy_matlab_samples])
|
|
env.Depends(sphinxdocs, env['python_module'])
|
|
|
|
# When .pyx files change, the compiled module's API surface may change in ways
|
|
# that Sphinx's environment cache won't detect. Delete the cache so Sphinx
|
|
# re-imports the module and regenerates the affected API pages.
|
|
pyx_files = multi_glob(env, '#interfaces/cython/cantera', 'pyx', 'pxd', 'pxi', 'py')
|
|
pyx_stamp = localenv.Command(
|
|
'#build/doc/sphinx/pyx_stamp',
|
|
pyx_files,
|
|
[Delete('build/doc/sphinx/doctrees/environment.pickle'),
|
|
Touch('$TARGET')]
|
|
)
|
|
env.Depends(sphinxdocs, pyx_stamp)
|
|
|
|
# Gather all C++ samples into a single directory so they can be presented as a
|
|
# single sub-gallery by sphinx-gallery
|
|
cxxfiles = (Glob("#samples/cxx/*/*.cpp") + Glob("#samples/cxx/*/*.h")
|
|
+ Glob("#samples/cxx/*.rst"))
|
|
for cxxfile in cxxfiles:
|
|
env.Depends(sphinxdocs,
|
|
localenv.Command(f"#build/doc/samples/cxx/{cxxfile.name}", cxxfile,
|
|
Copy("$TARGET", "$SOURCE")))
|
|
|
|
# Gather all Fortran (F77 and F90) samples into a single directory
|
|
fort_files = (Glob("#samples/f77/*.f") + Glob("#samples/f77/*.cpp")
|
|
+ Glob("#samples/f90/*.f90") + Glob("#samples/f90/README.rst"))
|
|
for fort_file in fort_files:
|
|
env.Depends(sphinxdocs,
|
|
localenv.Command(f"#build/doc/samples/fortran/{fort_file.name}",
|
|
fort_file, Copy("$TARGET", "$SOURCE")))
|
|
|
|
# Gather generated CLib sample files
|
|
clib_files = Glob("#samples/clib/*.c")
|
|
clib_files.append(File("#samples/clib/README.rst"))
|
|
for clib_file in clib_files:
|
|
env.Depends(sphinxdocs,
|
|
localenv.Command(
|
|
f"#build/doc/samples/clib/{clib_file.name}",
|
|
clib_file, Copy("$TARGET", "$SOURCE")))
|
|
|
|
# Gather C# sample files
|
|
csharp_files = Glob("#interfaces/dotnet/examples/*/*.cs")
|
|
csharp_files.append(File("#interfaces/dotnet/examples/README.rst"))
|
|
for csharp_file in csharp_files:
|
|
env.Depends(sphinxdocs,
|
|
localenv.Command(
|
|
f"#build/doc/samples/dotnet/{csharp_file.name}",
|
|
csharp_file, Copy("$TARGET", "$SOURCE")))
|
|
|
|
# Generate documentation for SCons configuration options
|
|
def save_config(target, source, env):
|
|
Path(str(target[0])).parent.mkdir(parents=True, exist_ok=True)
|
|
with open(str(target[0]), "w") as outfile:
|
|
outfile.write(env["config"].to_rest())
|
|
scons_opts = localenv.Command(
|
|
"#build/doc/sphinx/develop/compiling/scons-config-options.rst.inc",
|
|
"#SConstruct", save_config)
|
|
env.Depends(sphinxdocs, scons_opts)
|
|
|
|
localenv.AlwaysBuild(sphinxdocs)
|
|
if localenv['doxygen_docs']:
|
|
localenv.Depends(sphinxdocs, docs)
|
|
|
|
doc_files = install(localenv.RecursiveInstall, '$inst_docdir',
|
|
'#build/doc/html', exclude=['\\.map', '\\.md5'])
|
|
|
|
env['installed_docs'] = bool(doc_files)
|