nixpkgs-extension/pkgs/default.nix

87 lines
2.3 KiB
Nix

{
pkgs,
prev,
lib,
forFlakeOutputs ? false,
forPythonScope ? false,
...
}:
let
dirs = path: lib.attrNames (lib.filterAttrs (_: t: t == "directory") (builtins.readDir path));
pythonPackagesDir = ./by-category/pythonPackages;
packagesFromTree =
base: callPackage:
lib.foldl' (
acc: shorthand:
let
shorthandDir = base + "/${shorthand}";
names = dirs shorthandDir;
addOne =
name:
let
pkgDir = shorthandDir + "/${name}";
defaultFile = pkgDir + "/default.nix";
imported = builtins.tryEval (import defaultFile);
in
if !builtins.pathExists defaultFile || !imported.success then
{ }
else if builtins.isFunction imported.value then
{ ${name} = callPackage defaultFile { }; }
else if lib.isDerivation imported.value then
{ ${name} = imported.value; }
else
{ };
in
acc // lib.foldl' (a: n: a // addOne n) { } names
) { } (dirs base);
byNamePkgs =
if builtins.pathExists ./by-name then packagesFromTree ./by-name pkgs.callPackage else { };
byCategoryPkgs = import ./by-category {
inherit
pkgs
prev
lib
packagesFromTree
;
};
overlayAttrs = byNamePkgs // byCategoryPkgs;
directFlakePackages = lib.filterAttrs (_: lib.isDerivation) overlayAttrs;
flakePythonPackages =
let
pyPkgs = if pkgs ? python313Packages then pkgs.python313Packages else pkgs.python3Packages;
treePkgs =
if builtins.pathExists pythonPackagesDir then
removeAttrs (packagesFromTree pythonPackagesDir pyPkgs.callPackage) [
"python-packages"
]
else
{ };
prefabPkgs =
if builtins.pathExists (pythonPackagesDir + "/prefab-builder.nix") then
prev.lib.customisation.callPackagesWith (
pyPkgs
// {
lib = prev.lib;
pkgs = prev;
pyPkgs = pyPkgs;
fetchFromGitHub = prev.fetchFromGitHub;
fetchPypi = prev.fetchPypi;
}
) (pythonPackagesDir + "/prefab-builder.nix") { }
else
{ };
in
treePkgs // prefabPkgs;
in
if forPythonScope then
flakePythonPackages
else if forFlakeOutputs then
directFlakePackages
else
overlayAttrs