Les attaques de chaîne d'approvisionnement sont de plus en plus communes et sont notamment difficiles à détecter. La compilation reproductible (reproducible builds) est une manière de prévenir ces attaques, en permettant à quiconque de recréer les artefacts de compilation de manière exacte (bit à bit) à partir du code source. Or, les outils de compilation nécessaires pour recréer ces artefacts sont à leur tour vulnérables à ces attaques. Ainsi, une solution complète au problème de chaîne d'approvisionnement doit inclure la compilation reproductible de tous ces outils. Avec ce problème comme motivation, nous démontrons l'utilité des shells POSIX, disponibles sur la grande majorité des ordinateurs, comme point de départ pour la compilation reproductible. Pour ce faire, nous présentons pnut-sh, un compilateur C vers POSIX shell écrit en C dont la sortie est conçue pour être lisible. Puisque le compilateur peut s'auto-compiler, il est donc possible de produire un script implémentant un compilateur C qui ne nécessite qu'un shell conforme à la spécification POSIX tels que bash, ksh, zsh, etc. Ensemble, pnut-sh et le shell servent alors de point de départ pour la compilation d'une série d'outils de plus en plus complets jusqu'à atteindre une version récente du GNU Compiler Collection (GCC). GCC peut alors servir de fondation pour tout autre outil. Afin de pouvoir passer de l'environnement limité du shell au reste du système d'exploitation, nous présentons également pnut-exe, un compilateur C plus complet produisant des exécutables x86, ainsi qu'une implémentation sur mesure de la bibliothèque standard C depuis lesquels le Tiny C Compiler (TCC) peut être compilé. TCC peut ensuite être utilisé pour amorcer GCC. Le résultat est une chaîne de compilation produite exclusivement à partir d'un shell et de fichiers source lisibles. Nous discutons de comment compiler reproductiblement TCC à partir du shell POSIX, le niveau de support pour le langage C requis pour atteindre cet objectif, l'architecture des deux versions de pnut, la génération de code shell POSIX portable et suffisamment performant, et finalement, l'empaquetage et la distribution des fichiers servant au processus de compilation reproductible de TCC.
Software supply chain attacks are increasingly frequent and can be hard to guard against. Reproducible builds ensure that generated artifacts (executable programs) can be reliably created from their source code. However, the tools used by the build process are also vulnerable to supply chain attacks, so a complete solution must also include reproducible builds for the various compilers used. With this problem as our main motivation, we demonstrate that the widely available POSIX shell can serve as the only trusted pre-built binary for reproducible builds by presenting pnut-sh, a C to POSIX shell transpiler written in C that generates human-readable shell code. Because the compiler is self-applicable, it is possible to distribute a human-readable shell script implementing a C compiler that depends only on the existence of a POSIX-compliant shell such as bash, ksh, zsh, etc. Together, pnut-sh and the shell serve as the seed for a chain of builds that create increasingly capable compilers up to the most recent version of the GNU Compiler Collection (GCC), which is a convenient basis to build any other required tool in the toolchain. To bridge from POSIX shell to the rest of the operating system, we also present pnut-exe, a more fully-featured C compiler that targets x86 and its bespoke C standard library implementation from which the Tiny C Compiler (TCC) can be compiled. In turn, TCC can then be used to bootstrap GCC. The end result is a complete build toolchain built only from a shell and human-readable source files. We discuss how TCC can be reproducibly built from POSIX shell, the level of C language support needed to achieve this goal, the architecture of both versions of pnut, the generation of portable and performant POSIX shell code from C, and finally, the packaging and distribution of the files used in the reproducible build process.