diff options
Diffstat (limited to 'nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/plugins.nix')
-rw-r--r-- | nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/plugins.nix | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/plugins.nix b/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/plugins.nix new file mode 100644 index 00000000000..b5e807c6e2d --- /dev/null +++ b/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/plugins.nix @@ -0,0 +1,70 @@ +{ pkgs, lib }: +let + inherit (pkgs) stdenv; + + mkPluginDrv = + { self + , plugins + , drv + , postInstall ? "" + , nativeBuildInputs ? [ ] + , buildInputs ? [ ] + }: + let + env = self.python.withPackages (ps: plugins); + in + stdenv.mkDerivation { + pname = drv.pname + "-with-plugins"; + + inherit (drv) src version meta; + + buildInputs = drv.buildInputs ++ drv.propagatedBuildInputs ++ buildInputs; + nativeBuildInputs = drv.nativeBuildInputs ++ nativeBuildInputs; + + dontConfigure = true; + dontBuild = true; + dontUsePythonRecompileBytecode = true; + + passthru = { + inherit (drv.passthru) withPlugins; + inherit plugins; + }; + + # Link bin/ from environment, but only if it's in a plugin + installPhase = '' + runHook preInstall + + mkdir -p $out/bin + + for bindir in ${lib.concatStringsSep " " (map (d: "${lib.getBin d}/bin") plugins)}; do + for bin in $bindir/*; do + ln -s ${env}/bin/$(basename $bin) $out/bin/ + done + done + + runHook postInstall + ''; + + inherit postInstall; + }; + +in +{ + + # Provide the `withPlugins` function + toPluginAble = self: { drv + , finalDrv + , postInstall ? "" + , nativeBuildInputs ? [ ] + , buildInputs ? [ ] + }: drv.overridePythonAttrs (old: { + passthru = old.passthru // { + withPlugins = pluginFn: mkPluginDrv { + plugins = [ finalDrv ] ++ pluginFn self; + inherit self postInstall nativeBuildInputs buildInputs; + drv = finalDrv; + }; + }; + }); + +} |