Recette de reconstruction Bullseye amd64, Linux 6.12.115 StackX

Cette recette décrit et rassemble les entrées des quatre paquets du lot
Bullseye : image, headers incluant kbuild et métapaquet 6.12.115-1, ainsi que
la toolchain GCC 12.4.0-1. Release : 6.12.115-stackx-bullseye-1.
La construction GCC utilise les binutils natifs de Bullseye, version 2.35.2.
Les modules sont compressés en XZ ; l'image et l'initramfs restent gzip.

Les scripts sont ceux des constructions réalisées, avec le driver GCC corrigé
et une seule adaptation de paramètres dans lib/common.sh. Cette adaptation
est décrite dans DERIVATION.txt. Elle n'a pas fait l'objet d'une nouvelle
construction complète. Les résultats ne sont pas annoncés reproductibles
octet par octet : timestamps et environnement complet ne sont pas normalisés.

Périmètre et disposition

Le répertoire recipe/ contient la recette et ses entrées de configuration.
Les cinq archives originales intactes, le patch perf et la configuration
finale sont fournis séparément. sources-manifest.tsv fixe cette liste, les
tailles et SHA256. Il ne s'agit pas de paquets sources Debian :
aucun .dsc, index Sources ou accès deb-src n'est fourni par cette recette.

Seul Bullseye amd64 fait partie de ce lot. Les branches conditionnelles
Buster/Stretch des scripts historiques sont conservées, sans leurs profils
ni leurs sources de configuration. Aucun reçu de validation ne les débloque.
Ne pas fabriquer de marqueur runtime pour utiliser ces autres cibles.

Les sources natives de Debian ne sont pas incorporées. La liste des paquets
de construction enregistrés figure dans dependencies/native-packages.tsv.
Préparer séparément un rootfs Debian 11 amd64 de construction, propre et
arrêté, contenant ces outils. Aucun rootfs, contrôleur de machine, secret,
journal d'exécution ni reçu runtime privé n'est inclus.

Avant de construire

Lire DEPENDENCIES.txt et LICENCES.txt. Choisir explicitement les chemins
absolus de RECIPE_ROOT, SOURCES_DIR, SOURCE_ROOT, EXTERNAL_ROOT et TARGET_ROOTFS.
RECIPE_ROOT désigne ce répertoire recipe ; SOURCES_DIR un répertoire explicite
contenant à sa racine les sept entrées du manifeste. SOURCE_ROOT désigne une nouvelle
extraction intacte de Linux. EXTERNAL_ROOT est une racine de travail isolée,
déjà créée, séparée des sources et du rootfs. TARGET_ROOTFS désigne le rootfs
de construction déjà préparé. Aucun chemin de l'environnement d'origine
n'est utilisé par défaut.

Exécuter les scripts avec bash, même si leur mode n'est pas exécutable.
Utiliser un compte de construction et des espaces de noms autorisés sur un
hôte de laboratoire. Ne pas viser /, un système vivant ou un serveur en
production. Aucun script de cette recette ne lance de VM ou de connexion SSH.
La racine du rootfs est montée en lecture seule ; seules les zones de travail
et le préfixe de la copie GCC expressément autorisés sont inscriptibles.

Vérifier d'abord les manifestes depuis les répertoires qu'ils décrivent :

  (cd "$RECIPE_ROOT" && sha256sum --strict -c SHA256SUMS)
  (cd "$SOURCES_DIR" && sha256sum --strict -c "$RECIPE_ROOT/SOURCES.sha256")

L'archive Linux doit être extraite sans modification dans SOURCE_ROOT.
Par exemple, après avoir vérifié que SOURCE_ROOT n'existe pas, dans un
répertoire parent isolé existant et avec un compte non privilégié :

  test ! -e "$SOURCE_ROOT" && test ! -L "$SOURCE_ROOT" && \
  mkdir -- "$SOURCE_ROOT" && \
  tar --extract --xz --no-same-owner --no-same-permissions \
    --strip-components=1 --file "$SOURCES_DIR/linux-6.12.115.tar.xz" \
    --directory "$SOURCE_ROOT"

