Nix, programmation et loi de Murphy
Voir aussi : vidéo peertube - vidéo youtube - dépôt git
Quand on développe un logiciel on utilise très souvent des bibliothèques, ce qui peut apporter de nombreux problèmes :
- bibliothèque fournie par le système ou à compiler manuellement
- version compatible avec le projet
- options de compilation
- déploiement du projet final et de ses bibliothèques
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.
installer toutes les dépendances nécessaires
lancer les commandes de compilation :
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.
- écrire un fichier
default.nix
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
'';
}
- lancer la avec
nix-build
ou utiliser unnix-shell
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…).
- fichier
default.nix
:
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).
- fichier
default.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.
- fichier
default.nix
:
with import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/18.03.tar.gz") {};
# ...