2017-01-04 2 views
0

Existe-t-il un moyen de remplacer des scripts et/ou des configs dans une dérivation existante sans avoir à recompiler le paquet entier?Scripts de substitution dans les dérivations nix

Je voudrais créer une nouvelle version de gnome-session avec $out/share/gnome-session/sessions/gnome.session modifié. En utilisant overridePackage, je peux modifier la phase preFixup, mais cela entraîne la recompilation de l'ensemble du paquet gnome-session.

Répondre

0

Une solution simple au problème consiste à créer une nouvelle dérivation sans aucune source. L'astuce consiste à créer des liens vers chaque fichier et répertoire dans la dérivation de base, à l'exception de tout fichier (s) nécessitant une modification. Ces fichiers sont gérés explicitement en fonction des besoins.

L'extrait ci-dessous montre comment créer une nouvelle session gnome avec xmonad au lieu de gnome-shell.

{ nixpkgs ? import <nixpkgs> {} }: 
let 
    inherit (nixpkgs) pkgs; 
in 
    pkgs.stdenv.mkDerivation { 
    name = "gnome-session"; 
    builder = pkgs.writeText "builder.sh" '' 
     # source standard environment 
     . $stdenv/setup 

     # shorthands 
     refpkg=${pkgs.gnome3.gnome_session} 
     file=share/gnome-session/sessions/gnome.session 

     # create output dirs for new derivation 
     mkdir -p $out/share 
     mkdir -p $out/share/gnome-session/sessions 

     # link unchanged files from the original gnome-session 
     ln -sf $refpkg/bin $out 
     ln -sf $refpkg/libexec $out 
     find $refpkg/share -maxdepth 1 \ 
     -not -name gnome-session -exec ln -sf {} $out/share \; 

    # change gnome-shell to xmonad 
     sed 's/org.gnome.Shell/xmonad/' $refpkg/$file > $out/$file 
    ''; 
    # make sure gnome-session is installed before deriving it! 
    buildInputs = [ pkgs.gnome3.gnome_session ]; 
    }