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)

.
├── counter
   ├── counter
   │   ├── counter_binding.cpp
   │   ├── counter.cpp
   │   └── counter.hpp
   ├── pycounter
   │   ├── __init__.py
   │   └── utils.py
   └── setup.py
└── proj12
    ├── proj12_pcu.py
    └── 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])
from setuptools import setup

setup(name = 'proj12',
    version = '0.1',
    scripts = ['proj12_pcu.py', 'proj12.py'])

Installation/utilisation classique sous Debian

sudo apt install libboost-python-dev
virtualenv venv-proj12
source venv-proj12/bin/activate
pip install ./counter
pip install ./proj12
proj12_pcu.py

Installation/utilisation avec Nix

{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/17.09.tar.gz") {} } :

pkgs.python3Packages.buildPythonPackage {
  name = "pycounter";
  src = ./.;
  buildInputs = [ pkgs.python3Packages.boost ];
}
{ 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 
      ];
    })
  ];
}
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).

{ fetchgit, pyPkgs }:

pyPkgs.buildPythonPackage {

  name = "pykounter";

  src = fetchgit {
    url = "https://gitlab.com/nokomprendo/kounter";
    rev = "ce07c9dedd12236a9f1873dc637a77a2c67f8987";
    sha256 = "0flbxyq939xwxikg7mzgl4i2j7g3668wcqk6jwg59ly3ldhba9rc";
  };

  buildInputs = [ pyPkgs.boost ];
}
{ 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 
      ];
    })
  ];
}
nix-env -f . -i
proj12.py