55 lines
1.7 KiB
Nix
55 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;
|
|
}
|