From 478ccdaac7bcb6171919726317e809faa1aae8f0 Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 15 Mar 2021 01:00:53 +0100 Subject: [PATCH] lib.haskell.substitutePkgs: init --- lib/default.nix | 1 + lib/haskell.nix | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 lib/haskell.nix diff --git a/lib/default.nix b/lib/default.nix index 4190f8f5f..738e52186 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -5,6 +5,7 @@ let evalSource = import ./eval-source.nix; git = import ./git.nix { inherit lib; }; + haskell = import ./haskell.nix { inherit lib; }; krebs = import ./krebs lib; krops = import ../submodules/krops/lib; shell = import ./shell.nix { inherit lib; }; diff --git a/lib/haskell.nix b/lib/haskell.nix new file mode 100644 index 000000000..b1889caf0 --- /dev/null +++ b/lib/haskell.nix @@ -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; +}