Documentation

Use this guide when editing a Doxygen block, a page under doc/, a snippet or example, or a documented public name. The documentation is the Doxygen comments in the headers, the topic pages in doc/*.dox, and the programs under doc/snippets, doc/examples and their contrib/doc counterparts, which the doc target compiles and runs to produce the output the pages embed. Keep the Doxygen block above a changed declaration describing the current behavior, preconditions, and return value, and give a module README that names a moved value the same update.

The Blocking Job

The documentation job is blocking and easy to miss. Unlike the clang-format, codespell, and clang-tidy jobs, build:linux:docs in ci/build.linux.gitlab-ci.yml is not allow_failure, and doc/Doxyfile.in sets WARN_AS_ERROR = FAIL_ON_WARNINGS_PRINT, so one Doxygen warning fails it. Its rules exclude the default merge-request pipeline: it runs on schedules, web pipelines, a merge request labeled all-tests, and a push to the default branch. A malformed \ref therefore passes an entire review green and breaks the pipeline on master after the merge. Apply the all-tests label to any merge request that touches Doxygen markup, a cross-reference target, or a documented name.

The recurring authoring mistake is trailing punctuation absorbed into a cross-reference: a colon directly after \ref name becomes part of the symbol Doxygen tries to resolve, so \ref adjoint: the ... fails while \ref adjoint. The ... resolves. Separate a reference from following prose with a space, comma, or period. Punctuation inside the name itself is fine — \ref MatrixBase::cross() is a qualified symbol, not a glued colon.

The doc target also compiles and runs the configured examples and snippets, by way of the all_snippets and all_examples prerequisites in doc/CMakeLists.txt. A renamed or removed public name breaks the documentation build even when every comment is well formed, so search those directories before changing one. “Configured” is the operative word: contrib/doc/examples/CMakeLists.txt adds its SYCL subdirectory only under EIGEN_TEST_SYCL, which build:linux:docs does not set, so a broken contrib SYCL example leaves this target green. Treat the target as coverage for the sets the configuration actually enables, and check the conditional before citing it as coverage.

Building Locally

EIGEN_BUILD_DOC defaults on for a top-level, non-cross-compiling configuration, but doc is excluded from all and must be named:

cmake --build build --target doc

Doxygen and graphviz must be installed. CI builds a pinned Doxygen from source (ci/scripts/build_and_install_doxygen.sh), so another local version can diagnose a different set of warnings; report the version that produced a local result.