vidéo peertube - vidéo youtube - dépôt git
Développer avec Nix en composant des projets C++/Python
comment développer en C++/Python avec Nix, en réutilisant des projets locaux ou distants
Présentation de projets C++/Python classiques (setuptools, boost-python)
- module
counter
(bibliothèque C++, binding boost-python et script Python) et moduleproj12
:
.
├── counter
│ ├── counter
│ │ ├── counter_binding.cpp
│ │ ├── counter.cpp
│ │ └── counter.hpp
│ ├── pycounter
│ │ ├── __init__.py
│ │ └── utils.py
│ └── setup.py
└── proj12
├── proj12_pcu.py
└── setup.py
- fichier de compilation/packaging
counter/setup.py
:
from setuptools import setup, Extension
counter_module = Extension('counter',
include_dirs = ['counter'],
sources = ['counter/counter.cpp', 'counter/counter_binding.cpp'],
libraries = ['boost_python'])
setup(name = 'pycounter',
version = '0.1',
packages = ['pycounter'],
ext_modules = [counter_module])
- fichier de compilation/packaging
proj12/setup.py
:
from setuptools import setup
setup(name = 'proj12',
version = '0.1',
scripts = ['proj12_pcu.py', 'proj12.py'])
Installation/utilisation classique sous Debian
- installer boost-python :
- créer un environnement virtuel (python2, à cause du boost-python de Debian) :
- activer l’environnement virtuel, installer les modules, tester :
Installation/utilisation avec Nix
- ajouter un
default.nix
danscounter
:
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/17.09.tar.gz") {} } :
pkgs.python3Packages.buildPythonPackage {
name = "pycounter";
src = ./.;
buildInputs = [ pkgs.python3Packages.boost ];
}
- ajouter un
default.nix
dansproj12
:
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/17.09.tar.gz") {} } :
let
_counter = import ../counter/default.nix {
inherit pkgs;
};
in
pkgs.python3Packages.buildPythonPackage {
name = "proj12";
src = ./.;
propagatedBuildInputs = [
(pkgs.python3.buildEnv.override {
extraLibs = [
_counter
];
})
];
}
- installer/utiliser les paquets nix comme habituellement, par exemple :
Installation/utilisation de projets distants avec Nix
Il est possible d’utiliser des projets distants, par exemple le projet kounter
(une copie de counter
).
- écrire un paquet Nix
proj12/kounter.nix
correspondant au projet distant :
{ fetchgit, pyPkgs }:
pyPkgs.buildPythonPackage {
name = "pykounter";
src = fetchgit {
url = "https://framagit.org/nokomprendo/kounter";
rev = "ce07c9dedd12236a9f1873dc637a77a2c67f8987";
sha256 = "0flbxyq939xwxikg7mzgl4i2j7g3668wcqk6jwg59ly3ldhba9rc";
};
buildInputs = [ pyPkgs.boost ];
}
- importer et ajouter le paquet dans
proj12/default.nix
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/17.09.tar.gz") {} } :
let
_counter = import ../counter/default.nix {
inherit pkgs;
};
_kounter = import ./kounter.nix {
inherit (pkgs) fetchgit;
pyPkgs = pkgs.python3Packages;
};
in
pkgs.python3Packages.buildPythonPackage {
name = "proj12";
src = ./.;
propagatedBuildInputs = [
(pkgs.python3.buildEnv.override {
extraLibs = [
_counter
_kounter
];
})
];
}
- installer/utiliser les paquets nix comme habituellement, par exemple :