aboutsummaryrefslogtreecommitdiff
path: root/lib/cfgWrapper.nix
blob: 2e57656cc84a0c53fa076f8e465079c6123beda8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{pkgs}: {
  pkg,
  binName ? pkg.meta.mainProgram,
  extraFlags ? [],
  extraWrapperFlags ? [],
  extraPkgs ? [],
  extraEnv ? {},
  postBuild ? "",
  hidePkgs ? false,
  reducePath ? false,
}: let
  extraFlagsArgs = pkgs.lib.pipe extraFlags [
    (builtins.map (x: ''--add-flags "${x}" ''))
    (builtins.concatStringsSep " ")
  ];

  extraWrapperFlagsArgs = builtins.concatStringsSep " " extraWrapperFlags;

  pathArg =
    if (extraPkgs != [])
    then ''--prefix PATH : "${pkgs.lib.makeBinPath extraPkgs}"''
    else "";

  # Looks like {
  #   VAR = "value";
  #   VAR2 = "value_again";
  # }
  envArgs = pkgs.lib.pipe extraEnv [
    (builtins.mapAttrs (k: v: ''--set ${k} "${v}"''))
    builtins.attrValues
    (builtins.concatStringsSep " ")
  ];

  extraPkgs2 =
    if reducePath
    then
      (pkgs.symlinkJoin {
        name = "${binName}-extra-pkgs";
        paths = extraPkgs;
      })
    else extraPkgs;

  wrapped-program = pkgs.symlinkJoin {
    name = "${binName}-wrapped-program";
    paths = [pkg] ++ extraPkgs2;

    buildInputs = [pkgs.makeWrapper];
    postBuild = ''
      ${postBuild}

      wrapProgram $out/bin/${binName} ${extraFlagsArgs} ${pathArg} ${envArgs} ${extraWrapperFlagsArgs}
    '';
  };
in
  if hidePkgs
  then
    (pkgs.linkFarm "${binName}-only-bin" [
      {
        name = "bin/${binName}";
        path = "${wrapped-program}/bin/${binName}";
      }
    ])
  else wrapped-program