56 lines
1.7 KiB
Nix
56 lines
1.7 KiB
Nix
|
{lib, ...}: with lib;{packagesFromDirectoryRecursive =
|
||
|
{
|
||
|
callPackage,
|
||
|
directory,
|
||
|
...
|
||
|
} :
|
||
|
let
|
||
|
# Determine if a directory entry from `readDir` indicates a package or
|
||
|
# directory of packages.
|
||
|
directoryEntryIsPackage = basename: type:
|
||
|
type == "directory" || hasSuffix ".nix" basename;
|
||
|
|
||
|
# List directory entries that indicate packages in the given `path`.
|
||
|
packageDirectoryEntries = path:
|
||
|
filterAttrs directoryEntryIsPackage (builtins.readDir path);
|
||
|
|
||
|
# Transform a directory entry (a `basename` and `type` pair) into a
|
||
|
# package.
|
||
|
directoryEntryToAttrPair = subdirectory: basename: type:
|
||
|
let
|
||
|
path = subdirectory + "/${basename}";
|
||
|
in
|
||
|
if type == "regular"
|
||
|
then
|
||
|
{
|
||
|
name = removeSuffix ".nix" basename;
|
||
|
value = callPackage path { };
|
||
|
}
|
||
|
else
|
||
|
if type == "directory"
|
||
|
then
|
||
|
{
|
||
|
name = basename;
|
||
|
value = packagesFromDirectory path;
|
||
|
}
|
||
|
else
|
||
|
throw
|
||
|
''
|
||
|
lib.filesystem.packagesFromDirectoryRecursive: Unsupported file type ${type} at path ${toString subdirectory}
|
||
|
'';
|
||
|
|
||
|
# Transform a directory into a package but its edited to use default.nix because package.nix is nonstandard or
|
||
|
# set of packages (otherwise).
|
||
|
packagesFromDirectory = path:
|
||
|
let
|
||
|
defaultPackagePath = path + "/default.nix";
|
||
|
in
|
||
|
if pathExists defaultPackagePath
|
||
|
then callPackage defaultPackagePath { }
|
||
|
else mapAttrs'
|
||
|
(directoryEntryToAttrPair path)
|
||
|
(packageDirectoryEntries path);
|
||
|
in
|
||
|
packagesFromDirectory directory;
|
||
|
}
|