Construire la source BSP
Objectif
Reconstruire les artefacts côté noyau (DTBs, modules OOT, modules in-tree, noyau Image) impliqués par les changements sous <source.root_path>/bsp_sources/, et écrire un manifeste que /jetson-promote-image lit pour intégrer ces sorties dans l'image BSP. Cette compétence n'écrit jamais directement dans <bsp_image.root_path>.
Prérequis
- Profil de plateforme cible actif avec
bsp_image:etsource.toolchain:résolus (exécutez d'abord/jetson-init-imageet/jetson-init-source). <source.root_path>/bsp_sources/rempli avec la disposition d'extraction côté noyau que/jetson-init-sourcematérialise.<bsp_image.root_path>/Linux_for_Tegra/source/kernel_src_build_env.shprésent (extrait depublic_sources.tbz2).- Paquets hôte :
flex,bison,libssl-dev(obligatoires) ;git,build-essential,bc,zstd(avertissement uniquement). - Chaîne d'outils croisée à
${source.toolchain}gccrésoluble sur disque.
Aperçu
Cette compétence est l'étape Build du workflow — voir ../../context/bsp-customization-workflow.md pour son rôle dans le pipeline Setup → Customize → Build → Deploy et ce qui la déclenche. La compétence prend les commits de personnalisation côté source, reconstruit les artefacts impliqués, et enregistre lesquels ont été reconstruits dans un manifeste. Les sorties restent in-tree sous <source.root_path>/bsp_sources/ ; jetson-promote-image lit le manifeste lors du déploiement pour copier chaque artefact reconstruit vers le chemin correspondant sous <bsp_image.root_path>/Linux_for_Tegra/.
Les modifications overlay uniquement (nvpmodel.conf, nvfancontrol.conf, BPMP DTB) contournent Build — les étapes customize-* les envoient directement au suivi overlay ; BPMP DTB utilise la boucle dtc décompile → édite → recompile dans ../../references/bsp-customization-bpmp-dtb.md.
Propriété de l'emplacement overlay personnalisé. Les personnalisations kernel-DT de chaque compétence customize-* se collectent en un seul tegra<soc>-<carrier-id-sku>+<module-id>-xxxx-custom.dts composite par cible active — voir ../../references/bsp-customization-kernel-dtb.md pour le protocole nom fichier / localisation / ajout. Cette compétence est le seul propriétaire de l'enregistrement Makefile par répertoire du composite (dtbo-y += <name>.dtbo) et de la ligne OVERLAY_DTB_FILE+= de la conf flash porteuse (l'étape « Enregistrer l'overlay personnalisé composite »).
Quatre modes de construction alignés sur le profil dirty-repo :
| Mode | Ce qui est construit | Auto-sélectionné quand |
|---|---|---|
| dt | DTBs NVIDIA uniquement | seulement hardware/nvidia/* ou kernel-devicetree dirty |
| oot | Modules OOT (six repos) | seulement les repos OOT dirty |
| kernel | Noyau Image + ensemble complet in-tree .ko + dtbs côté noyau |
seulement kernel/$KERNEL_SRC_DIR dirty |
| full | Tout ce qui précède + consolidation install optionnelle | ensemble dirty mixte |
Sélection du mode : auto (défaut — invoquez /jetson-build-source sans argument) parcourt l'ensemble dirty-repo ; forcez un mode spécifique en le passant comme argument de compétence.
Principe de conception : déléguer à l'upstream. Chaque primitive de construction existe déjà dans <bsp_image.root_path>/Linux_for_Tegra/source/ — le fichier env, le Makefile de haut niveau (nvidia-dtbs / modules / modules_install), le Makefile du noyau (kernel / install). La compétence pilote ces primitives contre <source.root_path>/bsp_sources/ — ne duplique jamais leur logique en shell.
Quand invoquer
- Auto-enchaîné à la fin d'une invocation Customize
customize-*chaque fois que Customize s'est engagé à un repo source côté noyau. - Ré-exécution manuelle via
/jetson-build-source [<mode>]quand :- la construction auto-enchaînée a été interrompue,
- des commits source arrivent via
git pulld'autres utilisateurs, - l'utilisateur veut forcer une reconstruction sans édition fraîche,
- l'utilisateur veut un mode spécifique (par ex. consolidation install pour un déploiement scp manuel vers un DUT).
Instructions
Résoudre la cible active + chemins + env upstream
Résolvez le profil actif selon ../../context/target-platform-contract.md. Refusez et routez dans ces cas :
| Condition | Routez vers |
|---|---|
Aucun profil actif, ou active: NA |
/jetson-set-target ou /jetson-init-target |
Le profil manque bsp_image: |
/jetson-init-image |
Le profil manque source.toolchain: |
/jetson-init-source |
<source.root_path>/bsp_sources/ manquant ou vide |
/jetson-init-source |
<bsp_image.root_path>/Linux_for_Tegra/source/kernel_src_build_env.sh manquant |
/jetson-init-image (BSP non correctement extrait) |
Liez :
WORKSPACE=<parent of target-platform/>
BSP_SRC=<bsp_image.root_path>/Linux_for_Tegra/source # primitives NVIDIA
KS=<source.root_path>/bsp_sources # notre extraction côté noyau
KOUT=<source.root_path>/.build/kernel-out # répertoire build out-of-tree mode DT
STAGE=<source.root_path>/.build/install-stage # consolidation install (full mode / opt-in)
STATE=<source.root_path>/.build-state.yaml # repère par-repo
MANIFEST=<source.root_path>/.build-manifest.yaml # liste artefacts reconstruits pour jetson-promote-image
Sourcez l'env build NVIDIA pour hériter des noms canoniques — ne codez jamais en dur kernel-noble, la liste des modules OOT, ou KERNEL_DEF_CONFIG :
source "$BSP_SRC/kernel_src_build_env.sh"
# Maintenant en scope : KERNEL_SRC_DIR (par ex. kernel-noble), KERNEL_DEF_CONFIG,
# OOT_SOURCE_LIST, kernel_name (par ex. noble), KERNEL_MODULAR_BUILD
Refusez si $KS/kernel/$KERNEL_SRC_DIR/ manque ou si un nom quelconque dans $OOT_SOURCE_LIST manque sous $KS/. Routez vers /jetson-init-source.
Résoudre la chaîne d'outils (lecture seule)
Lisez source.toolchain du profil actif (créé par jetson-init-source). Validez :
export ARCH=arm64
export CROSS_COMPILE=<source.toolchain> # tiret final obligatoire
[ -f "${CROSS_COMPILE}gcc" ] || refuse \
"source.toolchain points at ${CROSS_COMPILE}gcc which does not exist. Re-run /jetson-init-source."
Un tiret final sur CROSS_COMPILE est obligatoire — kbuild le traite comme préfixe (${CROSS_COMPILE}gcc) ; un tiret manquant se casse avec command not found. Le contrôle [ -f ] l'attrape avant tout make.
Cette compétence ne demande jamais la chaîne d'outils ou ne tente jamais d'en résoudre une manquante — c'est la responsabilité exclusive de jetson-init-source. Un champ manquant est une lacune Setup ; routez là.
Vérifiez les prérequis build-hôte une seule fois :
for p in flex bison libssl-dev; do
dpkg -s "$p" >/dev/null 2>&1 || refuse "host package missing: $p"
done
for p in git build-essential bc zstd; do
dpkg -s "$p" >/dev/null 2>&1 || warn "host package missing: $p"
done
Détecter les repos source dirty
Le fichier repère $STATE enregistre le dernier commit construit avec succès par repo côté noyau. La liste des repos est dérivée à runtime de OOT_SOURCE_LIST + kernel/$KERNEL_SRC_DIR. Pour chaque repo : HEAD ≠ repère → dirty ; éditions non engagées (git diff --quiet non-zéro) → aussi dirty.
Note Branch-A : quand bsp_sources/ est un mono-repo avec un unique .git, chaque sous-chemin canonique partage le même HEAD — le schéma repère clé toujours par sous-chemin et l'ensemble dirty fonctionne toujours (tout changement quelconque inverse le HEAD de chaque sous-chemin).
Si STATE est absent (première construction), traitez tous les repos comme propres à moins que le contexte auto-chaîn dise « Customize vient de s'engager ». Si DIRTY est vide et aucun argument mode n'a été passé : rapportez « rien à construire » et retournez.
Choisir le mode de construction
Mappez l'ensemble dirty à un mode (auto), ou honorez l'argument mode :
| Repos dirty (auto) | Mode |
|---|---|
Seulement hardware/nvidia/* ou kernel-devicetree |
dt |
Seulement sous-ensemble OOT de $OOT_SOURCE_LIST |
oot |
Seulement kernel/$KERNEL_SRC_DIR |
kernel |
| Tout mélange couvrant ce qui précède | full |
Les modes sont unionables : full exécute kernel → oot → dt dans cet ordre (kernel produit les en-têtes dont OOT a besoin ; nvidia-dtbs utilise les mêmes en-têtes générés). Un argument mode passé manuellement contourne la détection auto.
Exécuter la construction
Configuration commune + extraits de construction par mode
La configuration commune (valider les Makefiles orchestrateur, cd $KS) et les invocations make exactes pour chaque mode (dt, oot, kernel, full) plus la passe consolidation install optionnelle vivent dans references/build-modes.md. Pilotez l'extrait du mode pertinent contre les liaisons depuis l'étape « Résoudre la cible active + chemins + env upstream ».
Enregistrer l'overlay personnalisé composite (dt + full uniquement)
Ignorez si le mode sélectionné n'est pas dt ou full. L'emplacement overlay composite est documenté dans ../../references/bsp-customization-kernel-dtb.md ; cette sous-étape possède le côté build / Makefile / flash-conf.
Résolvez le chemin composite pour la cible active ($COMPOSITE_BASE, $COMPOSITE_DTS, $COMPOSITE_MK) en utilisant la famille chip, l'ID/SKU porteuse, et l'ID module du profil actif — extrait complet dans references/composite-registration.md.
Portail (symétrique). $COMPOSITE_DTS pilote les deux directions : présent → appliquez les deux patches idempotents ci-dessous ; absent → exécutez la passe cleanup pour retirer toute ligne stale dtbo-y += / OVERLAY_DTB_FILE+= d'une exécution antérieure. Chaque chemin garde OVERLAY_DTB_FILE+= de référencer un .dtbo non construit — l'application build-time de la règle pas d'édits DT in-tree directs.
- Makefile par répertoire — ajoutez
dtbo-y += <name>.dtboaprès la dernière entréedtbo-y +=littéralement nommée. Insérer après la ligne merge-back$(old-dtbo)contourne la passe préfixe$(addprefix makefile-path/,…)et la construction abandonne silencieusement le composite. Engagez au mono-repobsp_sources/. Extrait complet + justification :references/composite-registration.md. - Conf flash porteuse — ajoutez
OVERLAY_DTB_FILE+=",<name>.dtbo"avec import pristine au premier contact sur le suivi overlay. Sur un espace de travail frais le suivi est git-init vide ; importez la conf debsp_imageet engagez commepristine:avant le commit customization (contrat workflow). Extrait complet :references/composite-registration.md.
Le flip de HEAD du sous-repo parent du composite pendant un ajout customize-* est ce que la détection dirty de l'étape « Détecter les repos source dirty » consomme — aucune tenue de livres supplémentaire requise ici.
Auto-vérification avant d'invoquer nvidia-dtbs :
grep -qxF "dtbo-y += ${COMPOSITE_BASE}.dtbo" "$COMPOSITE_MK" \
|| refuse "Composite Makefile registration missing after patch."
grep -qxF "$line" "$FLASH_CONF" \
|| refuse "Composite flash-conf registration missing after patch."
Écrire le manifeste de construction
Parcourez l'ensemble DIRTY et émettez une entrée manifeste par artefact impliqué, suivant la politique trace-to-dirty — seulement les artefacts traçables à un repo source dirty. Promouvoir le bruit baseline-divergence l'attribuerait à la piste audit d'une customization (interdit).
Le mapping complet source → kbuild → destination, le schéma YAML, et les règles de filtre vivent dans references/manifest-schema.md.
Écriture atomique : envoyez en staging vers ${MANIFEST}.tmp, puis mv -f.
Mettre à jour le repère + résumé
Sur succès, réécrivez $STATE avec les nouveaux HEADs par-repo, chaîne d'outils, bsp_image.version, et dernier mode exécution (schéma dans references/manifest-schema.md).
Rapportez :
- Chaîne d'outils (depuis
source.toolchain). - Mode construction :
<dt|oot|kernel|full>(auto-sélectionné ou forcé par argument compétence). - Repos dirty et leurs nouveaux HEADs.
- Artefacts construits : décomptes par type (
.dtb,.koin-tree,.koOOT,Image). - Chemin manifeste + nombre d'entrées.
- Chemin étape install consolidée (si l'étape « Consolidation install » a exécuté).
- Prochaine étape :
/jetson-promote-image.
Si une compétence Customize a déclenché cette exécution, invitez l'utilisateur à rééditer sa requête originale.
Limitations
Le tier supérieur — modes défaillance qui bloquent une construction ou produisent silencieusement les mauvais artefacts. Voir references/long-tail-gotchas.md pour les invariants, patterns déploiement, et conseils performance.
- La résolution chaîne d'outils est le job de
jetson-init-source. Cette compétence lit seulementsource.toolchainet exporteCROSS_COMPILE. Champ manquant → refusez et routez, ne résolvez jamais in-skill. - Collision
$KS/MakefileBranch-A R36.x. Lepublic_sources.tbz2de R36.x peut laisser le Makefile propriétaire dGPU/OpenRM à$KS/Makefileau lieu de l'orchestrateur Tegra ; sa ciblemodulesrecurse danskernel-open/+src/nvidia/, tire les en-têtes hôte/lib/modules, et casse les cross-builds arm64 avec'-mlittle-endian' unrecognized. Les extractions R38+ sont non affectées. L'étape 3a de/jetson-init-sourceest la défense primaire (temps extraction) ; le contrôle « Configuration commune » ici est le filet de sécurité. Ne relaxez pas la regex. - Changements Kernel-DT : overlay-composite-uniquement, propriété split. Les édits directs aux fichiers
.dts/.dtsiin-tree sousbsp_sources/sont interdits pour les compétences customize-* — chaque changement kernel-DT atterrit comme fragment dans l'emplacement overlay composite (règle + justification). Le contenu.dtscomposite est possédé par chaque compétence customize-* ; l'enregistrement build / Makefile / flash-conf est possédé par cette compétence (porté sur l'existence du.dtscomposite — doncOVERLAY_DTB_FILE+=ne peut pas référencer un.dtbonon construit). - Le point d'insertion Makefile de l'étape « Enregistrer l'overlay personnalisé composite » importe. Insérez après la dernière entrée
dtbo-y +=littéralement nommée ; insérer après$(old-dtbo)contourne la passe préfixe$(addprefix makefile-path/,…)et la construction abandonne silencieusement votre.dtbo. La regex^dtbo-y *+= *[a-zA-Z0-9]filtre correctement ; ne la relaxez pas. - L'étape « Enregistrer l'overlay personnalisé composite » first-touch a besoin d'import pristine. Sur un espace de travail frais le suivi overlay est git-init vide — la conf flash porteuse est importée de
bsp_imageet engagée commepristine:avant le commit customization. Les deux commits passent la porte d'acceptation workflow. - Évitez
$0nu dans les extraits shell à l'intérieur de ce SKILL.md. Quand invoqué avec un argument, le harnais expande le$0body-compétence contre le$0de l'appelant avant de passer le prompt rendu au modèle. Utilisez le splice ligne basé sed ouawk -v ROW="$0". Voirreferences/composite-registration.md. - Pas d'étape overlay. Les sorties construction restent où la construction les a mises ; le manifeste est le contrat vers
jetson-promote-image. Divergence délibérée de l'indirection originale overlay→promote — garde l'ensemble complet sortie construction hors de l'historique git du suivi overlay. KERNEL_HEADERSvsKERNEL_OUTPUTen mode DT. Sémantiques différentes (srctree vs objtree) ; ne les collapsiez pas. L'extrait l'étape « DT-only » est correct tel écrit.- Prérequis mode OOT : en-têtes noyau précédemment construits. Une invocation
ootmanuelle contre un arbre jamais construit refuse avec « exécutezkernel(oufull) d'abord » plutôt que de produire une erreur build confuse.
Exemples
Auto-détecter le mode depuis l'arbre source dirty (invocation typique) :
/jetson-build-source
Forcer un mode unique (contourne auto-détect) :
/jetson-build-source dt # reconstruire DTBs NVIDIA seulement
/jetson-build-source oot # reconstruire modules OOT seulement
/jetson-build-source kernel # reconstruire noyau Image + modules in-tree
/jetson-build-source full # reconstruire tout + consolidation install
Chaîne typique après qu'une compétence customize- s'engage à un repo côté noyau (la compétence customize- appelle ceci automatiquement) :
/jetson-customize-pcie ... # s'engage à hardware/nvidia/.../nv-public
↓
/jetson-build-source # auto-sélectionne `dt` depuis l'ensemble dirty
↓
/jetson-promote-image # lit .build-manifest.yaml, envoie en staging vers bsp_image
↓
/jetson-flash-image # flashe
Dépannage
| Erreur | Cause | Solution |
|---|---|---|
source.toolchain points at <...>gcc which does not exist |
Champ chaîne d'outils stale (chemin déplacé, install manquant) | Ré-exécutez /jetson-init-source pour re-résoudre. Cette compétence ne résout jamais chaîne d'outils elle-même. |
No rule to make target '$KOUT/scripts/Makefile.compiler' |
KERNEL_HEADERS réglé à $KOUT au lieu de $KS/kernel/$KERNEL_SRC_DIR |
Utilisez l'extrait mode DT dans references/build-modes.md verbatim — srctree vs objtree ne doivent pas collapser. |
'-mlittle-endian' unrecognized pendant make modules |
Collision $KS/Makefile Branch-A R36.x — Makefile dGPU/OpenRM à la place d'orchestrateur Tegra |
Le filet sécurité Common-setup répare normalement ; sinon, git checkout HEAD -- Makefile puis ré-exécutez l'étape 3a de /jetson-init-source. |
run kernel (or full) first sur invocation oot manuelle |
Arbre source noyau jamais préparé | Exécutez /jetson-build-source kernel (ou full) une fois, puis oot. |
nothing to build et édits dirty existent |
Édits non engagés dans un sous-repo mais repère .build-state.yaml correspond déjà à HEAD |
Engagez les édits, ou ré-exécutez avec un argument mode explicite (/jetson-build-source dt etc.). |
.dtbo composite silencieusement manquant de l'ensemble sortie |
Insertion Makefile per-dir atterri après ligne merge-back $(old-dtbo) |
Voir references/composite-registration.md — insérez après la dernière entrée dtbo-y += littéralement nommée. |
| L'étape Promote copie artefacts baseline stale | Filtre trace-to-dirty ignoré après un cp manuel dans $KS |
Éditez seulement via une compétence customize-* ou git ; le détecteur dirty clé sur git HEAD, pas file mtime. |
host package missing: <pkg> |
flex/bison/libssl-dev refusent ; autres avertissent. |
sudo apt install <pkg> per references/upstream-recipe.md. |
Voir aussi
references/build-modes.md— extraitsmakepar mode + consolidation install.references/manifest-schema.md— schémas.build-manifest.yaml+.build-state.yaml.references/composite-registration.md— extraits complets étape « Enregistrer l'overlay personnalisé composite » + justification.references/long-tail-gotchas.md— invariants, patterns déploiement, conseils performance.references/upstream-recipe.md— recette NVIDIA verbatim, divergences, statut spec.../../context/bsp-customization-workflow.md— protocole édition espace de travail.../../references/bsp-customization-kernel-dtb.md— contrat overlay customisé composite.../../references/bsp-customization-bpmp-dtb.md— contrat édition BPMP-DTB (routé autour cette compétence).../jetson-init-source/SKILL.md— Setup ; créesource.toolchain.../jetson-promote-image/SKILL.md— Promoteur Deploy ; lit le manifeste de cette compétence.