Suivant: Options de construction supplémentaires, Précédent: Options de construction communes, Monter: Invoquer guix build
[Table des matières][Index]
Un autre ensemble d’options de la ligne de commande supportés par
guix build
et aussi guix package
sont les options
de transformation de paquets. Ce sont des options qui rendent possible la
définition de variantes de paquets — par exemple, des paquets
construit à partir de sources différentes. C’est une manière simple de
créer des paquets personnalisés à la volée sans avoir à taper les
définitions de variantes de paquets (voir Définition des paquets).
Les options de transformation des paquets sont préservées dans les mises à
jour : guix upgrade
tente d’appliquer aux paquets mis à jour les
options de transformation initialement utilisées lors de la création du
profil.
Les options disponibles sont énumérées ci-dessous. La plupart des commandes les prennent en charge, ainsi qu’une option --help-transform qui liste toutes les options disponibles et un synopsis (ces options ne sont pas affichées dans la sortie --help par souci de concision).
--tune[=cpu]
Utilise les versions des paquets marqués comme « réglables » optimisées pour
cpu. Lorsque cpu est native
, ou s’il est omis, règle pour
le CPU sur lequel la commande guix
est lancée.
Les noms de cpu valides sont ceux reconnus par le compilateur
sous-jacent, par défaut la collection de compilateurs de GNU (GCC). Sur les
processurs x86_64, cela comprend les noms des CPU comme nehalem
,
haswell
et skylake
(voir -march
dans Using the GNU Compiler Collection (GCC)).
Au fur et à mesure de la sortie de nouvelles générations de CPU, de nouvelles instructions sont ajoutées à l’ensemble d’instruction standard de l’architecture (ISA), en particulier des instructions pour le calcul parallèle instruction-unique/données-multiples (SIMD). Par exemple, alors que les CPU Core2 et Skylake implémentent tous deux l’ISA x86_64, seul ce dernier prend en charge les instructions SIMD AVX2.
Le principal bénéfice attendu de --tune est que les programmes
peuvent utiliser ces fonctionnalités SIMD et qu’ils n’ont pas déjà un
mécanisme pour choisir le bon code optimisé à l’exécution. Les paquets qui
possèdent la propriété tunable?
sont considérés comme des
paquets réglables par l’option --tune ; une définition de
paquet avec la bonne propriété ressemble à ceci :
(package
(name "hello-simd")
;; ...
;; Ce paquet peut bénéficier des extensions SIMD donc
;; on le marque « réglable ».
(properties '((tunable? . #t))))
Les autres paquets ne sont pas considérés comme réglables. Cela permet à Guix d’utiliser des binaires génériques dans le cas où le réglage pour un CPU particulier ne donnera probablement aucun avantage.
Les paquets réglés sont construits avec -march=CPU
; sous le
capot, l’option -march est passée à l’enveloppe par une enveloppe
du compilateur. Comme la machine de construction peut ne pas être capable de
lancer du code pour la micro-architecture CPU cible, la suite de tests n’est
pas lancée lors de la construction d’un paquet réglé.
Pour réduire les reconstructions au minimum, les paquets réglés sont greffés sur les paquets qui en dépendent (voir grafts). Ainsi, utiliser --no-grafts annule l’effet de --tune.
Nous appelons cette technique le multi-versionement des paquets : on peut construire plusieurs variantes d’un paquet réglable, une pour chaque variante de CPU. C’est la contrepartie à gros grain du multi-versionement fonctionnel implémenté par la chaine d’outils de GNU (voir Function Multiversioning dans Using the GNU Compiler Collection (GCC)).
--with-source=source
--with-source=paquet=source
--with-source=paquet@version=source
Utilise source comme la source de paquet, et version comme
son numéro de version. source doit être un nom de fichier ou une URL,
comme pour guix download
(voir Invoquer guix download
).
Lorsque paquet est omis, la commande utilisera le nom de paquet
spécifié par la base de source — p. ex. si source est
/src/guix-2.0.10.tar.gz
, le paquet correspondant est guile
.
De même, lorsque version est omis, la chaîne de version est inférée à
partir de source ; dans l’exemple précédent, il s’agit de
2.0.10
.
Cette option permet aux utilisateurs d’essayer des version des paquets
différentes de celles fournies par la distribution. L’exemple ci-dessous
télécharge ed-1.7.tar.g depuis un miroir GNU et l’utilise comme
source pour le paquet ed
:
guix build ed --with-source=mirror://gnu/ed/ed-1.4.tar.gz
En tant que développeur·euse, --with-source permet de tester facilement des version bêta, et même de vérifier leur impact sur les paquets qui en dépendent :
guix build elogind --with-source=…/shepherd-0.9.0rc1.tar.gz
… ou pour construire un dépôt de gestion de version dans un environnement vierge :
$ git clone git://git.sv.gnu.org/guix.git $ guix build guix --with-source=guix@1.0=./guix
--with-input=paquet=remplaçant
Remplace la dépendance sur paquet par une dépendance à
remplaçant. paquet doit être un nom de paquet et
remplaçant doit être une spécification de paquet comme guile
ou
guile@1.8
.
Par exemple, la commande suivante construit Guix, mais remplace sa
dépendance à la version stable actuelle de Guile par une dépendance à une
ancienne version de Guile, guile@2.2
:
guix build --with-input=guile=guile@2.2 guix
C’est un remplacement récursif profond. Donc dans cet exemple, à la fois
guix
et ses dépendances guile-json
(qui dépend aussi de
guile
) sont reconstruits avec guile@2.2
.
This is implemented using the package-input-rewriting/spec
Scheme
procedure (voir package-input-rewriting/spec
).
--with-graft=paquet=remplaçant
Cette option est similaire à --with-input mais avec une différence importante : plutôt que de reconstruire la chaîne de dépendance complète, remplaçant est construit puis greffé sur les binaires qui référençaient initialement paquet. Voir Mises à jour de sécurité, pour plus d’information sur les greffes.
Par exemple, la commande ci-dessous greffe la version 3.5.4 de GnuTLS sur Wget et toutes ses dépendances, en remplaçant les références à la version actuelle de GnuTLS à laquelle ils se réfèrent actuellement :
guix build --with-graft=gnutls=gnutls@3.5.4 wget
Cela a l’avantage d’être bien plus rapide que de tout reconstruire. Mais il y a un piège : cela ne fonctionne que si paquet et remplaçant sont strictement compatibles — par exemple, s’ils fournissent une bibliothèque, l’interface binaire applicative (ABI) de ces bibliothèques doivent être compatibles. Si remplaçant est incompatible avec paquet, alors le paquet qui en résulte peut devenir inutilisable. À utiliser avec précaution !
--with-debug-info=paquet
Construire paquet de manière à préserver ses informations de débogage
et les greffer sur les paquets qui en dépendent. Cela est utile si
paquet ne fournit pas déjà les informations de débogage sous forme de
sortie debug
(voir Installer les fichiers de débogage).
Par exemple, supposons que vous subissiez un plantage de Inkscape et que
vous vouliez voir ce qui se passe dans GLib, une bibliothèque au fond du
graphe de dépendance d’Inkscape. GLib n’a pas de sortie debug
, donc
le débogage est difficile. Heureusement, vous reconstruisez la GLib avec
les informations de débogage et vous l’installez dans Inkscape :
guix install inkscape --with-debug-info=glib
Seule GLib doit être recompilée, ce qui prend un temps raisonnable. Voir Installer les fichiers de débogage, pour plus d’informations.
Remarque : Sous le capot, cette option fonctionne en passant par le ‘#:strip-binaries ? #f’ au système de construction du paquet qui nous intéresse (voir Systèmes de construction). La plupart des systèmes de compilation supportent cette option, mais certains ne le font pas. Dans ce cas, une erreur se produit.
De même, si un paquet C/C++ est construit sans
-g
(ce qui est rarement le cas), les informations de débogage resteront indisponibles même si#:strip-binaries?
est faux.
--with-c-toolchain=package=toolchain
Cette option modifie la compilation de package et de tout ce qui en dépend afin qu’ils soient construits avec toolchain au lieu de la chaîne d’outils GNU par défaut pour C/C++.
Regardez cet exemple :
guix build octave-cli \ --with-c-toolchain=fftw=gcc-toolchain@10 \ --with-c-toolchain=fftwf=gcc-toolchain@10
La commande ci-dessus construit une variante des paquets fftw
et
fftwf
en utilisant la version 10 de gcc-toolchain
au lieu de
la chaîne d’outils par défaut, puis construit une variante de l’interface en
ligne de commande GNU Octave en les utilisant. GNU Octave
lui-même est également construit avec gcc-toolchain@10
.
Cet autre exemple construit la bibliothèque Hardware Locality (hwloc
)
et ses dépendances jusqu’à intel-mpi-benchmarks
avec le compilateur
Clang C :
guix build --with-c-toolchain=hwloc=clang-toolchain \ intel-mpi-benchmarks
Remarque : Il peut y avoir des incompatibilités d’interface binaire d’application (ABI) entre les chaînes d’outils. Cela est particulièrement vrai pour la bibliothèque standard C++ et les bibliothèques de support d’exécution telles que celle d’OpenMP. En reconstruisant toutes les dépendances avec la même chaîne d’outils, --with-c-toolchain minimise les risques d’incompatibilité mais ne peut pas les éliminer entièrement. Choisissez package judicieusement.
--with-git-url=paquet=url
¶Construire paquet depuis le dernier commit de la branche master
du dépôt sur url. Les sous-modules Git du dépôt sont récupérés,
récursivement.
Par exemple, la commande suivante construit la bibliothèque Python NumPy avec le dernier commit de la branche master de Python lui-même :
guix build python-numpy \ --with-git-url=python=https://github.com/python/cpython
Cette option peut aussi être combinée avec --with-branch ou --with-commit (voir plus bas).
Évidemment, comme cela utilise le dernier commit d’une branche donnée, le résultat d’une telle commande varie avec le temps. Néanmoins c’est une manière pratique pour reconstruire des piles logicielles entières avec le dernier commit d’un ou plusieurs paquets. C’est particulièrement pratique dans le contexte d’une intégration continue.
Les clones sont gardés dans un cache dans ~/.cache/guix/checkouts pour accélérer les accès consécutifs au même dépôt. Vous pourriez vouloir le nettoyer de temps en temps pour récupérer de l’espace disque.
--with-branch=paquet=branche
Construire paquet à partir du dernier commit de la branche. Si
le champ source
de paquet est une origine avec la méthode
git-fetch
(voir Référence de origin
) ou un objet git-checkout
,
l’URL du dépôt est récupérée à partir de cette source
. Sinon, vous
devez utiliser --with-git-url pour spécifier l’URL du dépôt Git.
Par exemple, la commande suivante construit guile-sqlite3
à partir du
dernier commit de sa branche master
, puis construit guix
(qui
en dépend) et cuirass
(qui dépend de guix
) avec cette
construction spécifique de guile-sqlite3
:
guix build --with-branch=guile-sqlite3=master cuirass
--with-commit=paquet=commit
Cela est similaire à --with-branch, sauf qu’elle construite à
partir de commit au lieu du sommet d’une branche. commit doit
être un identifiant SHA1 de commit Git valide, un tag ou un identifiant dans
le style de git describe
comme 1.0-3-gabc123
.
--with-patch=paquet=fichier
Ajoute fichier à la liste des correctifs appliqués à paquet, où
paquet est une spécification comme python@3.8
ou
glibc
. fichier doit contenir un correctif ; il est appliqué
avec les drapeaux spécifiés dans l’origin
de paquet
(voir Référence de origin
), qui par défaut inclus -p1
voir patch
Directories dans Comparing and Merging Files).
Par exemple, la commande ci-dessous reconstruit Coreutils avec la bibliothèque C de GNU (glibc) corrigée avec le correctif donné :
guix build coreutils --with-patch=glibc=./glibc-frob.patch
Dans cet exemple, glibc lui-meme ainsi que tout ce qui mène à Coreutils dans le graphe des dépendances est reconstruit.
--with-configure-flag=package=flag
Append flag to the configure flags of package, where
package is a spec such as guile@3.0
or glibc
. The
build system of package must support the #:configure-flags
argument.
For example, the command below builds GNU Hello with the configure flag
--disable-nls
:
guix build hello --with-configure-flag=hello=--disable-nls
The following command passes an extra flag to cmake
as it builds
lapack
:
guix build lapack \ --with-configure-flag=lapack=-DBUILD_SHARED_LIBS=OFF
Remarque : Under the hood, this option works by passing the ‘#:configure-flags’ argument to the build system of the package of interest (voir Systèmes de construction). Most build systems support that option but some do not. In that case, an error is raised.
--with-latest=paquet
--with-version=paquet=version
Alors vous aimez les toutes dernières technologies ? L’option
--with-latest est faite pour vous ! Elle remplace les occurrence de
paquet dans le graphe des dépendances avec sa toute dernière version
en amont, telle que rapportée par guix refresh
(voir Invoquer guix refresh
).
Elle fait cela en déterminant la dernière version publiée en amont (si possible), en la téléchargeant et en l’authentifiant si elle propose une signature OpenPGP.
Par exemple, la commande ci-dessous construit Guix avec la dernière version de Guile-JSON :
guix build guix --with-latest=guile-json
L’option --with-version fonctionne de manière identique sauf qu’il vous laisse spécifier la version spécifique, en supposant que cette version existe en amont. Par exemple, pour créer un environnement de développement avec SciPy construit avec la version 1.22.4 de NumPy (en sautant sa suite de tests parce que, bon, on ne va pas attendre aussi longtemps), vous pourriez lancer :
guix shell python python-scipy --with-version=python-numpy=1.22.4
Attention : Comme ils dépende du code source publié à un certain moment sur les serveurs en amont, les déploiements qui utilisent --with-latest et --with-version peuvent ne pas être reproductibles : la source peut disparaître ou être modifiée en place sur les serveurs.
Pour déployer d’anciennes versions sans compromis avec la reproductibilité, voir
guix time-machine
.
Il y a des limites. Déjà, dans les cas où l’outil ne peut pas ou ne sait pas comment authentifier le code source, vous risquez de charger du code malveillant ; un avertissement est émis dans ce cas. Ensuite, cette option change simplement la source utilisée dans les définitions existantes des paquets, ce qui n’est pas toujours suffisant : il peut y avoir des dépendances supplémentaires qui doivent être ajoutées, des correctifs à appliquer, et plus généralement tout le travail d’assurance qualité que les développeurs de Guix font habituellement sera absent.
On vous aura prévenu ! Lorsque vous pouvez accepter ces limitations, c’est une méthode pour rester à la hauteur qui a du punch ! Nous vous encourageons à soumettre des correctifs pour les définitions des paquets quand vous aurez testé une mise à jour avec --with-latest (voir Contribuer).
--without-tests=paquet
Construire paquet sans lancer la suite de tests. Cela peut être utile dans les situations où vous voulez éviter la longue série de tests d’un paquet intermédiaire, ou si une suite de tests de paquet échoue dans un mode non déterministe. Il doit être utilisé avec précaution car l’exécution de la suite de tests est un bon moyen de s’assurer qu’un paquet fonctionne comme prévu.
L’arrêt des tests conduit à un autre élément du dépôt. Par conséquent, lorsque vous utilisez cette option, tout ce qui dépend de paquet doit être reconstruit, comme dans cet exemple :
guix install --without-tests=python python-notebook
La commande ci-dessus installe python-notebook
par dessus
python
, construit sans exécuter sa suite de tests. Pour ce faire,
elle reconstruit également tout ce qui dépend de python
, y compris
python-notebook
lui-même.
En interne, --without-tests repose sur le changement de l’option
#:tests?
de la phase check
d’un paquet (voir Systèmes de construction). Notez que certains paquets utilisent une phase check
personnalisée qui ne respecte pas le paramètre #:tests? #f
. Par
conséquent, --without-tests n’a aucun effet sur ces paquets.
Vous vous demandez comme faire la même chose dans du code Scheme, par exemple dans votre manifeste, ou comme écrire votre propre transformation de paquets ? Voir Définition de variantes de paquets, pour un aperçu des interfaces de programmation disponibles.
Suivant: Options de construction supplémentaires, Précédent: Options de construction communes, Monter: Invoquer guix build
[Table des matières][Index]