diff --git a/overlays/pkgs.nix b/overlays/pkgs.nix index 37a974cf..f435e830 100644 --- a/overlays/pkgs.nix +++ b/overlays/pkgs.nix @@ -2,6 +2,7 @@ with next; let sane = rec { + sane-lib = import ../modules/lib next; #### my own, non-upstreamable packages: static-nix-shell = callPackages ../pkgs/static-nix-shell { }; sane-scripts = callPackage ../pkgs/sane-scripts { }; diff --git a/pkgs/gpodder-configured/default.nix b/pkgs/gpodder-configured/default.nix index 594e1b3a..b38abcc8 100644 --- a/pkgs/gpodder-configured/default.nix +++ b/pkgs/gpodder-configured/default.nix @@ -3,26 +3,20 @@ , gpodder , makeWrapper , python3 +, static-nix-shell , symlinkJoin }: let - pyEnv = python3.withPackages (_ps: [ gnome-feeds.listparser ]); - remove-extra = stdenv.mkDerivation { + remove-extra = static-nix-shell.mkPython3Bin { pname = "gpodder-remove-extra"; - version = "0.1.0"; - src = ./.; - - patchPhase = '' - substituteInPlace ./remove_extra.py \ - --replace "#!/usr/bin/env nix-shell" "#!${pyEnv.interpreter}" - ''; - - installPhase = '' - mkdir -p $out/bin - mv remove_extra.py $out/bin/gpodder-remove-extra - ''; + pyPkgs = _ps: { + "gnome-feeds.listparser" = gnome-feeds.listparser; + }; + pkgs = { + inherit gpodder; + }; }; in # we use a symlinkJoin so that we can inherit the .desktop and icon files from the original gPodder diff --git a/pkgs/gpodder-configured/remove_extra.py b/pkgs/gpodder-configured/gpodder-remove-extra similarity index 95% rename from pkgs/gpodder-configured/remove_extra.py rename to pkgs/gpodder-configured/gpodder-remove-extra index e25033b0..df57f0b3 100755 --- a/pkgs/gpodder-configured/remove_extra.py +++ b/pkgs/gpodder-configured/gpodder-remove-extra @@ -1,5 +1,5 @@ #!/usr/bin/env nix-shell -#!nix-shell -i python3 -p "python3.withPackages (ps: [gnome-feeds.listparser])" -p gpodder +#!nix-shell -i python3 -p "python3.withPackages (ps: [ gnome-feeds.listparser ])" -p gpodder from dataclasses import dataclass, field import listparser diff --git a/pkgs/static-nix-shell/default.nix b/pkgs/static-nix-shell/default.nix index cab27780..94980951 100644 --- a/pkgs/static-nix-shell/default.nix +++ b/pkgs/static-nix-shell/default.nix @@ -1,30 +1,67 @@ -{ stdenv +{ pkgs +, lib , python3 +, sane-lib +, stdenv }: -{ +let + inherit (builtins) attrNames attrValues concatStringsSep map typeOf; + inherit (lib) concatMapAttrs; + inherit (sane-lib) mapToAttrs; + pkgs' = pkgs; +in { # transform a file which uses `#!/usr/bin/env nix-shell` shebang with a `python3` interpreter - # into a derivation that can be built statically - mkPython3Bin = { pname, pyPkgs ? [], srcPath ? pname, ... }@attrs: stdenv.mkDerivation ( + # into a derivation that can be built statically. + # + # pkgs and pyPkgs may take the following form: + # - [ "pkgNameA" "pkgNameB" ... ] + # - { pkgNameA = pkgValueA; pkgNameB = pkgValueB; ... } + # - ps: + # + # for pyPkgs, names are assumed to be relative to `"ps"` if specified in list form. + mkPython3Bin = { pname, pkgs ? {}, pyPkgs ? {}, srcPath ? pname, ... }@attrs: let - evalPyPkgs = ps: builtins.map (name: ps."${name}") pyPkgs; - pyEnv = python3.withPackages evalPyPkgs; - pyPkgsStr = builtins.concatStringsSep " " (builtins.map (p: "ps.${p}") pyPkgs); - in { + # create an attrset of + # = expected string in the nix-shell invocation + # = package to provide + pkgsToAttrs = prefix: pkgSet: expr: ({ + "lambda" = expr: pkgsToAttrs prefix pkgSet (expr pkgSet); + "list" = expr: mapToAttrs (pname: { + name = prefix + pname; + value = pkgSet."${pname}"; + }) expr; + "set" = expr: expr; + })."${typeOf expr}" expr; + pyEnv = python3.withPackages (ps: attrValues ( + pkgsToAttrs "ps." ps pyPkgs + )); + pyPkgsStr = concatStringsSep " " (attrNames ( + pkgsToAttrs "ps." {} pyPkgs + )); + + pkgsAsAttrs = pkgsToAttrs "" pkgs' pkgs; + pkgsEnv = attrValues pkgsAsAttrs; + pkgsStr = concatStringsSep "" (map + (pname: " -p ${pname}") + (attrNames pkgsAsAttrs) + ); + in stdenv.mkDerivation ({ version = "0.1.0"; # default version patchPhase = '' substituteInPlace ${srcPath} \ --replace '#!/usr/bin/env nix-shell' '#!${pyEnv.interpreter}' \ --replace \ - '#!nix-shell -i python3 -p "python3.withPackages (ps: [ ${pyPkgsStr} ])"' \ + '#!nix-shell -i python3 -p "python3.withPackages (ps: [ ${pyPkgsStr} ])"${pkgsStr}' \ '# nix deps evaluated statically' ''; + runtimeDependencies = pkgsEnv; installPhase = '' mkdir -p $out/bin mv ${srcPath} $out/bin/${srcPath} # ensure that all nix-shell references were substituted ! grep nix-shell $out/bin/${srcPath} ''; - } // attrs + } // (removeAttrs attrs [ "pkgs" "pyPkgs" "srcPath" ]) ); }