[LINUX] Wie man Hello, World mit #Nix baut

Ein Hinweis zum Erstellen eines Programms mit Nix.

Grundablauf

Eine Übersicht über den grundlegenden Build-Ablauf. Erstellen Sie zunächst eine Datei "default.nix" in Ihrem Projektverzeichnis.

> mkdir myproject && cd myproject

myproject> touch default.nix

Als nächstes schreiben Sie "stdenv.mkDerivation" in default.nix. mkDerivation ist eine Funktion, die beim Erstellen eines Pakets mit Nix verwendet wird.

default.nix


with import <nixpkgs> {};
stdenv.mkDerivation { ... }

Führen Sie nach dem Schreiben von "default.nix" den Befehl "nix-build" aus, um das Paket zu erstellen.

myproject> nix-build

Nach Abschluss des Builds befindet sich in Ihrem Projektverzeichnis ein Ordner mit dem Namen "result". Die erstellte Binärdatei usw. wird darin enthalten sein.

Mindeststichprobe

Erstellen Sie den folgenden C-Quellcode.

hello.c


#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("Hello, world\n"); 
}

default.nix ist so geschrieben.

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
  '';
}

Zu diesem Zeitpunkt sieht die Struktur des Projekts folgendermaßen aus

myproject> tree
.
├── default.nix
└── hello.c

Lass uns gehen

myproject> nix-build
these derivations will be built:
  /nix/store/l46b92csn5d9ics7zfs9yb51gb5n6y4r-hello.drv
building '/nix/store/l46b92csn5d9ics7zfs9yb51gb5n6y4r-hello.drv'...
/nix/store/0a3f6ddksy17jmfzasj2np999cgkrs8a-hello

Nach dem Erstellen wird das Verzeichnis "result" erstellt.

myproject> tree -l
.
├── default.nix
├── hello.c
└── result -> /nix/store/0a3f6ddksy17jmfzasj2np999cgkrs8a-hello
    └── bin
        └── hello

Tatsächlich ist result ein Symbol für nix / store / 0a3f ...- hello. Lassen Sie uns die Binärdatei ausführen.

myproject> result/bin/hello
Hello, world

Es hat gut funktioniert.

Lesen Sie, was in default.nix geschrieben steht

Alles, was Sie mit default.nix tun, ist die Übergabe der erforderlichen Argumente an stdenv.mkDerivation.

Das Argument von "mkDerivation" ist

Wurde übergeben.

name ist der Name des Pakets und src ist der zu erstellende Quellcode. Schreiben Sie in buildCommand das zum Erstellen erforderliche Shell-Skript.

In buildCommand können Sie den Pfad, der an den Argumentschlüssel src übergeben wird, als $ src bezeichnen. Außerdem enthält "$ out" den Pfad nach dem Erstellen ("/ nix / store / 0a3f ...- hallo").

Refactoring default.nix

Schreiben wir die vorherige default.nix neu, um die anderen Funktionen der mkDerivation zu sehen.

Verwenden Sie zuerst "pname" und "version" anstelle von "name". Dadurch wird das Paket automatisch in der Form " - " benannt.

deafult.nix


with import <nixpkgs> {};
stdenv.mkDerivation {
  pname = "hello";
  version = "0.1.0";  
  src = ./hello.c;
  buildCommand = ...;
}

Hören Sie dann auf, "buildCommand" direkt in "default.nix" zu schreiben, und schreiben Sie das Build-Skript in eine separate Datei.

builder.sh


source $stdenv/setup

gcc -Wall -O2 -o hello $src
install -m555 -Dt $out/bin hello

Die erste Zeile, "source $ stdenv / setup", ist erforderlich, um die Build-Umgebung in Nix einzurichten. Übergeben Sie nach dem Schreiben des Build-Skripts den Pfad des Skripts an builder.

default.nix


with import <nixpkgs> {};
stdenv.mkDerivation {
  pname = "hello";
  version = "0.1.0";  
  src = ./hello.c;
  builder = ./builder.sh;
}

Lass uns gehen

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

Sie können sehen, dass sich der Hash geändert hat, indem Sie default.nix neu schreiben. Der gerade erstellte Build wird nicht überschrieben, aber ein neuer Build wird in einer separaten Datei erstellt. Wenn Sie das Symbol erneut spannen, können Sie anscheinend immer zum vorherigen Build zurückkehren.

Holen Sie sich die Quelle aus dem Web und erstellen Sie

Verwenden Sie keinen lokalen Quellcode mehr und versuchen Sie, den Quellcode im Web herunterzuladen und zu erstellen. Lassen Sie uns GNU / Hallo bauen. Die Projektseite ist hier.

Verwenden Sie fetchzip, um die Quelle herunterzuladen.

default.nix


stdenv.mkDerivation {
 ...
  src = fetchzip {
    url = "https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz";
    sha256 = "1im1gglfm4k10bh4mdaqzmx3lm3kivnsmxrvl6vyvmfqqzljq75l";  
  };
  ...
}

fetchzip lädt die komprimierte Quelle aus dem Web herunter und stellt sie lokal bereit. Das Argument erfordert einen Hash wie "sha256" sowie "url".

