lib.haskell.substitutePkgs: init

This commit is contained in:
tv 2021-03-15 01:00:53 +01:00
parent a9b82ce412
commit 478ccdaac7
2 changed files with 52 additions and 0 deletions

View File

@ -5,6 +5,7 @@ let
evalSource = import ./eval-source.nix; evalSource = import ./eval-source.nix;
git = import ./git.nix { inherit lib; }; git = import ./git.nix { inherit lib; };
haskell = import ./haskell.nix { inherit lib; };
krebs = import ./krebs lib; krebs = import ./krebs lib;
krops = import ../submodules/krops/lib; krops = import ../submodules/krops/lib;
shell = import ./shell.nix { inherit lib; }; shell = import ./shell.nix { inherit lib; };

51
lib/haskell.nix Normal file
View File

@ -0,0 +1,51 @@
{ lib }:
with builtins;
rec {
# Derive a file by substituting
# "${pkgs.foo}/bin/foo" for each {-pkg-}"foo", and
# "${pkgs.bar}/bin/foo" for each {-pkg:bar-}"foo".
# If a package doesn't exist, a warning gets printed.
substitutePkgs = name: { callsite ? null, pkgs, path }:
pkgs.writeText name (substitutePkgs' {
inherit pkgs;
sourceDescription =
if callsite != null then
"${name} in ${toString callsite}"
else
"${name} from ${toString path}";
text = readFile path;
});
substitutePkgs' = { pkgs, sourceDescription, text }:
let
f = s:
let
parse = match "(.*)([{]-pkg(:([^}]+))?-[}]\"([^\"]+)\")(.*)" s;
prefix = elemAt parse 0;
pname = if elemAt parse 3 != null then elemAt parse 3 else exename;
exename = elemAt parse 4;
suffix = elemAt parse 5;
pkg = pkgs.${pname} or null;
substitute =
if pkg != null then
"${pkg}/bin/${exename}"
else
trace (toString [
"lib.haskell.replacePkg:"
"warning:"
"while deriving ${sourceDescription}:"
"no substitute found for ${elemAt parse 1}"
])
exename;
in
if parse == null then
s
else
f (prefix + toJSON substitute + suffix);
in
f text;
}