Conserver exactement le texte des liens symboliques de l'archive, y compris
les composants redondants « ./ ». prepare-source.sh recalcule l'empreinte
complète de l'arbre et du Makefile ; une différence arrête la procédure.
Les métadonnées attendues sont des exports de faits d'authentification
antérieurs, identifiés comme tels. Elles ne sont pas un reçu de construction
ou de démarrage. Pour une authentification indépendante, vérifier également
la signature amont sur le tar décompressé avant extraction ; les URL et
empreintes publiques utiles figurent dans evidence/upstream-6.12.115/.

Environnement explicite

Définir et exporter les cinq chemins ci-dessus avant de poursuivre.
MAX_JOBS doit également être choisi selon le budget CPU/RAM disponible,
sans reprendre l'allocation d'une ancienne machine. Les contrôles CPU et
RAM du contrat restent actifs. La réserve et le coût mémoire par job sont
configurables par STACKX_RAM_RESERVE_MIB et STACKX_RAM_MIB_PER_JOB ; les
valeurs par défaut du contrat sont respectivement 4096 et 2048 Mio.

  : "${RECIPE_ROOT:?chemin absolu de la recette}"
  : "${SOURCES_DIR:?chemin absolu des sources}"
  : "${SOURCE_ROOT:?extraction Linux intacte}"
  : "${EXTERNAL_ROOT:?racine isolée du travail}"
  : "${TARGET_ROOTFS:?rootfs Bullseye préparé}"
  : "${MAX_JOBS:?allocation CPU positive à choisir}"
  export SOURCE_ROOT EXTERNAL_ROOT TARGET_ROOTFS MAX_JOBS
  export TARGET_DIST=bullseye ABI_REV=1 KERNEL_VERSION=6.12.115
  export TYPE_HOTE=local LC_ALL=C
  export STACKX_ALLOW_TOOLCHAIN_FALLBACK=1
  export TOOLCHAIN_DIR="$SOURCES_DIR"
  export TOOLCHAIN_SHA256="$RECIPE_ROOT/evidence/toolchain-fallback/SHA256SUMS"
  export HISTORICAL_CONFIG_DIR="$RECIPE_ROOT/evidence/reference/configs"
  export CONFIG_ACCEPT_INCONNUS="$RECIPE_ROOT/review/accepted-unknown.txt"
  export CONFIG_ACCEPT_LISTNEW="$RECIPE_ROOT/review/accepted-listnew2323.txt"
  export CONFIG_ACCEPT_ECARTS="$RECIPE_ROOT/review/accepted-ecarts2324.txt"

Construction, étape par étape

Les commandes ci-dessous doivent être exécutées séparément et leur résultat
examiné avant de passer à la suivante. Conserver les échecs et leurs journaux.
Ne pas modifier les reçus ni supprimer un refus pour continuer.

  bash "$RECIPE_ROOT/draft/common/scripts/prepare-source.sh"
  bash "$RECIPE_ROOT/draft/common/scripts/check-rootfs.sh"
  bash "$RECIPE_ROOT/draft/common/scripts/qualify-tools.sh"

Sur l'environnement Bullseye enregistré, qualify-tools refuse les capacités
GCC natives manquantes avec le code 5 et decision=repli-possible. Vérifier le
rapport outils-natifs.echec sous EXTERNAL_ROOT/work/bullseye/6.12.115-1/reports.
Seul ce résultat autorise le repli prévu ; le driver vérifie lui-même cette
condition. Un résultat rootfs-inapte ou un autre échec exige une correction
de l'environnement et ne doit pas être contourné. Un GCC natif déjà qualifié
sélectionnerait un autre chemin que le lot à quatre paquets décrit ici.

  bash "$RECIPE_ROOT/draft/common/scripts/build-toolchain.sh"

