78 lines
2 KiB
Nix
78 lines
2 KiB
Nix
|
{ lib, config, self, inputs, ... }:
|
||
|
|
||
|
let
|
||
|
inherit (config.lib)
|
||
|
createThings;
|
||
|
in
|
||
|
let
|
||
|
createDevShells = baseDir:
|
||
|
createThings {
|
||
|
inherit baseDir;
|
||
|
thingType = "devShell";
|
||
|
raw = false;
|
||
|
extras.systems = {
|
||
|
default = lib.const true;
|
||
|
};
|
||
|
};
|
||
|
in
|
||
|
{
|
||
|
options = let
|
||
|
inherit (lib) types;
|
||
|
in {
|
||
|
flake.autoDevShells = lib.mkOption {
|
||
|
description = ''
|
||
|
Automagically generate devShells from walking directories with Nix files
|
||
|
'';
|
||
|
type = types.submodule (submodule: {
|
||
|
options = {
|
||
|
enable = lib.mkEnableOption "Automatic devShells extraction";
|
||
|
dir = lib.mkOption {
|
||
|
description = ''
|
||
|
Base directory of the contained devShells
|
||
|
'';
|
||
|
type = types.path;
|
||
|
default = "${self}/shells";
|
||
|
defaultText = ''''${self}/shells'';
|
||
|
};
|
||
|
result = lib.mkOption {
|
||
|
description = ''
|
||
|
The resulting automatic devShells
|
||
|
'';
|
||
|
type = types.attrsOf (types.submodule { options = {
|
||
|
devShell = lib.mkOption { type = types.unspecified; };
|
||
|
systems = lib.mkOption { type = types.functionTo types.bool; };
|
||
|
};});
|
||
|
readOnly = true;
|
||
|
internal = true;
|
||
|
default =
|
||
|
lib.optionalAttrs
|
||
|
config.flake.autoDevShells.enable
|
||
|
(createDevShells config.flake.autoDevShells.dir);
|
||
|
};
|
||
|
};
|
||
|
});
|
||
|
default = {};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
config = {
|
||
|
perSystem = { lib, pkgs, system, ... }: let
|
||
|
devShells =
|
||
|
lib.pipe
|
||
|
config.flake.autoDevShells.result
|
||
|
[
|
||
|
(lib.filterAttrs
|
||
|
(name: { devShell, systems }:
|
||
|
pkgs.callPackage systems {
|
||
|
inherit (pkgs) lib hostPlatform targetPlatform;
|
||
|
}))
|
||
|
(lib.mapAttrs
|
||
|
(name: { devShell, systems }:
|
||
|
pkgs.callPackage devShell { inherit inputs; }))
|
||
|
];
|
||
|
in {
|
||
|
inherit devShells;
|
||
|
};
|
||
|
};
|
||
|
}
|