lardon3d/docs/development/build.md
fy59 b84f860d86 refactor(core): freeze global maintenance baseline
Complete the A-to-Z Lardon3D maintenance and coherence pass.

Generalize host resource policy, remove the global CPU12 ceiling, preserve
host CPU/RAM reserves, scale Task capabilities through the Resource Governor,
and validate deterministic parallel GV execution.

Migrate Project DB to v23 with data-driven camera, lens, optical configuration
and calibration profiles, including manual lenses without EXIF.

Integrate safe optional LARDON SSD swap/scratch control with Governor and F10
drain/safe-to-unplug semantics.

Refactor the ncurses TUI into a runtime observatory with durable progress,
elapsed time, smoothed ETA, throughput, resource telemetry, Governor state,
optics workflow, colors and compact/no-color fallbacks.

Reconcile Queue lifetime, persistence, concurrency, comments, tests,
README, AGENTS and canonical documentation.

GLOBAL_MAINTENANCE_AUDIT=PASS/FROZEN
2026-09-01 08:00:47 +02:00

6.7 KiB

Instructions de build

Prérequis

  • OS : Linux (testé sur distributions récentes)
  • Compilateur : Clang (recommandé) ou GCC
  • Système de build : Meson + Ninja
  • Dépendances principales : ncursesw, SQLite, OpenSSL, GIO/GLib, OpenCV, LibRaw, libexif, libpng, libdeflate, Ceres ; Vulkan reste optionnel
  • Langages : API publiques C17 et implémentation mixte C17/C++17

Bootstrap des outils

Les commandes ci-dessous installent seulement le compilateur, Meson/Ninja, pkg-config et ncurses. Les bibliothèques listées plus haut doivent aussi être disponibles dans les versions acceptées par meson.build; Meson reste la source de vérité et refuse explicitement une dépendance absente ou incompatible.

# Debian / Ubuntu
sudo apt install clang meson ninja-build libncursesw5-dev pkg-config

# Fedora
sudo dnf install clang meson ninja-build ncurses-devel pkg-config

# Arch
sudo pacman -S clang meson ninja ncurses pkgconf

Build standard

# Première configuration
CC=clang meson setup build

# Arbre existant
meson setup --reconfigure build
meson compile -C build -j8

Options utiles

# Build de debug (défaut)
meson setup build --wipe

# Build de release
meson setup build --wipe --buildtype=release

# Build avec optimisations aggressive
meson setup build --wipe --buildtype=release -Db_lto=true

Validation

# Tests unitaires
meson test -C build --print-errorlogs

# Vérification du style (whitespace)
git diff --check

# Vérification autonome d'un header C public modifié
cc -x c -std=c17 -fsyntax-only -Iinclude \
  -include lardon3d/<header>.h /dev/null

Preuve fraîche de maintenance globale — 1er septembre 2026

Le registre canonique conserve le détail et les qualifications. Les résultats reproductibles acquis sont :

Configuration fraîche Compilateurs/options Build Suite
portable Clang/Clang++ 22.1.8, C17/C++17, -Dvulkan_orb=disabled 931/931 64/64 sériel
Vulkan Clang/Clang++ 22.1.8, C17/C++17, -Dvulkan_orb=enabled 939/939 65/65 sériel
ASan/UBSan portable Clang/Clang++ 22.1.8, address,undefined graphe complet 64/64 avec LSan désactivé après attribution externe
TSan portable GCC/G++ 16.2.1, Vulkan désactivé cibles concurrentes 14/14 + 220 répétitions

La suite Vulkan comprend orb-vulkan-backend sur la Radeon 780M RADV PHOENIX réelle. La cible de feasibility SIFT/RootSIFT, non enregistrée dans la suite, a été compilée/exécutée séparément : zéro divergence de décision Lowe mais des divergences d'index et de bits de distance, donc aucune promotion en backend production. Les probes stricts GCC/Clang C17+C++17 passent 76/76 sur les 19 headers publics modifiés ou nouveaux, ainsi que le fixture ABI, le lien application et git diff --check; scan3d/ reste intact.

