docs(doxygen): Graphviz activé + cible de génération reproductible

HAVE_DOT = YES, mais CALL_GRAPH et CALLER_GRAPH restent à NO, et pas pour une question
de coût : le moteur est signal-driven. powerBalanceChanged → verifyOverloadProtection()
est une connexion Qt, invisible à l'analyse statique ; un graphe d'appel montrerait
update() comme un point d'entrée orphelin et raterait le mécanisme principal de la
couche L4. Un schéma faux vaut moins que pas de schéma.

Ce que dot apporte réellement : héritage, collaboration, inclusions. SVG, lisible à toute
échelle et diffable, avec DOT_GRAPH_MAX_NODES = 60 pour éviter les pavés illisibles.

tools/gen-doc.sh : une seule commande, le Doxyfile épinglé. C'est la leçon du piège des
générateurs — 163 avertissements sans sortie contre 113 avec HTML+XML sur le même arbre.
Un chiffre de référence ne vaut que rattaché à une configuration exacte, et une commande
unique empêche qu'on régénère « à sa façon ». Le script signale aussi une version de
doxygen différente de la référence 1.9.8.

Avertissement ajouté en tête du Doxyfile, à côté de celui sur les générateurs : le graphe
d'héritage sera tronqué. EnergyArbitrator : public SmartChargingManager, mais l'amont est
hors INPUT. C'est voulu — élargir INPUT ferait exploser le compte d'avertissements. Sans
cette note, quelqu'un le « réparera ».

graphviz est documenté comme dépendance de la cible doc, pas du build : build-cross-arm64
compile, il ne dessine pas.

Hors de ce lot, comme convenu : \defgroup, carte \dot cliquable, WARN_AS_ERROR = YES,
hébergement.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Patrick Schurig 2026-08-10 06:39:15 +02:00
parent d9c16d34ea
commit 67f7059dcc
3 changed files with 137 additions and 1 deletions

View File

@ -523,6 +523,21 @@ supérieures n'affecte pas les couches inférieures. Voir `docs/SAFETY.md` pour
`Doxyfile` (frontière = un répertoire) et se documentent à la main. Leur inventaire
est tenu dans `energyplugin/smartchargingmanager.h`, au marqueur `[ETM] BEGIN`
toute nouvelle marque `[ETM]` dans un en-tête amont s'y ajoute.
6. **Génération de la doc : `./tools/gen-doc.sh`, et rien d'autre.** Une commande
unique, le `Doxyfile` du dépôt, épinglé. Un compte d'avertissements ne vaut que
rattaché à une configuration exacte — 163 sans générateur de sortie contre 113 avec
HTML+XML sur le même arbre — donc un chiffre produit « à sa façon » ne se compare à
rien. Le script signale aussi une version de doxygen différente de la référence.
- **Dépendances : `doxygen` et `graphviz`, de la CIBLE DOC uniquement.** Le paquet se
construit sans elles ; le conteneur `build-cross-arm64` n'a rien à faire de
Graphviz. Ne pas les ajouter aux `Build-Depends`.
- `CALL_GRAPH`/`CALLER_GRAPH` restent à `NO` **délibérément** : le moteur est
signal-driven, `powerBalanceChanged → verifyOverloadProtection()` est une connexion
Qt et non un appel. Un graphe d'appel montrerait `update()` en point d'entrée
orphelin et raterait le mécanisme principal de la couche L4.
- Le graphe d'héritage est **tronqué par construction** : `SmartChargingManager` est
hors `INPUT`. Ne pas élargir le périmètre pour « réparer » — cela ferait entrer tout
l'amont dans la mesure.
## ROADMAP — configuration des priorités par l'utilisateur (post-beta)

View File

@ -11,6 +11,14 @@
# sont peu nombreux, déjà marqués, et documentés à la main — cf. la définition
# de fait dans AGENTS.md.
#
# ATTENTION — le graphe d'héritage sera TRONQUÉ, et c'est voulu.
# « class EnergyArbitrator : public SmartChargingManager » est l'arête la plus
# intéressante du dépôt, et elle n'apparaîtra pas : la classe de base vit dans
# energyplugin/, hors INPUT, donc doxygen ne la résout pas. Élargir INPUT pour
# « réparer » le graphe ferait entrer tout le code amont dans la mesure et
# ferait exploser le compte d'avertissements — exactement ce que le périmètre
# ci-dessus évite. Le graphe est incomplet par choix, pas par oubli.
#
# ATTENTION — le nombre d'avertissements dépend des générateurs de sortie
# activés. Sans aucun générateur, doxygen 1.9.8 émet des « not documented » sur
# des membres qui SONT documentés (constaté : 163 sans sortie, 113 avec
@ -82,4 +90,36 @@ MARKDOWN_SUPPORT = YES
OPTIMIZE_OUTPUT_FOR_C = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HAVE_DOT = NO
# --- Graphes (Graphviz) ----------------------------------------------------
# graphviz est une dépendance de la CIBLE DOC, pas du build du paquet : rien à
# installer dans le conteneur build-cross-arm64, qui n'a que faire de dot.
# Debian/Ubuntu : apt install graphviz
HAVE_DOT = YES
# CALL_GRAPH / CALLER_GRAPH restent à NO, et ce n'est pas une question de coût.
# Le moteur est SIGNAL-DRIVEN : powerBalanceChanged → verifyOverloadProtection()
# n'est pas un appel mais une connexion Qt, invisible à l'analyse statique. Un
# graphe d'appel montrerait update() comme un point d'entrée orphelin et
# raterait le mécanisme principal de la couche L4. Un schéma faux vaut moins
# que pas de schéma.
CALL_GRAPH = NO
CALLER_GRAPH = NO
# Ce que dot apporte réellement ici : héritage, collaboration, inclusions.
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = NO
DIRECTORY_GRAPH = YES
TEMPLATE_RELATIONS = NO
# SVG : lisible à toute échelle et diffable, contrairement au PNG.
DOT_IMAGE_FORMAT = svg
INTERACTIVE_SVG = YES
# Au-delà, doxygen tronque plutôt que de produire un pavé illisible — un graphe
# qu'on ne peut pas lire ne documente rien.
DOT_GRAPH_MAX_NODES = 60
MAX_DOT_GRAPH_DEPTH = 3
DOT_CLEANUP = YES

