mirror of
https://github.com/nix-community/flakelight.git
synced 2024-11-22 07:23:11 +01:00
9099db6c84
Previously, the packages outputs would be evalutated using callPackage on the package set, but the package set already contains the package. If another package depends on it, the dependency would be the version from the package set. By grabbing the packages from the package set, each package only needs to be evaluated once.
88 lines
2.7 KiB
Nix
88 lines
2.7 KiB
Nix
# flakelight -- Framework for simplifying flake setup
|
|
# Copyright (C) 2023 Archit Gupta <archit@accelbread.com>
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
{ config, lib, inputs, flakelight, genSystems, ... }:
|
|
let
|
|
inherit (builtins) parseDrvName tryEval;
|
|
inherit (lib) filterAttrs findFirst mapAttrs mapAttrs' mkIf mkMerge mkOption
|
|
nameValuePair optionalAttrs;
|
|
inherit (lib.types) lazyAttrsOf nullOr str uniq;
|
|
inherit (flakelight) supportedSystem;
|
|
inherit (flakelight.types) overlay packageDef;
|
|
|
|
genPkg = pkgs: pkg: pkgs.callPackage pkg { };
|
|
genPkgs = pkgs: mapAttrs (_: genPkg pkgs) config.packages;
|
|
in
|
|
{
|
|
options = {
|
|
package = mkOption {
|
|
type = nullOr packageDef;
|
|
default = null;
|
|
};
|
|
|
|
packages = mkOption {
|
|
type = lazyAttrsOf packageDef;
|
|
default = { };
|
|
};
|
|
|
|
pname = mkOption {
|
|
type = nullOr str;
|
|
default = null;
|
|
};
|
|
|
|
packageOverlay = mkOption {
|
|
internal = true;
|
|
type = uniq overlay;
|
|
default = _: _: { };
|
|
};
|
|
};
|
|
|
|
config = mkMerge [
|
|
(mkIf (config.package != null) {
|
|
packages.default = config.package;
|
|
})
|
|
|
|
(mkIf (config.packages != { }) {
|
|
packageOverlay = final: prev:
|
|
let
|
|
getName = pkg: pkg.pname or (parseDrvName pkg.name).name;
|
|
inherit (prev.stdenv.hostPlatform) system;
|
|
baseNixpkgs = inputs.nixpkgs.legacyPackages.${system};
|
|
mockPkgs = import ../misc/nameMockedPkgs.nix prev;
|
|
|
|
defaultPkgName = findFirst (x: (tryEval x).success)
|
|
(throw ("Could not determine the name of the default package; " +
|
|
"please set the `pname` flakelight option to the intended name."))
|
|
[
|
|
(assert config.pname != null; config.pname)
|
|
(getName (mockPkgs.callPackage config.packages.default { }))
|
|
(getName (baseNixpkgs.callPackage config.packages.default { }))
|
|
(getName (import inputs.nixpkgs {
|
|
inherit (prev.stdenv.hostPlatform) system;
|
|
inherit (config.nixpkgs) config;
|
|
overlays = config.withOverlays ++ [ (final: _: genPkgs final) ];
|
|
}).default)
|
|
];
|
|
in
|
|
(optionalAttrs (config.packages ? default) {
|
|
${defaultPkgName} = genPkg final config.packages.default;
|
|
}) // genPkgs final;
|
|
|
|
overlay = final: prev: removeAttrs
|
|
(config.packageOverlay (final.appendOverlays config.withOverlays) prev)
|
|
[ "default" ];
|
|
|
|
outputs = rec {
|
|
packages = genSystems (pkgs:
|
|
filterAttrs (_: supportedSystem pkgs)
|
|
(mapAttrs (k: _: pkgs.${k}) config.packages));
|
|
|
|
checks = mapAttrs
|
|
(_: mapAttrs' (n: nameValuePair ("packages-" + n)))
|
|
packages;
|
|
};
|
|
})
|
|
];
|
|
}
|