vidéo peertube - vidéo youtube - dépôt git

Nix, programmation et loi de Murphy

Quand on développe un logiciel on utilise très souvent des bibliothèques, ce qui peut apporter de nombreux problèmes :

D’après la loi de Murphy, des problèmes finissent toujours par arriver.

Les outils et OS classiques essaient de les éviter, Nix essaie de les résoudre.

Compiler un projet avec la méthode classique

Exemple du projet mydisplay : programme C++ qui affiche une image. Dépendances : cmake, opencv, pkg-config.

mkdir build
cd build
cmake ..
make
sudo make install

Compiler un projet avec Nix (version bof)

Nix permet d’installer les dépendances et de lancer les commandes de compilation automatiquement.

with import <nixpkgs> {};

stdenv.mkDerivation {
  name = "mydisplay";
  src = ./.;
  buildInputs = [ cmake pkgconfig opencv ];

  configurePhase = ''
    mkdir build
    cd build
    cmake -DCMAKE_INSTALL_PREFIX=$out ..
  '';

  buildPhase = ''
    make
  '';

  installPhase = ''
    make install
  '';
}

Compiler un projet avec Nix (version bien)

On peut simplifier le fichier de configuration car Nix analyse les dépendances et détermine automatique le système de compilation (autotools, cmake…).

with import <nixpkgs> {};

stdenv.mkDerivation {
  name = "mydisplay";
  src = ./.;
  buildInputs = [ cmake pkgconfig opencv ];
}

Personnaliser les dépendances

Une bibliothèque est compilée avec des options particulières qui ne conviennent pas forcément au projet courant. Par exemple, pour le projet mydisplay, il faut activer l’option gtk de la bibliothèque opencv. Nix permet de régler finement ces options (paquet opencv de nix).

with import <nixpkgs> {};

let
  # change le compilateur
  _stdenv = overrideCC stdenv gcc5;

  # change les paramètres du paquet opencv
  _opencv_gtk = opencv.override { 
    stdenv = _stdenv;
    cmake = cmake_2_8; 
    enableGtk2 = true; 
  };

  # change les paramètres de compilation du paquet opencv
  _opencv_gtk_att = _opencv_gtk.overrideDerivation (attrs: {
    cmakeFlags = [ attrs.cmakeFlags "-DENABLE_PRECOMPILED_HEADERS=OFF" ];
  });
in

_stdenv.mkDerivation {
  name = "mydisplay";
  src = ./.;
  buildInputs = [ cmake pkgconfig _opencv_gtk_att ];
}

Fixer les versions

Nix perment de fixer précisément l’environnement logiciel. Ceci permet d’assurer des dépendances dans des versions compatibles et facilite le déploiement.

with import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/18.03.tar.gz") {};

# ...