Files
LithosAnanake/docs/formal/scraps/architecture/build-and-tooling/DOCUMENTATION_README.tex
T

155 lines
5.7 KiB
TeX

%% SCRAP: architecture/build-and-tooling/DOCUMENTATION_README
%% SOURCE: docs/working/architecture/build-and-tooling/DOCUMENTATION_README.adoc
%% STATUS: CURRENT
%% FITS: dev-guide/ch-docs
%% EDITORIAL: lifted — prose rewritten to press voice
\section{The Documentation System}
StarForth generates its API documentation directly from source, driven by
Doxygen and rendered into several formats. A single command builds everything:
\begin{lstlisting}[language=bash]
make docs
\end{lstlisting}
The build emits AsciiDoc API documentation under \texttt{docs/src/appendix/},
one flat file per source module. These files are produced on demand by
\texttt{./scripts/generate-doxygen-appendix.sh} and rebuilt periodically by the
Jenkins pipeline. To inspect the result, run the generator and read the index:
\begin{lstlisting}[language=bash]
./scripts/generate-doxygen-appendix.sh
cat docs/src/appendix/index.adoc
\end{lstlisting}
\subsection{Installation Requirements}
Core functionality requires Doxygen and Graphviz. On the major distributions:
\begin{lstlisting}[language=bash]
sudo apt-get install doxygen graphviz # Ubuntu/Debian
brew install doxygen graphviz # macOS
sudo dnf install doxygen graphviz # Fedora/RHEL
\end{lstlisting}
PDF output additionally requires a TeX Live installation
(\texttt{texlive-latex-base} and \texttt{texlive-latex-extra} on Debian, or
MacTeX/BasicTeX on macOS). AsciiDoc and Markdown conversion requires Pandoc,
with Asciidoctor optional for HTML rendering. Verify the toolchain before
building --- Doxygen should report version 1.9.0 or later:
\begin{lstlisting}[language=bash]
doxygen --version
dot -V
pandoc --version # optional
pdflatex --version # optional
\end{lstlisting}
\subsection{Documentation Targets}
\begin{tabular}{lll}
\toprule
Target & Description & Requirements \\
\midrule
\texttt{make docs} & Generate all formats & doxygen, graphviz (+ optional) \\
\texttt{make docs-html} & HTML only (fast) & doxygen, graphviz \\
\texttt{make docs-pdf} & PDF only & doxygen, graphviz, pdflatex \\
\texttt{make docs-open} & Generate HTML and open browser & doxygen, graphviz \\
\texttt{make docs-clean} & Remove generated docs & none \\
\bottomrule
\end{tabular}
\subsection{Documenting Code}
Documentation lives beside the code it describes. The workflow is short: read
the style guide, copy the template at \texttt{examples/doxygen\_example.h}, then
annotate. A typical function comment carries a brief, a detailed body,
parameters, contracts, and an example:
\begin{lstlisting}[language=C]
/**
* @brief Push value onto data stack
*
* @details
* Adds a value to the top of the data stack. Stack overflow
* is checked and vm->error is set if stack is full.
*
* @param vm Pointer to VM instance
* @param value Value to push
*
* @pre vm must be initialized
* @pre vm->dsp < STACK_SIZE-1
* @post vm->dsp incremented by 1
* @post On error: vm->error is set
*
* @note This is a hot-path function - optimized for speed
* @warning Always check vm->error after calling
*
* @see vm_pop()
*/
void vm_push(VM *vm, cell_t value);
\end{lstlisting}
After annotating, rebuild and clear any warnings:
\begin{lstlisting}[language=bash]
make docs-html
cat docs/src/appendix/doxygen_warnings.log
\end{lstlisting}
\subsection{Coverage Priorities}
The target is 100\% coverage of the public API headers. Documentation effort is
tiered by audience:
\begin{itemize}
\item \textbf{High priority} --- user-facing API: \texttt{include/vm.h},
\texttt{include/word\_registry.h}, \texttt{include/log.h},
\texttt{include/io.h}.
\item \textbf{Medium priority} --- developer API: word implementation headers
under \texttt{src/word\_source/include/}, \texttt{include/profiler.h},
\texttt{include/vm\_debug.h}.
\item \textbf{Low priority} --- internal implementation files and test
infrastructure headers.
\end{itemize}
%% TODO(bob): current coverage percentage is unverified in source ("TBD"). Run `make docs` and record the real figure.
\subsection{Continuous Integration}
The documentation build is CI-friendly. A GitHub Actions job installs Doxygen
and Graphviz, runs \texttt{make docs-html}, fails the build if
\texttt{doxygen\_warnings.log} is non-empty, and deploys the generated HTML to
GitHub Pages on the master branch.
\subsection{Output Formats}
Each format serves a distinct audience. HTML is best for interactive browsing
and search; PDF for printing and offline reference; AsciiDoc for downstream
conversion; Markdown for GitHub and wikis; and man pages for command-line
reference, installable into the system man path.
\subsection{Troubleshooting}
The common failures are missing tools. A \texttt{command not found} for
\texttt{doxygen}, \texttt{dot}, or \texttt{pdflatex} means the corresponding
package is absent --- install it, or fall back to \texttt{make docs-html} since
PDF and Pandoc-based outputs are optional. Missing graphs indicate Graphviz is
not installed. Warnings about undocumented functions are resolved by annotating
the offending code per the style guide. ``No such file or directory'' when
opening docs means they have not been generated yet.
\subsection{Customization}
Edit \texttt{Doxyfile} to adjust the project name and version
(\texttt{PROJECT\_NAME}, \texttt{PROJECT\_NUMBER}), input file set
(\texttt{INPUT}, \texttt{FILE\_PATTERNS}), output formats, and diagram options
(\texttt{CALL\_GRAPH}, \texttt{CALLER\_GRAPH}). Custom Markdown pages are added
by appending them to \texttt{INPUT}. HTML appearance is themed through
\texttt{HTML\_EXTRA\_STYLESHEET} and \texttt{HTML\_COLORSTYLE}.
External projects can link against StarForth documentation by referencing the
generated tag file \texttt{docs/src/appendix/starforth.tag} in their own
Doxyfile via \texttt{TAGFILES}.