From 9deef256a2301a6a741bafbaa02b4201afe9d0c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Bon=C3=A9?= Date: Tue, 28 Oct 2025 16:27:26 +0100 Subject: [PATCH] Add quickShell to build devshells quickly --- overlay.nix | 1 + pkgs/quick-shell/default.nix | 76 ++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 pkgs/quick-shell/default.nix diff --git a/overlay.nix b/overlay.nix index 3b02ae30..f9484128 100644 --- a/overlay.nix +++ b/overlay.nix @@ -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: diff --git a/pkgs/quick-shell/default.nix b/pkgs/quick-shell/default.nix new file mode 100644 index 00000000..e0a1c907 --- /dev/null +++ b/pkgs/quick-shell/default.nix @@ -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 = [ ]; +}