Coses relacionades amb nix, nixpkgs, nixos, ...

Una manera típica de programar coses en un entorn linux consisteix en demanar a la distribució que ens instal·li les dependències que volem. Per exemple:

  • gcc
  • libpng
  • libjpeg
  • qt
  • etc.

I tot el que demanem a la distribució va a /usr, que és on els compiladors i els enllaçadors busquen.

Però a nixos no hi ha pas /usr. Hi ha els perfils de cada usuari, el perfil del sistema, i altres perfils, si volem. Cada perfil d'aquests té l'aspecte del contingut d'un /usr, però amb un inconvenient: no és a /usr, i per tant els compiladors i els enllaçadors no hi van a buscar res.

Una pràctica utilitzada per alguns que programen amb el gestor de paquets nix consisteix en instal·lar-se les dependències en algun perfil (per exemple, el personal), inclòs el gcc. Llavors estableixen les variables LIBRARY_PATH=~/.nix-profile/lib i CPATH=~/.nix-profile/include, i el compilador i l'enllaçador queden contents.

La pràctica que segueixo jo fa ús del sistema myEnv ideat per en Marc Weber, que consisteix en una expressió nix que crea un script que establirà les variables d'entorn de tal manera com es faria en una construcció feta per nix. Aquest sistema esborra algunes variables com PATH i d'altres, i per això la càrrega dels scripts no és totalment trivial. El myEnv posa els scripts a $out/dev-envs/scriptname, així que podem instal·lar-los al perfil perfectament sense que xoquin amb res més.

Concretament, per exemple per desenvolupar el dwm, el meu ~/.nixpkgs/config.nix inclou:

{
  packageOverrides = pkgs : with pkgs; rec {
    dwmEnv = pkgs.myEnvFun {
      name = "dwm";
      buildInputs = [ stdenv xlibs.libX11 xlibs.libXinerama ];
    };
  };
}

Això permet instal·lar al perfil la derivació env-dwm, que ens donarà el fitxer $out/dev-envs/dwm.

Alhora, faig servir un script per carregar els entorns de desenvolupament aquests, loadenv:

#!/bin/sh

OLDPATH="$PATH"
source $HOME/.nix-profile/dev-envs/$1
PATH="$PATH:$OLDPATH"
export out=/doesnotexist
export PS1="\n$1:[\u@\h:\w]\$ "
export buildNativeInputs
export NIX_STRIP_DEBUG=0

/var/run/current-system/sw/bin/bash --norc

Això em permet tenir una sessió com la següent:

viric@bergamota:~$ cd ~/dwm-5.7.2
viric@bergamota:~/dwm-5.7.2$ loadenv dwm
dwm:[viric@bergamota:~/dwm-5.7.2]$ make
...
dwm:[viric@bergamota:~/dwm-5.7.2]$ exit
viric@bergamota:~/dwm-5.7.2$

Tinc el meu ~/.nixpkgs/config.nix amb entorns per diferents coses que desenvolupo; així no empleno el perfil personal amb altres coses que no siguin programes que vull al PATH, i a més l'entorn de construcció s'assembla al del constructor genèric de nix, mantenint només les mínimes dependències especificades a l'abast dels compilador i enllaçador.

Posted dt 30 mar 2010 19:08:41 CEST Tags: nix