37 lines
1.1 KiB
Nix
37 lines
1.1 KiB
Nix
{ lib, ... }:
|
|
let
|
|
src = ./.;
|
|
# Autodetects files with a package.nix and calls `callPackage` on them.
|
|
#
|
|
# Will add a package .#dirname to the flake if it finds a ./dirname/package.nix file.
|
|
files = builtins.readDir src;
|
|
isPackage = path: type: (type == "directory") && (builtins.readDir path) ? "package.nix";
|
|
toPackage = name: pkgs: {
|
|
inherit name;
|
|
value = pkgs.callPackage "${src}/${name}/package.nix" { };
|
|
};
|
|
# call pkgs.callPackage on all ./*/package.nix
|
|
makePackage =
|
|
pkgs: name:
|
|
let
|
|
type = files.${name};
|
|
path = "${src}/${name}";
|
|
package = toPackage name pkgs;
|
|
in
|
|
# if it is a package then return a package otherwise return no package c:
|
|
if isPackage path type then [ package ] else [ ];
|
|
# we have lib.filterMapAttrs at home
|
|
scripts =
|
|
pkgs: builtins.listToAttrs (builtins.concatMap (makePackage pkgs) (builtins.attrNames files));
|
|
in
|
|
{
|
|
# Add scripts to overlay
|
|
flake.overlays.scripts = final: scripts;
|
|
|
|
# Add scripts to packages
|
|
perSystem =
|
|
{ pkgs, ... }:
|
|
{
|
|
packages = scripts pkgs;
|
|
};
|
|
}
|