[LINUX] Comment créer Hello, World avec #Nix

Une note sur la façon de construire un programme en utilisant Nix.

Flux de base

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.

Échantillon minimum

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é.

Lisez ce qui est écrit dans default.nix

Tout ce que vous faites avec default.nix est de passer les arguments requis à stdenv.mkDerivation.

L'argument de mkDerivation est

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).

Refactorisation de 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.

Récupérez la source sur le Web et créez

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.

Lien vers un commentaire plus détaillé

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

Comment créer Hello, World avec #Nix
Comment afficher Hello World en python
Hello World avec Django
[Latest] Comment créer un environnement Java sur Ubuntu
Comment s'inscrire auprès de pypi
Comment créer un environnement Django (python) sur Docker
Hello World (débutant) avec Django
Comment créer un environnement Python sur Amazon Linux 2
Comment créer un nouvel environnement virtuel Python sur Ubuntu
Comment installer mysql-connector-python sur Mac
Comment utiliser Dataiku sous Windows
Introduction à TensorFlow - Hello World Edition
Remarques sur l'utilisation de pywinauto
Comment installer Graph-Tool sur macOS
Comment installer VMware-Tools sur Linux
Comment installer pycrypto sur Windows
Comment déployer django-compresseur sous Windows
Remarques sur l'utilisation des featuretools
Comment installer OpenCV sur Mac
Comment exécuter matplotlib sur heroku
Comment installer PyPy sur CentOS
Comment utiliser l'homebrew dans Debian
Malentendu sur la façon de connecter CNN
Comment utiliser Nix Package Manager
Comment installer TensorFlow sur CentOS 7
Comment créer un pilote de langage MongoDB C
Comment installer Maven sur CentOS
Remarques sur la rédaction de requirements.txt
Comment installer Music 21 sur Windows
Introduction à Ansible Partie 1 Hello World !! '
Utilisez python sur Raspberry Pi 3 pour éclairer la LED (Hello World)
Comment créer un environnement Python à l'aide de Virtualenv sur Ubuntu 18.04 LTS
Bonjour le monde
Comment créer mon propre serveur Linux
Comment installer aws-session-manager-plugin sur Manajro Linux
Comment créer un environnement de traduction sphinx
Comment lire pydoc sur l'interpréteur python
Comment installer drobertadams / toggl-cli sur Mac
Comment utiliser mecab, neologd-ipadic sur colab
Comment mettre à jour PHP sur Amazon Linux 2
Comment utiliser l'Assistant Google sur Windows 10
Comment effacer Python 2.x sur Mac.
Comment afficher des pictogrammes sur Manjaro Linux
Mémorandum sur l'utilisation du python gremlin
Comment installer des packages sur Alpine Linux
Comment installer Richzhang / Colorisation sur Windows 10
Comment mettre à jour la sécurité sur CentOS Linux 8
Comment installer Apache (httpd) sur CentOS7
Comment installer php7.4 sur Linux (Ubuntu)
Comment installer Eclipse GlassFish 5.1.0 sur CentOS7
Tutoriel Flask (de l'installation à Hello World)
Comment installer Apache (httpd) sur CentOS8
Comment tester sur une page authentifiée par Django
Notes sur la façon d'exécuter Cython sur OSX
Comment trouver des fichiers volumineux sous Linux
Comment installer NumPy sur Raspeye