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.