1
0
Fork 0
mirror of https://github.com/hercules-ci/flake-parts.git synced 2024-12-14 11:47:31 +00:00

perSystem: functionTo -> deferredModule

This commit is contained in:
Robert Hensing 2022-05-25 18:09:17 +02:00
parent d5370c0774
commit 3ee82a16d6
9 changed files with 58 additions and 17 deletions

View file

@ -6,7 +6,7 @@
../site/flake-module.nix ../site/flake-module.nix
]; ];
systems = [ "x86_64-linux" "aarch64-darwin" ]; systems = [ "x86_64-linux" "aarch64-darwin" ];
perSystem = system: { config, self', inputs', pkgs, ... }: { perSystem = { config, self', inputs', pkgs, ... }: {
devShells.default = pkgs.mkShell { devShells.default = pkgs.mkShell {
nativeBuildInputs = [ nativeBuildInputs = [

View file

@ -20,11 +20,11 @@
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"
}, },
"locked": { "locked": {
"lastModified": 1653415319, "lastModified": 1653487348,
"narHash": "sha256-h+YUX7ZYujf73KL1R07LsEnhV7uV8oxSKEhH4bDj0Jc=", "narHash": "sha256-lWqxXMRqO8blpwhH2qvrFBVp6aZ7V+Z3xTqkNWKyLQw=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "hercules-ci-effects", "repo": "hercules-ci-effects",
"rev": "1f904af1824e7393702daaf40a8fed56ebead0d7", "rev": "0ab66b56d3f2b40ddfd981899d1757773632075f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -73,11 +73,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1638351750, "lastModified": 1653494825,
"narHash": "sha256-90OHC+11DIHD1QyMIPUuM3n6zjH5Mhc8RBZa0h8969A=", "narHash": "sha256-hMhnHZGRlJBX3yWIvxuYIBo4g+XQy/DJ4z7ti0IX7x0=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "pre-commit-hooks.nix", "repo": "pre-commit-hooks.nix",
"rev": "3bb289628867ac40fc9e7c514f8266b1ce8c0910", "rev": "89b64b7aca69fbd2957232d6a5a36bb93ad59d4b",
"type": "github" "type": "github"
}, },
"original": { "original": {

42
lib.nix
View file

@ -2,8 +2,17 @@
let let
inherit (lib) inherit (lib)
mkOption mkOption
mkOptionType
defaultFunctor
isAttrs
isFunction
showOption
types types
; ;
inherit (lib.types)
path
submoduleWith
;
# Polyfill functionTo to make sure it has type merging. # Polyfill functionTo to make sure it has type merging.
# Remove 2022-12 # Remove 2022-12
@ -26,6 +35,32 @@ let
nestedTypes.elemType = elemType; nestedTypes.elemType = elemType;
}; };
# Polyfill https://github.com/NixOS/nixpkgs/pull/163617
deferredModuleWith = lib.deferredModuleWith or (
attrs@{ staticModules ? [ ] }: mkOptionType {
name = "deferredModule";
description = "module";
check = x: isAttrs x || isFunction x || path.check x;
merge = loc: defs: staticModules ++ map (def: lib.setDefaultModuleLocation "${def.file}, via option ${showOption loc}" def.value) defs;
inherit (submoduleWith { modules = staticModules; })
getSubOptions
getSubModules;
substSubModules = m: deferredModuleWith (attrs // {
staticModules = m;
});
functor = defaultFunctor "deferredModuleWith" // {
type = deferredModuleWith;
payload = {
inherit staticModules;
};
binOp = lhs: rhs: {
staticModules = lhs.staticModules ++ rhs.staticModules;
};
};
}
);
flake-parts-lib = { flake-parts-lib = {
evalFlakeModule = evalFlakeModule =
{ self { self
@ -53,10 +88,9 @@ let
mkPerSystemType = mkPerSystemType =
module: module:
functionTo (types.submoduleWith { deferredModuleWith {
modules = [ module ]; staticModules = [ module ];
shorthandOnlyDefinesConfig = false; };
});
mkPerSystemOption = mkPerSystemOption =
module: module:

View file

@ -13,7 +13,7 @@
# #
{ {
config = { config = {
perSystem = _: { inputs', lib, ... }: { perSystem = { inputs', lib, ... }: {
config = { config = {
_module.args.pkgs = lib.mkOptionDefault ( _module.args.pkgs = lib.mkOptionDefault (
builtins.seq builtins.seq

View file

@ -34,6 +34,14 @@ in
_module.args.self' = rootConfig.perInput system self; _module.args.self' = rootConfig.perInput system self;
}; };
}); });
apply = modules: system:
(lib.evalModules {
inherit modules;
prefix = [ "perSystem" system ];
specialArgs = {
inherit system;
};
}).config;
}; };
allSystems = mkOption { allSystems = mkOption {
@ -44,7 +52,6 @@ in
}; };
config = { config = {
perSystem = system: { _module.args.system = system; };
allSystems = genAttrs config.systems config.perSystem; allSystems = genAttrs config.systems config.perSystem;
# TODO: Sub-optimal error message. Get Nix to support a memoization primop, or get Nix Flakes to support systems properly or get Nix Flakes to add a name to flakes. # TODO: Sub-optimal error message. Get Nix to support a memoization primop, or get Nix Flakes to support systems properly or get Nix Flakes to add a name to flakes.
_module.args.getSystem = system: config.allSystems.${system} or (builtins.trace "using non-memoized system ${system}" config.perSystem system); _module.args.getSystem = system: config.allSystems.${system} or (builtins.trace "using non-memoized system ${system}" config.perSystem system);

View file

@ -1,5 +1,5 @@
{ ... }: { { ... }: {
perSystem = system: { config, self', inputs', pkgs, lib, ... }: perSystem = { config, self', inputs', pkgs, lib, ... }:
let let
inherit (lib) filter any hasPrefix concatMap removePrefix; inherit (lib) filter any hasPrefix concatMap removePrefix;

View file

@ -17,7 +17,7 @@
]; ];
systems = [ "x86_64-linux" "aarch64-darwin" ]; systems = [ "x86_64-linux" "aarch64-darwin" ];
perSystem = system: { config, self', inputs', pkgs, ... }: { perSystem = { config, self', inputs', pkgs, system, ... }: {
# Per-system attributes can be defined here. The self' and inputs' # Per-system attributes can be defined here. The self' and inputs'
# module parameters provide easy access to attributes of the same # module parameters provide easy access to attributes of the same
# system. # system.

View file

@ -13,7 +13,7 @@
./hello/flake-module.nix ./hello/flake-module.nix
]; ];
systems = [ "x86_64-linux" "aarch64-darwin" ]; systems = [ "x86_64-linux" "aarch64-darwin" ];
perSystem = system: { config, self', inputs', ... }: { perSystem = { config, self', inputs', ... }: {
# Per-system attributes can be defined here. The self' and inputs' # Per-system attributes can be defined here. The self' and inputs'
# module parameters provide easy access to attributes of the same # module parameters provide easy access to attributes of the same
# system. # system.

View file

@ -1,7 +1,7 @@
# Definitions can be imported from a separate file like this one # Definitions can be imported from a separate file like this one
{ self, ... }: { { self, ... }: {
perSystem = system: { config, self', inputs', pkgs, ... }: { perSystem = { config, self', inputs', pkgs, ... }: {
# Definitions like this are entirely equivalent to the ones # Definitions like this are entirely equivalent to the ones
# you may have directly in flake.nix. # you may have directly in flake.nix.
packages.hello = pkgs.hello; packages.hello = pkgs.hello;