Une note sur la façon de construire un programme en utilisant Nix.
Un aperçu du flux de construction de base.
Tout d'abord, créez un fichier default.nix
dans le répertoire de votre projet.
> mkdir myproject && cd myproject
myproject> touch default.nix
Ensuite, écrivez stdenv.mkDerivation
dans default.nix.
mkDerivation
est une fonction utilisée lors de la création d'un package avec Nix.
default.nix
with import <nixpkgs> {};
stdenv.mkDerivation { ... }
Après avoir écrit default.nix
, exécutez la commande nix-build
pour construire le paquet.
myproject> nix-build
Une fois la construction terminée, vous aurez un dossier appelé «result» dans le répertoire de votre projet. Le binaire construit etc. sera inclus dans ceci.
Générez le code source C suivant.
hello.c
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello, world\n");
}
default.nix
est écrit comme ceci.
default.nix
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "hello";
src = ./hello.c;
buildCommand = ''
gcc -Wall -O2 -o hello $src
install -m555 -Dt $out/bin hello
'';
}
À ce stade, la structure du projet ressemble à ceci
myproject> tree
.
├── default.nix
└── hello.c
Allons-y
myproject> nix-build
these derivations will be built:
/nix/store/l46b92csn5d9ics7zfs9yb51gb5n6y4r-hello.drv
building '/nix/store/l46b92csn5d9ics7zfs9yb51gb5n6y4r-hello.drv'...
/nix/store/0a3f6ddksy17jmfzasj2np999cgkrs8a-hello
Après la construction, le répertoire result
est créé.
myproject> tree -l
.
├── default.nix
├── hello.c
└── result -> /nix/store/0a3f6ddksy17jmfzasj2np999cgkrs8a-hello
└── bin
└── hello
En fait, «result» est un symbole «nix / store / 0a3f ...- bonjour». Exécutons le binaire.
myproject> result/bin/hello
Hello, world
Cela a bien fonctionné.
default.nix
Tout ce que vous faites avec default.nix
est de passer les arguments requis à stdenv.mkDerivation
.
L'argument de mkDerivation
est
name
src
buildCommand
A été franchi.
name
est le nom du package et src
est le code source à construire.
Dans buildCommand
, écrivez le script shell requis pour la construction.
Dans buildCommand
, vous pouvez faire référence au chemin passé à l'argument key src
comme $ src
.
De plus, $ out
contient le chemin après la construction ( / nix / store / 0a3f ...- bonjour
).
default.nix
Pour voir les autres fonctionnalités de mkDerivation
, réécrivons default.nix
.
Tout d'abord, utilisez pname
et version
au lieu de name
.
Cela nommera automatiquement le package sous la forme «
deafult.nix
with import <nixpkgs> {};
stdenv.mkDerivation {
pname = "hello";
version = "0.1.0";
src = ./hello.c;
buildCommand = ...;
}
Arrêtez ensuite d'écrire buildCommand
directement dans default.nix
et écrivez le script de construction dans un fichier séparé.
builder.sh
source $stdenv/setup
gcc -Wall -O2 -o hello $src
install -m555 -Dt $out/bin hello
La première ligne, source $ stdenv / setup
, est requise pour configurer l'environnement de construction dans Nix.
Après avoir écrit le script de construction, passez le chemin du script à builder
.
default.nix
with import <nixpkgs> {};
stdenv.mkDerivation {
pname = "hello";
version = "0.1.0";
src = ./hello.c;
builder = ./builder.sh;
}
Allons-y
myproject> nix-build
these derivations will be built:
/nix/store/j2vxh4xm6jarf0jnm9x3sywmr1nvxdhg-hello-0.1.0.drv
building '/nix/store/j2vxh4xm6jarf0jnm9x3sywmr1nvxdhg-hello-0.1.0.drv'...
/nix/store/i8l2rmiy708sz6n486yasgzshp044kpd-hello-0.1.0
Vous pouvez voir que le hachage a changé en réécrivant default.nix. Celui que vous venez de créer ne sera pas écrasé, mais une nouvelle version sera créée dans un fichier séparé. Si vous retendez le symbole, il semble que vous puissiez toujours revenir à la version précédente.
Arrêtez d'utiliser le code source local et essayez de télécharger et de créer le code source sur le Web. Construisons GNU / hello. La page du projet est ici.
Utilisez fetchzip
pour télécharger la source.
default.nix
stdenv.mkDerivation {
...
src = fetchzip {
url = "https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz";
sha256 = "1im1gglfm4k10bh4mdaqzmx3lm3kivnsmxrvl6vyvmfqqzljq75l";
};
...
}
fetchzip
télécharge la source compressée à partir du Web et la déploie localement.
L'argument doit avoir un hachage tel que «sha256» ainsi que «url».
Utilisez la commande nix-prefetch-url
pour calculer le hachage.
L'option --unpack
est requise pour les fichiers compressés.
myproject> nix-prefetch-url --unpack 'https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz'
unpacking...
[0.7 MiB DL]
path is '/nix/store/xsh1xgry2vsf6674jhc26q8k1bv4p76s-hello-2.10.tar.gz'
1im1gglfm4k10bh4mdaqzmx3lm3kivnsmxrvl6vyvmfqqzljq75l
GNU / hello peut être construit avec ./configure; make; make install
.
Pour une construction typique comme celle-ci, mkDerivation
fera ce qu'il faut pour vous, vous n'avez donc pas à écrire builder.sh
à la main.
L'ensemble de default.nix
ressemble à ceci:
default.nix
stdenv.mkDerivation rec {
pname = "hello";
version = "2.10";
src = fetchzip {
url = "https://ftp.gnu.org/gnu/hello/${pname}-${version}.tar.gz";
sha256 = "1im1gglfm4k10bh4mdaqzmx3lm3kivnsmxrvl6vyvmfqqzljq75l";
};
}
C'est un petit détail, mais utilisez $ {}
pour compléter la chaîne dans Nix. N'oubliez pas «rec».
Allons-y
myproject> ls
default.nix
myproject> nix-build
these derivations will be built:
/nix/store/q64l9f6d29zivah3sqrxlhpw8wmz3jrk-source.drv
/nix/store/936zpfpmzxliinc69a49yn4dh67pgj6x-hello-2.10.drv
...
C'est la méthode de construction de base.
Les versions de Nix sont indépendantes de l'environnement, vous pouvez donc les créer sur n'importe quel PC avec un seul default.nix
.
Je pense que cela vaut la peine d'utiliser Nix juste pour cette tranquillité d'esprit.
Si vous voulez en savoir plus sur mkDerivation, vous pouvez vous référer au manuel et à Nix Pills.
En plus de fetchzip
, il existe également des fonctions pour télécharger la source depuis GitHub et GitLab.
Ils sont également expliqués dans le manuel.
Mais malheureusement, le manuel Nix est toujours en évolution. Par conséquent, le manuel manque toujours de beaucoup de contenu. Lors de la construction d'un programme sur Nix, la source du référentiel Nixpkgs est très utile.
Aussi, afin de gérer librement mkDerivation
, il est bon de lire la source de stdenv / setup
.
Recommended Posts