L'unique revue finale indépendante GPT-5.6 SOL/ULTRA a conclu PASS sans finding bloquant. Elle a indépendamment rejoué le build portable, la suite complète 64/64, une matrice focalisée 15/15, les 76/76 probes de headers, l'ABI, les négatifs de seams production, le SHA-256 du manifest GV retenu et le diff-check. Le statut canonique est donc GLOBAL_MAINTENANCE_AUDIT=PASS/FROZEN ; les qualifications sanitizer ci-dessous restent néanmoins partie de la preuve.

Une validation post-freeze a ensuite attribué le délai intermittent de test-feature-task à la capture de la télémétrie hôte réelle par ses Governors synthétiques. Le fixture utilise maintenant un ResourceSnapshot complet, privé, par Governor et compilé pour cette seule cible ; production continue de lire la télémétrie réelle et n'exporte aucun seam. Après correction du second Governor relevé en revue, Feature passe 100/100, la matrice ordonnée 4/4 et les suites finales portable/Vulkan 64/64 et 65/65 ; ASan/UBSan ciblé avec detect_leaks=0 et TSan passent. Le registre canonique conserve la régression charge 5 WAIT/charge 0 START et la qualification exacte. Un timeout task isolé dans une suite normale mixte après reconstruction large reste non reproductible : le ciblé immédiat et sa matrice de revue 100/100 passent, sans modification de Task ni de son timeout.

La première suite LSan complète est volontairement conservée comme non-PASS : 57 OK, 6 FAIL et 1 timeout. Cinq échecs partagent exactement la fuite externe OpenCL de 3 808 octets/68 allocations ; les deux anomalies de 30 s n'ont aucun diagnostic sanitizer. Le délai Feature, absent du suivi initial, a ensuite été reproduit et corrigé comme décrit ci-dessus ; le délai Task reste non reproductible. La suite entière passe 64/64 avec ASan/UBSan actifs et detect_leaks=0, tandis qu'un sous-ensemble prouvé sans loader OpenCV/OpenCL passe 20/20 avec LSan actif. Il est donc incorrect de résumer cette preuve par « LSan 64/64 ».

Le log Clang complet a aussi été audité. La conversion publique Sparse SfM uint32_t → int était matérielle et a été corrigée avec validation ciblée ; les autres émissions sont soit des conversions baseline déjà bornées, soit des tests/benchmarks, soit des headers OpenCV/Ceres externes. Les emplacements et justifications exacts restent centralisés dans le registre afin de ne pas dupliquer une seconde liste normative ici.

Build ASan/UBSan (debug mémoire)

À exécuter pour tout ticket touchant la mémoire, les durées de vie ou les allocations :

CC=clang meson setup build-asan --wipe \
    -Db_sanitize=address,undefined
meson compile -C build-asan -j8
meson test -C build-asan --print-errorlogs

Build TSan (concurrence)

À exécuter pour tout ticket touchant la concurrence (pthread, mutex, variables de condition, états partagés) :

CC=clang meson setup build-tsan --wipe \
    -Db_sanitize=thread \
    -Db_lundef=false
meson compile -C build-tsan -j8
meson test -C build-tsan --print-errorlogs

Variables d'environnement

Variable Description
CC Compilateur C (défaut : gcc)
CFLAGS Drapeaux de compilation supplémentaires
LDFLAGS Drapeaux de liaison supplémentaires

Structure du build

build/
├── src/          # objets et binaires
├── tests/        # binaires de tests
└── compile_commands.json  # pour LSP / clangd

Dépannage

Erreur : ncursesw introuvable

# Vérifier l'installation
pkg-config --libs ncursesw
# Si absent, installer le paquet de développement ncursesw

Erreur : clang introuvable

# Utiliser gcc en alternative
meson setup build --wipe
# ou installer clang
sudo apt install clang

Build lent

# Réduire la parallélisation
meson compile -C build -j4
# ou utiliser ccache
CC="ccache clang" meson setup build --wipe