Développer avec Nix en composant des projets C++/Python
Voir aussi : vidéo peertube - vidéo youtube - dépôt git
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
= Extension('counter',
counter_module = ['counter'],
include_dirs = ['counter/counter.cpp', 'counter/counter_binding.cpp'],
sources = ['boost_python'])
libraries
= 'pycounter',
setup(name = '0.1',
version = ['pycounter'],
packages = [counter_module]) ext_modules
- fichier de compilation/packaging
proj12/setup.py
:
from setuptools import setup
= 'proj12',
setup(name = '0.1',
version = ['proj12_pcu.py', 'proj12.py']) scripts
Installation/utilisation classique sous Debian
- installer boost-python :
sudo apt install libboost-python-dev
- créer un environnement virtuel (python2, à cause du boost-python de Debian) :
virtualenv venv-proj12
- activer l’environnement virtuel, installer les modules, tester :
source venv-proj12/bin/activate
pip install ./counter
pip install ./proj12
proj12_pcu.py
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 :
cd proj12
nix-shell --run "proj12_pcu.py"
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://gitlab.com/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 :
nix-env -f . -i
proj12.py