Fix inf recursions in computing default package's name

This commit is contained in:
Archit Gupta 2023-08-27 13:57:16 -07:00
parent 62b7dba619
commit ba7f68e4e2
2 changed files with 29 additions and 31 deletions

View File

@ -61,8 +61,8 @@ in
(_: v: { ${system} = v; }) (_: v: { ${system} = v; })
(config.perSystem (import inputs.nixpkgs { (config.perSystem (import inputs.nixpkgs {
inherit system; inherit system;
config = config.nixpkgs.config; inherit (config.nixpkgs) config;
overlays = config.withOverlays; overlays = config.withOverlays ++ [ config.packageOverlay ];
}))) })))
config.systems); config.systems);
}; };

View File

@ -2,18 +2,17 @@
# Copyright (C) 2023 Archit Gupta <archit@accelbread.com> # Copyright (C) 2023 Archit Gupta <archit@accelbread.com>
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
{ config, lib, flakelight, ... }: { config, lib, inputs, flakelight, ... }:
let let
inherit (builtins) attrNames functionArgs intersectAttrs parseDrvName; inherit (builtins) parseDrvName;
inherit (lib) composeManyExtensions filterAttrs fix genAttrs mapAttrs mapAttrs' inherit (lib) filterAttrs mapAttrs mapAttrs' mkIf mkMerge mkOption
mkIf mkMerge mkOption mkOrder nameValuePair optional optionalAttrs remove; nameValuePair optionalAttrs;
inherit (lib.types) lazyAttrsOf nullOr; inherit (lib.types) lazyAttrsOf nullOr uniq;
inherit (flakelight) supportedSystem; inherit (flakelight) supportedSystem;
inherit (flakelight.types) packageDef; inherit (flakelight.types) overlay packageDef;
getName = pkg: pkg.pname or (parseDrvName pkg.name).name; genPkg = pkgs: pkg: pkgs.callPackage pkg { };
genPkgs = pkgs: mapAttrs (_: genPkg pkgs) config.packages;
callPkg = pkgs: def: def (intersectAttrs (functionArgs def) pkgs);
in in
{ {
options = { options = {
@ -26,6 +25,12 @@ in
type = lazyAttrsOf packageDef; type = lazyAttrsOf packageDef;
default = { }; default = { };
}; };
packageOverlay = mkOption {
internal = true;
type = uniq overlay;
default = _: _: { };
};
}; };
config = mkMerge [ config = mkMerge [
@ -34,32 +39,25 @@ in
}) })
(mkIf (config.packages != { }) { (mkIf (config.packages != { }) {
withOverlays = mkOrder 2000 (final: prev: packageOverlay = final: prev:
let let
pkgNames = attrNames config.packages; getName = pkg: pkg.pname or (parseDrvName pkg.name).name;
pkgNames' = remove "default" pkgNames; defaultPkgName = getName (import inputs.nixpkgs {
defaultName = getName (fix (self: inherit (prev.stdenv.hostPlatform) system;
prev // (genAttrs pkgNames inherit (config.nixpkgs) config;
(n: callPkg self config.packages.${n})))).default; overlays = config.withOverlays ++ [ (final: _: genPkgs final) ];
}).default;
in in
(optionalAttrs (config.packages ? default) { (optionalAttrs (config.packages ? default) {
${defaultName} = final.callPackage config.packages.default { }; ${defaultPkgName} = genPkg final config.packages.default;
}) // }) // genPkgs final;
(genAttrs pkgNames' (n: final.callPackage config.packages.${n} { })));
overlay = final: prev: overlay = final: prev: removeAttrs
let (config.packageOverlay (final.appendOverlays config.withOverlays) prev)
pkgs' = fix (composeManyExtensions config.withOverlays) prev; [ "default" ];
defaultName = getName (callPkg pkgs' config.packages.default);
pkgNames = (remove "default" (attrNames config.packages))
++ (optional (config.packages ? default) defaultName);
pkgs = final.appendOverlays config.withOverlays;
in
genAttrs pkgNames (n: pkgs.${n});
perSystem = pkgs: rec { perSystem = pkgs: rec {
packages = filterAttrs (_: supportedSystem pkgs) packages = filterAttrs (_: supportedSystem pkgs) (genPkgs pkgs);
(mapAttrs (_: v: pkgs.callPackage v { }) config.packages);
checks = mapAttrs' (n: nameValuePair ("packages-" + n)) packages; checks = mapAttrs' (n: nameValuePair ("packages-" + n)) packages;
}; };