Suivant: La chaîne d’outils GCC, Précédent: Invoquer guix environment
, Monter: Développement [Table des matières][Index]
guix pack
Parfois vous voulez passer un logiciel à des gens qui n’ont pas (encore !)
la chance d’utiliser Guix. Vous leur diriez bien de lancer guix
package -i quelque chose
mais ce n’est pas possible dans ce cas.
C’est là que guix pack
entre en jeu.
Remarque : Si vous cherchez comment échanger des binaires entre des machines où Guix est déjà installé, voir Invoquer
guix copy
, Invoquerguix publish
, et Invoquerguix archive
.
La commande guix pack
crée un pack ou lot de logiciels
: elle crée une archive tar ou un autre type d’archive contenant les
binaires pour le logiciel qui vous intéresse ainsi que ses dépendances.
L’archive qui en résulte peut être utilisée sur toutes les machines qui
n’ont pas Guix et les gens peuvent lancer exactement les mêmes binaires que
ceux que vous avez avec Guix. Le pack lui-même est créé d’une manière
reproductible au bit près, pour que n’importe qui puisse vérifier qu’il
contient bien les résultats que vous prétendez proposer.
Par exemple, pour créer un lot contenant Guile, Emacs, Geiser et toutes leurs dépendances, vous pouvez lancer :
$ guix pack guile emacs emacs-geiser … /gnu/store/…-pack.tar.gz
Le résultat ici est une archive tar contenant un répertoire
/gnu/store avec tous les paquets nécessaires. L’archive qui en
résulte contient un profil avec les trois paquets qui vous intéressent
; le profil est le même qui celui qui aurait été créé avec guix
package -i
. C’est ce mécanisme qui est utilisé pour créer les archives tar
binaires indépendantes de Guix (voir Installation binaire).
Les utilisateurs de ce pack devraient lancer /gnu/store/…-profile/bin/guile pour lancer Guile, ce qui n’est pas très pratique. Pour éviter cela, vous pouvez créer, disons, un lien symbolique /opt/gnu/bin vers le profil :
guix pack -S /opt/gnu/bin=bin guile emacs emacs-geiser
De cette façon, les utilisateurs peuvent joyeusement taper /opt/gnu/bin/guile et profiter.
Et si le destinataire de votre pack n’a pas les privilèges root sur sa
machine, et ne peut donc pas le décompresser dans le système de fichiers
root ? Dans ce cas, vous pourriez utiliser l’option --relocatable
(voir plus bas). Cette option produit des binaires repositionnables,
ce qui signifie qu’ils peuvent être placés n’importe où dans l’arborescence
du système de fichiers : dans l’exemple au-dessus, les utilisateur·rice·s
peuvent décompresser votre archive dans leur répertoire personnel et lancer
directement ./opt/gnu/bin/guile.
Autrement, vous pouvez produire un pack au format d’image Docker avec la commande suivante :
guix pack -f docker -S /bin=bin guile guile-readline
Le résultat est une archive tar qui peut être passée à la commande
docker load
, puis à docker run
:
docker load < file docker run -ti guile-guile-readline /bin/guile
where file is the image returned by guix pack
, and
guile-guile-readline
is its “image tag”. See the
Docker
documentation for more information.
Autrement, vous pouvez produire une image SquashFS avec la commande suivante :
guix pack -f squashfs bash guile emacs emacs-geiser
Le résultat est une image de système de fichiers SquashFS qui peut soit être
montée directement soit être utilisée comme image de conteneur de système de
fichiers avec l’Singularity container
execution environment, avec des commandes comme singularity shell
ou singularity exec
.
Another format internally based on SquashFS is AppImage. An AppImage file can be created and executed without any special privileges:
file=$(guix pack -f appimage --entry-point=bin/guile guile) $file --help
Diverses options en ligne de commande vous permettent de personnaliser votre pack :
--format=format
-f format
Produire un pack dans le format donné.
Les formats disponibles sont :
tarball
C’est le format par défaut. Il produit une archive tar contenant tous les binaires et les liens symboliques spécifiés.
docker
This produces a tarball that follows the
Docker Image Specification. By default, the “repository name” as it
appears in the output of the docker images
command is computed
from package names passed on the command line or in the manifest file.
Alternatively, the “repository name” can also be configured via the
--image-tag option. Refer to --help-docker-format for
more information on such advanced options.
squashfs
Cela produit une image SquashFS contenant tous les binaires et liens symboliques spécifiés, ainsi que des points de montages vides pour les systèmes de fichiers virtuels comme procfs.
Remarque : Singularity requiert que vous fournissiez /bin/sh dans l’image. Pour cette raison,
guix pack -f squashfs
implique toujours-S /bin=bin
. Ainsi, votre invocationguix pack
doit toujours commencer par quelque chose comme :guix pack -f squashfs bash …Si vous oubliez le paquet
bash
(ou similaire),singularity run
etsingularity exec
vont échouer avec un message « no such file or directory » peu utile.
deb
¶Cela produit une archive Debian (un paquet avec l’extension ‘.deb’) contenant tous les binaires et les liens symboliques spécifiés, qui peut être installée sur n’importe quelle distribution GNU(/Linux) basée sur dpkg. Vous trouverez des options avancées avec l’option --help-deb-format. Elles permettent d’insérer des fichiers control pour un contrôle plus fin, comme pour activer des trigger ou fournir un script de configuration pour mainteneur pour lancer du code de configuration arbitraire à l’installation.
guix pack -f deb -C xz -S /usr/bin/hello=bin/hello hello
Remarque : Because archives produced with
guix pack
contain a collection of store items and because eachdpkg
package must not have conflicting files, in practice that means you likely won’t be able to install more than one such archive on a given system. You can nonetheless pack as many Guix packages as you want in one such archive.
Attention :
dpkg
prendra possession de tout fichier contenu dans le pack qu’il ne connaît pas. Il est peu avisé d’installer des fichiers ‘.deb’ produits par Guix sur un système où /gnu/store est partagé avec un autre logiciel, comme une installation de Guix ou d’autres packs non deb.
rpm
¶This produces an RPM archive (a package with the ‘.rpm’ file extension)
containing all the specified binaries and symbolic links, that can be
installed on top of any RPM-based GNU/Linux distribution. The RPM format
embeds checksums for every file it contains, which the rpm
command
uses to validate the integrity of the archive.
Advanced RPM-related options are revealed via the --help-rpm-format option. These options allow embedding maintainer scripts that can run before or after the installation of the RPM archive, for example.
The RPM format supports relocatable packages via the --prefix
option of the rpm
command, which can be handy to install an RPM
package to a specific prefix.
guix pack -f rpm -R -C xz -S /usr/bin/hello=bin/hello hello
sudo rpm --install --prefix=/opt /gnu/store/...-hello.rpm
Remarque : Contrary to Debian packages, conflicting but identical files in RPM packages can be installed simultaneously, which means multiple
guix pack
-produced RPM packages can usually be installed side by side without any problem.
Attention :
rpm
assumes ownership of any files contained in the pack, which means it will remove /gnu/store upon uninstalling a Guix-generated RPM package, unless the RPM package was installed with the --prefix option of therpm
command. It is unwise to install Guix-produced ‘.rpm’ packages on a system where /gnu/store is shared by other software, such as a Guix installation or other, non-rpm packs.
appimage
¶This produces an AppImage file with the ‘.AppImage’ extension. AppImage is a SquashFS volume prefixed with a runtime that mounts the SquashFS file system and executes the binary provided with --entry-point. This results in a self-contained archive that bundles the software and all its requirements into a single file. When the file is made executable it runs the packaged software.
guix pack -f appimage --entry-point=bin/vlc vlc
The runtime used by AppImages invokes the fusermount3
command to
mount the image quickly. If that command is unavailable, the AppImage fails
to run, but it can still be started by passing the
--appimage-extract-and-run flag.
Attention : When building an AppImage, always pass the --relocatable option (or -R, or -RR) to make sure the image can be used on systems where Guix is not installed. A warning is printed when this option is not used.
guix pack -f appimage --entry-point=bin/hello --relocatable hello
Remarque : The resulting AppImage does not conform to the complete standard as it currently does not contain a .DirIcon file. This does not impact functionality of the AppImage itself, but possibly that of software used to manage AppImages.
Remarque : As the generated AppImage packages the complete dependency graph, it will be larger than comparable AppImage files found online, which depend on host system libraries.
--relocatable
-R
Produire des binaires repositionnables — c.-à-d. des binaires que vous pouvez placer n’importe où dans l’arborescence du système de fichiers et les lancer à partir de là.
Lorsque vous passez cette option une fois, les binaires qui en résultent demandent le support des espaces de nom utilisateurs dans le noyau Linux ; lorsque vous la passez deux fois18, les binaires repositionnables utilisent PRoot si les espaces de noms ne sont pas utilisables, et ça fonctionne à peu près partout — voir plus bas pour comprendre les implications.
Par exemple, si vous créez un pack contenant Bash avec :
guix pack -RR -S /mybin=bin bash
… vous pouvez copier ce pack sur une machine qui n’a pas Guix et depuis votre répertoire personnel en tant qu’utilisateur non-privilégié, lancer :
tar xf pack.tar.gz ./mybin/sh
Dans ce shell, si vous tapez ls /gnu/store
, vous remarquerez que
/gnu/store apparaît et contient toutes les dépendances de
bash
, même si la machine n’a pas du tout de /gnu/store ! C’est
sans doute la manière la plus simple de déployer du logiciel construit avec
Guix sur une machine sans Guix.
Remarque : Par défaut ,les binaires repositionnables s’appuient sur les espaces de noms utilisateurs du noyau Linux, qui permet à des utilisateurs non-privilégiés d’effectuer des montages et de changer de racine. Les anciennes versions de Linux ne le supportait pas et certaines distributions GNU/Linux le désactive.
Pour produire des binaires repositionnables qui fonctionnent même sans espace de nom utilisatrice·eur, passez --relocatable ou -R deux fois. Dans ce cas, les binaires testeront la prise en charge des espaces de noms utilisatrice·eur·s et utiliseront PRoot s’ils ne sont pas pris en charge. Les moteurs d’exécution suivants sont pris en charge :
default
Essayez les espaces de noms utilisateur·rice·s et revenez à PRoot si les espaces de noms utilisateur·rice·s ne sont pas pris en charge (voir ci-dessous).
performance
Essayez les espaces de noms utilisateur·rice·s et revenez à Fakechroot si les espaces de noms utilisateur·rice·s ne sont pas pris en charge (voir ci-dessous).
userns
Lance le programme à travers les espaces de nom utilisateur·rice et échoue s’ils ne sont pas supportés.
proot
Passez à travers PRoot. Le programme PRoot fournit la prise en charge nécessaire pour la virtualisation du système de fichier. Il y parvient en utilisant l’appel système
ptrace
sur le programme courant. Cette approche a l’avantage de fonctionner sans demander de support spécial de la part du noyau, mais occasionne un coût supplémentaire en temps pour chaque appel système effectué.fakechroot
Passez à travers Fakechroot. Fakechroot virtualise les accès au système de fichier en interceptant les appels vers les fonctions de la bibliothèque C telles que
open
,stat
,exec
, et ainsi de suite. Contrairement à PRoot, il n’engendre que très peu de coûts généraux. Cependant, il ne fonctionne pas encore tout-à-fait : par exemple, certains accès au système de fichier effectués à partir de la bibliothèque C ne sont pas interceptés, et les accès au système de fichier effectués via les appels système directs ne sont pas non plus interceptés, conduisant à un comportement erratique.Lors de l’exécution d’un programme complet, vous pouvez demander explicitement l’un des moteurs d’exécution énumérés ci-dessus en définissant en conséquence la variable d’environnement
GUIX_EXECUTION_ENGINE
.
--entry-point=commande
Use command as the entry point of the resulting pack, if the
pack format supports it—currently docker
, appimage
, and
squashfs
(Singularity) support it. command must be relative to
the profile contained in the pack.
Le point d’entrée spécifie la commande que des outils comme docker
run
or singularity run
lancent automatiquement par défaut. Par
exemple, vous pouvez faire :
guix pack -f docker --entry-point=bin/guile guile
Le pack résultant peut être facilement chargé et docker run
sans
arguments supplémentaires engendrera bin/guile
:
docker load -i pack.tar.gz docker run image-id
--entry-point-argument=command
-A command
Use command as an argument to entry point of the resulting
pack. This option is only valid in conjunction with --entry-point
and can appear multiple times on the command line.
guix pack -f docker --entry-point=bin/guile --entry-point-argument="--help" guile
--max-layers=n
Specifies the maximum number of Docker image layers allowed when building an image.
guix pack -f docker --max-layers=100 guile
This option allows you to limit the number of layers in a Docker image. Docker images are comprised of multiple layers, and each layer adds to the overall size and complexity of the image. By setting a maximum number of layers, you can control the following effects:
--expression=expr
-e expr
Considérer le paquet évalué par expr.
Cela a le but identique que l’option de même nom de guix build
(voir --expression
dans guix
build
).
--file=fichier
Build a pack containing the package or other object the code within file evaluates to.
This has the same purpose as the same-named option in guix build
(voir --file in guix build
),
but it has no shorthand, because -f already means
--format.
--manifest=fichier
-m fichier
Utiliser les paquets contenus dans l’objet manifeste renvoyé par le code Scheme dans fichier. Vous pouvez répéter cette option plusieurs fois, auquel cas les manifestes sont concaténés.
Elle a un but similaire à l’option de même nom dans guix package
(voir --manifest) et utilise les mêmes
fichiers manifeste. Ils vous permettent de définir une collection de
paquets une fois et de l’utiliser aussi bien pour créer des profils que pour
créer des archives pour des machines qui n’ont pas Guix d’installé.
Remarquez que vous pouvez spécifier soit un fichier manifeste,
soit une liste de paquet, mais pas les deux.
Voir Écrire un manifeste pour des informations sur l’écriture d’un
manifeste. Voir guix shell
--export-manifest
, pour des informations sur la « conversion » des options
de la ligne de commande en un manifeste.
--system=système
-s système
Tenter de construire pour le système — p. ex. i686-linux
—
plutôt que pour le type de système de l’hôte de construction.
--target=triplet
¶Effectuer une compilation croisée pour triplet qui doit être un
triplet GNU valide, comme ""aarch64-linux-gnu""
(voir GNU configuration triplets dans Autoconf).
--compression=outil
-C outil
Compresser l’archive résultante avec outil — l’un des outils parmi
gzip
, zstd
, bzip2
, xz
, lzip
, ou
none
pour aucune compression.
--symlink=spec
-S spec
Ajouter les liens symboliques spécifiés par spec dans le pack. Cette option peut apparaître plusieurs fois.
spec a la forme source=cible
, où source est
le lien symbolique qui sera créé et cible est la cible du lien.
Par exemple, -S /opt/gnu/bin=bin
crée un lien symbolique
/opt/gnu/bin qui pointe vers le sous-répertoire bin du profil.
--save-provenance
Sauvegarder les informations de provenance des paquets passés sur la ligne de commande. Les informations de provenance contiennent l’URL et le commit des canaux utilisés (voir Canaux).
Les informations de provenance sont sauvegardées dans le fichier /gnu/store/…-profile/manifest du pack, avec les métadonnées de paquets habituelles — le nom et la version de chaque paquet, leurs entrées propagées, etc. Ce sont des informations utiles pour le destinataire du pack, qui sait alors comment le pack a (normalement) été obtenu.
Cette option n’est pas activée par défaut car, comme l’horodatage, les informations de provenance ne contribuent en rien au processus de construction. En d’autres termes, il y a une infinité d’URL et d’ID de commit qui permettent d’obtenir le même pack. Enregistrer de telles métadonnées « silencieuses » dans la sortie casse donc éventuellement la propriété de reproductibilité au bit près.
--root=fichier
¶-r fichier
Fait de fichier un lien symbolique vers le résultat, et l’enregistre en tant que racine du ramasse-miettes.
--localstatedir
--profile-name=nom
Inclus le « répertoire d’état local », /var/guix, dans le lot qui en
résulte, et notamment le profil
/var/guix/profiles/per-user/root/nom — par défaut nom est
guix-profile
, ce qui correspond à ~root/.guix-profile.
/var/guix contient la base de données du dépôt (voir Le dépôt)
ainsi que les racines du ramasse-miettes (voir Invoquer guix gc
). Le
fournir dans le pack signifie que le dépôt et « complet » et gérable par
Guix ; ne pas le fournir dans le pack signifie que le dépôt est « mort » :
aucun élément ne peut être ajouté ni enlevé après l’extraction du pack.
Un cas d’utilisation est l’archive binaire indépendante de Guix (voir Installation binaire).
--derivation
-d
Affiche le nom de la dérivation que le pack construit.
--bootstrap
Utiliser les programmes d’amorçage pour construire le pack. Cette option n’est utile que pour les personnes qui développent Guix.
En plus, guix pack
supporte toutes les options de construction
communes (voir Options de construction communes) et toutes les options de
transformation de paquets (voir Options de transformation de paquets).
Il y a une astuce
pour s’en souvenir : on peut envisager -RR
, qui ajoute le support
PRoot, comme étant l’abréviation de « Réellement Repositionnable ». Pas
mal, hein ?
Suivant: La chaîne d’outils GCC, Précédent: Invoquer guix environment
, Monter: Développement [Table des matières][Index]