pkgs: with pkgs.lib; let inherit (pkgs) buildEnv callPackage writeTextDir; importAll = { root, exclude ? [] }: # adapted from http://chriswarbo.net/projects/nixos/useful_hacks.html let basename = removeSuffix ".nix"; isMatch = name: type: (hasSuffix ".nix" name || type == "directory") && ! elem name (map basename exclude); entry = name: _: { name = basename name; value = import (root + "/${name}"); }; in mapAttrs' entry (filterAttrs isMatch (readDir root)) in { shenvs = let build = name: { paths, enter ? null }: buildEnv { name = "shenv-${name}"; paths = (optional (enter != null) (writeTextDir "lib/shenv/enter" enter)) ++ paths; }; in mapAttrs (name: shenv: build name (shenv pkgs)) (importAll { root = ../shenvs; exclude = [ "config" ]; }); }