GCC 12.4.0 est construit avec bootstrap et comparaison des stages 2 et 3,
GMP/MPFR/MPC intégrés, préfixe /opt/stackx-toolchain dans une copie du rootfs.
La libc et les binutils natifs restent ceux de Bullseye. Les neuf wrappers
as, ld, ar, nm, objcopy, objdump, readelf, strip, ranlib appellent chacun
/usr/bin/NOM. history/gcc-bootstrap.json décrit les options exactes, et
history/generated-members.json conserve les contenus des wrappers observés.
MAKEINFO=true utilise les documents prérendus des archives officielles.

  bash "$RECIPE_ROOT/draft/common/scripts/prepare-config.sh"

Cette étape applique le patch perf uniquement aux trois fichiers attendus,
avec hashes avant/après, puis migre les trois configurations historiques et
les fragments. Les trois listes d'acceptation sont exactes. Toute différence
nouvelle exige une revue ; ne pas remplacer une liste acceptée par une sortie
nouvelle sans l'examiner. Les listes historiques restent valides pour la
migration XZ effectivement réalisée, qui modifie les deux sélecteurs de
compression des modules dans la configuration finale.

Avant compilation, comparer la configuration générée à la référence exacte :

  cmp -- "$EXTERNAL_ROOT/work/bullseye/6.12.115-1/obj/.config" \
    "$SOURCES_DIR/config-6.12.115-stackx-bullseye-1"

SHA256 attendu :
1dd9b26f9bc7c12e07d07470c7635441fb81ddb3e808a612a122cbd8e5841e9f

  bash "$RECIPE_ROOT/draft/common/scripts/build-kernel.sh"
  bash "$RECIPE_ROOT/draft/common/scripts/package-debs.sh"

Les commandes make effectives utilisent ARCH=x86_64, O=/work/obj, GCC/G++
privés et les wrappers binutils natifs, LOCALVERSION=-stackx-bullseye-1,
cibles bzImage et modules. KBUILD_BUILD_USER=stackx et
KBUILD_BUILD_HOST=build.invalid sont fixés ; aucune optimisation native CPU.

Les quatre DEB sortent dans EXTERNAL_ROOT/packages/bullseye/6.12.115-1.
Le paquetage exporte les headers/kbuild, copie et compare la .config, fixe
CC/HOSTCC/HOSTCXX dans leur Makefile, vérifie XZ et les index kmod/depmod,
mesure les dépendances natives et contrôle les ELF. Les propriétaires root
et modes sont normalisés dans les archives. Il ne remplace ni gcc global,
ni les alternatives, ni linux-libc-dev, ni /usr/include de l'hôte.

Le paquetage ne prouve pas un démarrage. Tester séparément les paquets
reconstruits dans une VM isolée, y compris installation, démarrage, réseau,
stockage, filtrage, cgroups, module externe, retour à l'ancien noyau puis au
candidat. La validation du lot d'origine ne valide pas automatiquement un
nouveau lot. Aucun contrôleur runtime ou marqueur de succès n'est distribué
ici. La publication, les signatures APT et les essais physiques restent des
étapes distinctes. Secure Boot n'a pas été qualifié pour ce lot.

Histoire du bootstrap et corrections

Le bootstrap et make install initiaux ont réellement terminé. Une sonde de
verbosité du linker a ensuite échoué ; une reprise des seules preuves a
ajouté -Wl,-v. Un second arrêt venait de l'appel direct du checker ELF sans
bit exécutable ; l'appel via bash a réussi. Le driver livré incorpore ces
deux corrections, sans changer configure, make, install ou les wrappers.
Le diff exact est dans derivation/gcc-postinstall-corrections.diff.
Le driver historique est conservé comme texte de référence, pas comme
commande de reprise. Aucun contrôleur lié à une machine n'est inclus.

Le driver de paquetage livré contient les corrections déjà utilisées pour
la résolution usrmerge des fournisseurs, le contrôle ELF natif, la compression
XZ et la copie explicite de .config dans les headers. Ces corrections ne sont
pas de nouvelles transformations de la présente recette. Les constantes
historiques binutils 2.42 encore présentes dans la bibliothèque ne sont pas
utilisées par le chemin GCC livré : aucun binutils 2.42 n'est construit.
