Add quickShell to build devshells quickly #209
@ -19,6 +19,7 @@ let
|
||||
cudainfo = prev.callPackage ./pkgs/cudainfo/default.nix { };
|
||||
#extrae = callPackage ./pkgs/extrae/default.nix { }; # Broken and outdated
|
||||
gpi-2 = callPackage ./pkgs/gpi-2/default.nix { };
|
||||
quickShell = import ./pkgs/quick-shell/default.nix { pkgs = final; };
|
||||
intelPackages_2023 = callPackage ./pkgs/intel-oneapi/2023.nix { };
|
||||
jemallocNanos6 = callPackage ./pkgs/nanos6/jemalloc.nix { };
|
||||
# FIXME: Extend this to all linuxPackages variants. Open problem, see:
|
||||
|
||||
76
pkgs/quick-shell/default.nix
Normal file
76
pkgs/quick-shell/default.nix
Normal file
@ -0,0 +1,76 @@
|
||||
{ pkgs }:
|
||||
|
||||
# This builds devshells using passthru to populate packages and inputsFrom
|
||||
# lazily.
|
||||
#
|
||||
# Packages prefixed with @ are added to inputsFrom and the rest are
|
||||
# added to packages. This makes it possible to obtain a devshell with combining
|
||||
# inputsFrom and packages from the comand line:
|
||||
#
|
||||
# $ nix develop .#quickShell.@nosv.clang-tools.ovni.@tampi
|
||||
#
|
||||
# is equivalent to:
|
||||
#
|
||||
# with pkgs; mkShell {
|
||||
# packages = [ clang-tools ovni ];
|
||||
# inputsFrom = [ nosv tampi ];
|
||||
# }
|
||||
#
|
||||
|
||||
let
|
||||
inherit (builtins) attrNames getAttr listToAttrs;
|
||||
inherit (pkgs) lib;
|
||||
|
||||
# list of all packages' names
|
||||
names = attrNames pkgs;
|
||||
|
||||
# generate a attributes containing the selected packages + all the available
|
||||
# packages in names ("" -> packages and "@" -> inputsFrom)
|
||||
go =
|
||||
selected:
|
||||
let
|
||||
mkAttrs =
|
||||
isInputs:
|
||||
(map (
|
||||
name:
|
||||
let
|
||||
pkg = getAttr name pkgs;
|
||||
in
|
||||
{
|
||||
name = (if isInputs then "@" else "") + name;
|
||||
value = go (
|
||||
if isInputs then
|
||||
{
|
||||
inherit (selected) packages;
|
||||
inputsFrom = selected.inputsFrom ++ [ pkg ];
|
||||
}
|
||||
else
|
||||
{
|
||||
inherit (selected) inputsFrom;
|
||||
packages = selected.packages ++ [ pkg ];
|
||||
}
|
||||
);
|
||||
}
|
||||
) names);
|
||||
|
||||
attrs = listToAttrs ((mkAttrs true) ++ (mkAttrs false));
|
||||
|
||||
drv = pkgs.mkShell {
|
||||
inherit (selected) inputsFrom packages;
|
||||
name = # build a label from inputsFrom
|
||||
if (selected.inputsFrom == [ ]) then
|
||||
"nix-quick-shell"
|
||||
else
|
||||
lib.concatStringsSep "-" (map (v: v.pname or v.name or "unknown") selected.inputsFrom);
|
||||
};
|
||||
in
|
||||
drv.overrideAttrs {
|
||||
passthru = attrs // {
|
||||
_passthru = drv.passthru;
|
||||
};
|
||||
};
|
||||
in
|
||||
go {
|
||||
inputsFrom = [ ];
|
||||
packages = [ ];
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user