81
tools/gen-doc.sh Executable file
View File

@ -0,0 +1,81 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2025 - 2026, Patrick Schurig / ETM PowerSync
#
# Génération reproductible de la documentation — UNE seule commande, le Doxyfile
# du dépôt, épinglé.
#
# ./tools/gen-doc.sh
#
# Pourquoi une commande unique plutôt qu'un « doxygen » lancé à la main : le
# nombre d'avertissements NE VEUT RIEN DIRE hors de sa configuration exacte. Le
# piège a déjà été rencontré — 163 avertissements sans générateur de sortie
# contre 113 avec HTML+XML, sur le même arbre. Un chiffre de référence ne se
# compare qu'à un chiffre produit de la même façon ; ce script est cette façon.
#
# DÉPENDANCES — de la CIBLE DOC uniquement, jamais du build du paquet :
# apt install doxygen graphviz
# Le conteneur build-cross-arm64 n'a rien à faire de Graphviz : il compile, il
# ne dessine pas.
set -u
RACINE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DOXYFILE="$RACINE/Doxyfile"
SORTIE="$RACINE/doc-generated"
VERSION_ATTENDUE="1.9.8"
cd "$RACINE" || exit 1
manquant=0
for outil in doxygen dot; do
if ! command -v "$outil" >/dev/null 2>&1; then
echo "MANQUANT : $outil" >&2
manquant=1
fi
done
if [ "$manquant" -ne 0 ]; then
echo "" >&2
echo "Dépendances de la cible doc : apt install doxygen graphviz" >&2
exit 127
fi
VERSION_REELLE="$(doxygen --version | cut -d' ' -f1)"
if [ "$VERSION_REELLE" != "$VERSION_ATTENDUE" ]; then
# Avertissement et non erreur : la génération reste utile, mais le compte
# d'avertissements n'est plus comparable au chiffre de référence.
echo "ATTENTION : doxygen $VERSION_REELLE, référence établie sous $VERSION_ATTENDUE." >&2
echo " Les graphes restent valables ; le COMPTE d'avertissements," >&2
echo " lui, n'est pas comparable d'une version à l'autre." >&2
fi
rm -rf "$SORTIE"
JOURNAL="$(mktemp)"
trap 'rm -f "$JOURNAL"' EXIT
doxygen "$DOXYFILE" 2>"$JOURNAL"
code=$?
# Le Doxyfile écrit déjà ses avertissements dans WARN_LOGFILE ; on compte ici ce
# qui est réellement remonté, quelle que soit la destination.
LOGFILE="$(sed -n 's/^WARN_LOGFILE *= *//p' "$DOXYFILE" | tr -d ' ')"
if [ -n "$LOGFILE" ] && [ -f "$RACINE/$LOGFILE" ]; then
JOURNAL_EFFECTIF="$RACINE/$LOGFILE"
else
JOURNAL_EFFECTIF="$JOURNAL"
fi
AVERTISSEMENTS="$(grep -c -i "warning" "$JOURNAL_EFFECTIF" 2>/dev/null || echo 0)"
echo ""
echo " doxygen $VERSION_REELLE (référence $VERSION_ATTENDUE)"
echo " graphviz $(dot -V 2>&1 | sed 's/^dot - graphviz version //; s/ .*//')"
echo " configuration $DOXYFILE"
echo " sortie $SORTIE (html/ + xml/)"
echo " avertissements $AVERTISSEMENTS"
echo ""
echo " Rappel : ce compte n'est comparable qu'à un compte produit par CE script."
echo " Rappel : le graphe d'héritage est tronqué par construction — la classe de"
echo " base amont SmartChargingManager est hors INPUT. Voir l'en-tête du"
echo " Doxyfile ; ne pas « réparer » en élargissant le périmètre."
exit $code