blob: dd1352f068c8613c95a44be895a158e63037c282 [file]
import importlib.util
from pathlib import Path
import re
# Parse version from include/ceres/version.h so it stays in sync automatically.
_repo_root = Path(__file__).resolve().parents[2]
_version_header = (_repo_root / 'include' / 'ceres' / 'version.h').read_text(
encoding='utf-8'
)
_major = re.search(
r'#define\s+CERES_VERSION_MAJOR\s+(\d+)', _version_header
).group(1)
_minor = re.search(
r'#define\s+CERES_VERSION_MINOR\s+(\d+)', _version_header
).group(1)
_patch = re.search(
r'#define\s+CERES_VERSION_REVISION\s+(\d+)', _version_header
).group(1)
project = 'Ceres Solver'
copyright = '2026 Google Inc'
author = 'Sameer Agarwal, Keir Mierle & Others'
version = f'{_major}.{_minor}'
release = f'{_major}.{_minor}.{_patch}'
# Verify that package.xml matches include/ceres/version.h.
_package_xml = (_repo_root / 'package.xml').read_text(encoding='utf-8')
if f'<version>{release}</version>' not in _package_xml:
raise RuntimeError(
f'package.xml version does not match version.h ({release})'
)
# Parse the latest stable release metadata from CITATION.cff for index.rst.
_citation_cff = (_repo_root / 'CITATION.cff').read_text(encoding='utf-8')
_stable_version = re.search(
r'^version:\s*(\S+)', _citation_cff, re.MULTILINE
).group(1)
_stable_date = re.search(
r'^date-released:\s*(\d{4})-(\d{2})-\d{2}', _citation_cff, re.MULTILINE
)
_stable_year = _stable_date.group(1)
_stable_month = str(int(_stable_date.group(2)))
rst_epilog = f"""
.. |stable_version| replace:: {_stable_version}
.. |stable_year| replace:: {_stable_year}
.. |stable_month| replace:: {_stable_month}
"""
extensions = [
'sphinx.ext.todo',
'sphinx.ext.mathjax',
'sphinx.ext.ifconfig',
]
if importlib.util.find_spec('sphinx_copybutton') is not None:
extensions.append('sphinx_copybutton')
templates_path = ['_templates']
master_doc = 'index'
exclude_patterns = []
nitpicky = True
# Enum and typedef identifiers used in member/function declarations whose
# values are documented inline rather than in standalone directives.
nitpick_ignore = [
('cpp:identifier', 'Context'),
('cpp:identifier', 'CovarianceAlgorithmType'),
('cpp:identifier', 'DenseLinearAlgebraLibraryType'),
('cpp:identifier', 'DoglegType'),
('cpp:identifier', 'DumpFormatType'),
('cpp:identifier', 'LineSearchDirectionType'),
('cpp:identifier', 'LineSearchInterpolationType'),
('cpp:identifier', 'LineSearchType'),
('cpp:identifier', 'LinearSolverOrderingType'),
('cpp:identifier', 'LinearSolverType'),
('cpp:identifier', 'LoggingType'),
('cpp:identifier', 'MinimizerType'),
('cpp:identifier', 'NonlinearConjugateGradientType'),
('cpp:identifier', 'Ownership'),
('cpp:identifier', 'PreconditionerType'),
('cpp:identifier', 'ResidualBlockId'),
('cpp:identifier', 'SparseLinearAlgebraLibraryType'),
('cpp:identifier', 'TerminationType'),
('cpp:identifier', 'TrustRegionStrategyType'),
('cpp:identifier', 'VisibilityClusteringType'),
]
html_theme = 'furo'
html_title = 'Ceres Solver'
html_theme_options = {
'source_repository': 'https://github.com/ceres-solver/ceres-solver',
'source_branch': 'master',
'source_directory': 'docs/source/',
}
html_context = {
'ceres_doc_variant': 'dev',
'stable_version': _stable_version,
}
html_extra_path = ['CNAME']
html_domain_indices = True
html_use_index = True
html_split_index = False
html_show_sourcelink = False
html_show_sphinx = False
html_show_copyright = True
htmlhelp_basename = 'CeresSolverdoc'