1
1
forked from extern/flakelight
flakelight/builtinModules/packages.nix

88 lines
2.7 KiB
Nix
Raw Normal View History

# 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;
};
})
];
}