diff options
Diffstat (limited to 'lib/cfgWrapper.nix')
| -rw-r--r-- | lib/cfgWrapper.nix | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/cfgWrapper.nix b/lib/cfgWrapper.nix new file mode 100644 index 0000000..2e57656 --- /dev/null +++ b/lib/cfgWrapper.nix @@ -0,0 +1,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 |
