Aller au contenu

Détection de plateforme

pubm embarque un moteur intégré de détection de plateforme qui analyse l’OS, l’architecture, l’ABI et la variante à partir des chemins de fichiers. Il alimente le nommage automatique des artefacts, les valeurs par défaut de compression tenant compte de l’OS et l’objet structuré ParsedPlatform consommé par des plugins comme @pubm/plugin-brew.

Quand vous configurez une entrée releaseAssets, pubm inspecte chaque chemin de fichier correspondant pour déterminer sa plateforme.

Il existe deux modes :

Variables de capture dans le motif de chemin. Si le motif contient {os}, {arch}, {abi}, {variant} ou {platform}, pubm extrait directement les valeurs à ces emplacements :

// Triplet à la Rust : capture arch, vendor, os, abi depuis le chemin
{ path: "target/{arch}-{vendor}-{os}-{abi}/release/mytool" }
// Style Bun : capture tout le segment de plateforme
{ path: "platforms/{platform}/bin/mytool" }

Analyse automatique des segments. Lorsqu’aucune variable de capture n’est utilisée, pubm découpe le chemin en segments sur /, puis découpe chaque segment sur -. Chaque jeton obtenu est testé contre les tables OS, arch, ABI, variante et vendor, dans cet ordre. La première correspondance par catégorie l’emporte.

// Chemin : platforms/darwin-arm64/bin/pubm
// Segment : darwin-arm64 → jetons : [darwin, arm64]
// darwin → os: "darwin", arm64 → arch: "arm64"
{ path: "platforms/*/bin/pubm" }

Les jetons qui ne correspondent à aucune table sont ignorés.

La variable de modèle {platform} contient la chaîne brute de plateforme :

  • si {platform} était une variable de capture : le segment capturé tel quel (darwin-arm64)
  • si des variables de capture individuelles étaient utilisées ({os}, {arch}) : assemblée comme {os}-{arch}
  • si la détection automatique a été utilisée : le segment de chemin correspondant (darwin-arm64)

Vendor, ABI et variante sont volontairement exclus de {platform} pour garder le cas courant court et lisible. Ils sont accessibles individuellement via {vendor}, {abi} et {variant}.

interface ParsedPlatform {
/** Chaîne brute capturée ou segment correspondant */
raw: string;
os?: string;
arch?: string;
vendor?: string;
abi?: string;
variant?: string;
}

Cet objet est attaché à chaque artefact qui traverse le pipeline et est exposé aux plugins via ReleaseAsset.platform dans le hook afterRelease.

Les valeurs canoniques sont utilisées dans les variables de modèle et les comparaisons des plugins. Les alias sont reconnus pendant le parsing des chemins.

CanonicalAlias
darwinmacos, mac, osx, macosx
linuxlin
windowswin, win32, win64
freebsd
openbsd
netbsd
android
ios
solarissunos
illumos
aix
dragonflydragonflybsd
plan9
fuchsia
haiku
redox
CanonicalAlias
x64x86_64, amd64, x86-64
ia32i386, i486, i586, i686, x86, 386
arm64aarch64, armv8, aarch_64
armarmv7, armv7l, armv6, armv6l, armhf, armel
ppc64lepowerpc64le, ppc64el
ppc64powerpc64
ppcpowerpc
s390x
riscv64riscv64gc
loong64loongarch64, la64
mipsmips32
mipselmipsle
mips64
mips64elmips64le
wasm32wasm
wasm64
universaluniversal2, fat

Les jetons ABI apparaissent dans les triplets de cible Rust et les noms de toolchains de cross-compilation.

ValeurSignification
gnu / glibcGNU C Library
musllibc musl (adaptée au statique)
msvcruntime Microsoft Visual C++
mingw / mingw32 / mingw-w64toolchain MinGW
gnueabihfARM hard-float avec glibc
gnueabiARM soft-float avec glibc
musleabihfARM hard-float avec musl
musleabiARM soft-float avec musl
androideabiARM EABI Android
uclibcuClibc pour cibles embarquées
bionicBionic C library d’Android

Les jetons de variante expriment des niveaux de microarchitecture ou des exigences de capacités.

ValeurSignification
baselinePas d’AVX2 ; SSE4.2 uniquement
v2Niveau 2 de microarchitecture x86-64
v3Niveau 3 de microarchitecture x86-64 (AVX2)
v4Niveau 4 de microarchitecture x86-64 (AVX-512)
avx2Exigence explicite AVX2
avx512Exigence explicite AVX-512

Les jetons vendor sont reconnus pendant le parsing mais ne sont pas inclus dans la variable {platform}. Accédez-y via {vendor}.

ValeurSignification
unknownGénérique (valeur Rust par défaut pour les cibles Linux)
applePlateformes Apple (macOS, iOS)
pcPC/desktop (Windows, Solaris)
noneCibles bare-metal
platforms/darwin-arm64/bin/pubm
platforms/linux-x64/bin/pubm
platforms/windows-x64/bin/pubm.exe

Configuration :

releaseAssets: ["platforms/*/bin/pubm"]

Résultats :

Cheminosarch{platform}
platforms/darwin-arm64/bin/pubmdarwinarm64darwin-arm64
platforms/linux-x64/bin/pubmlinuxx64linux-x64
platforms/windows-x64/bin/pubm.exewindowsx64windows-x64
target/x86_64-unknown-linux-gnu/release/mytool
target/aarch64-apple-darwin/release/mytool

Configuration :

releaseAssets: [
{ path: "target/{arch}-{vendor}-{os}-{abi}/release/mytool" },
{ path: "target/{arch}-{vendor}-{os}/release/mytool" },
]

Résultats :

Cheminosarchvendorabi
x86_64-unknown-linux-gnulinuxx64unknowngnu
aarch64-apple-darwindarwinarm64apple-

Tous les alias sont résolus vers la forme canonique avant la substitution dans les modèles :

bin/myapp-amd64-macos → os: "darwin", arch: "x64"
bin/myapp-win64 → os: "windows"
bin/myapp-armv7l → arch: "arm"