Verwenden Sie den Befehl nix-prefetch-url, um den Hash zu berechnen. Die Option "--unpack" ist für komprimierte Dateien erforderlich.

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 / hallo kann mit ./configure; make; make install erstellt werden.

Für einen typischen Build wie diesen erledigt mkDerivation das Richtige für Sie, sodass Sie builder.sh nicht von Hand schreiben müssen. Die gesamte Datei "default.nix" sieht folgendermaßen aus:

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";  
  };
}

Es ist ein kleines Detail, aber verwenden Sie "$ {}" für die Vervollständigung von Zeichenfolgen in Nix. Vergessen Sie nicht "rec".

Lass uns gehen

myproject> ls
default.nix

myproject> nix-build
these derivations will be built:
  /nix/store/q64l9f6d29zivah3sqrxlhpw8wmz3jrk-source.drv
  /nix/store/936zpfpmzxliinc69a49yn4dh67pgj6x-hello-2.10.drv
...

Das ist die grundlegende Erstellungsmethode.

Nix-Builds sind unabhängig von der Umgebung, sodass Sie sie mit nur einer "default.nix" auf jedem PC erstellen können. Ich denke, es lohnt sich, Nix nur für diesen Seelenfrieden zu verwenden.

Link zum ausführlicheren Kommentar

Wenn Sie mehr über mkDerivation erfahren möchten, lesen Sie das Handbuch und Nix Pills.

Neben fetchzip gibt es auch Funktionen zum Herunterladen der Quelle von GitHub und GitLab. Sie werden auch im Handbuch erklärt.

Leider entwickelt sich das Nix-Handbuch noch weiter. Daher fehlt dem Handbuch noch viel Inhalt. Wenn Sie tatsächlich ein Programm auf Nix erstellen, ist die Quelle des Nixpkgs-Repositorys sehr hilfreich.

Um mkDerivation frei zu handhaben, ist es auch gut, die Quelle von stdenv / setup zu lesen.

Recommended Posts

Wie man Hello, World mit #Nix baut
So zeigen Sie Hello World in Python an
Hallo Welt mit Django
[Neueste] So erstellen Sie eine Java-Umgebung unter Ubuntu
So registrieren Sie sich bei pypi
So erstellen Sie eine Django (Python) -Umgebung auf Docker
Hallo Welt (Anfänger) mit Django
So erstellen Sie eine Python-Umgebung unter Amazon Linux 2
So erstellen Sie eine neue virtuelle Python-Umgebung unter Ubuntu
So installieren Sie mysql-connector-python auf einem Mac
Verwendung von Dataiku unter Windows
Einführung in TensorFlow - Hallo World Edition
Hinweise zur Verwendung von Pywinauto
So installieren Sie das Graph-Tool unter macOS
So installieren Sie VMware-Tools unter Linux
So stellen Sie den Django-Kompressor unter Windows bereit
Hinweise zur Verwendung von featuretools
So installieren Sie OpenCV auf einem Mac
Wie man Matplotlib auf Heroku ausführt
So installieren Sie PyPy unter CentOS
Wie benutzt man Homebrew in Debian?
Missverständnisse beim Verbinden von cnn
Verwendung von Nix Package Manager
So installieren Sie TensorFlow unter CentOS 7
So erstellen Sie den MongoDB C-Sprachtreiber
So installieren Sie Maven unter CentOS
Hinweise zum Schreiben von require.txt
So installieren Sie Musik 21 unter Windows
Einführung in Ansible Teil 1'Hallo Welt !! '
Verwenden Sie Python auf Raspberry Pi 3, um die LED zu beleuchten (Hello World)
So erstellen Sie eine Python-Umgebung mit Virtualenv unter Ubuntu 18.04 LTS
Hallo Welt
Wie baue ich meinen eigenen Linux-Server?
So installieren Sie das aws-session-manager-Plugin unter Manajro Linux
So erstellen Sie eine Sphinx-Übersetzungsumgebung
Wie man pydoc auf Python Interpreter liest
So installieren Sie drobertadams / toggl-cli auf einem Mac
Wie man Mecab, neologd-ipadic auf Colab verwendet
So aktualisieren Sie PHP unter Amazon Linux 2
So verwenden Sie Google Assistant unter Windows 10
So löschen Sie Python 2.x auf einem Mac.
So zeigen Sie Piktogramme unter Manjaro Linux an
Memorandum über die Verwendung von Gremlin Python
So installieren Sie Pakete unter Alpine Linux
So installieren Sie Richzhang / Colorization unter Windows 10
So aktualisieren Sie die Sicherheit unter CentOS Linux 8
So installieren Sie Apache (httpd) unter CentOS7
Wie installiere ich php7.4 unter Linux (Ubuntu)
So installieren Sie Eclipse GlassFish 5.1.0 unter CentOS7
Flask Tutorial (von der Installation bis zur Hallo Welt)
So installieren Sie Apache (httpd) unter CentOS8
So testen Sie auf einer von Django authentifizierten Seite
Hinweise zum Ausführen von Cython unter OSX
So finden Sie große Dateien unter Linux
So installieren Sie NumPy auf Raspeye