pkgs/top-level: check types of nixpkgs.config

This patch simply introduces a plain simple NixOS module and passes
`nixpkgs.config` through it via `evalModules` (with some temporary hackery to
passthru undefined options).
This commit is contained in:
Jan Malakhovski 2019-02-23 00:00:01 +00:00 committed by danbst
parent 570aed4b46
commit 4a647dd225
2 changed files with 72 additions and 6 deletions

51
pkgs/top-level/config.nix Normal file
View file

@ -0,0 +1,51 @@
# This file defines the structure of the `config` nixpkgs option.
{ lib, config, ... }:
with lib;
let
mkMeta = args: mkOption (builtins.removeAttrs args [ "feature" ] // {
type = args.type or (types.uniq types.bool);
default = args.default or false;
description = args.description or ''
Whether to ${args.feature} while evaluating nixpkgs.
'' + ''
Changing the default will not cause any rebuilds.
'';
});
mkMassRebuild = args: mkOption (builtins.removeAttrs args [ "feature" ] // {
type = args.type or (types.uniq types.bool);
default = args.default or false;
description = (args.description or ''
Whether to ${args.feature} while building nixpkgs packages.
'') + ''
Changing the default will cause a mass rebuild.
'';
});
options = {
/* Internal stuff */
warnings = mkOption {
type = types.listOf types.str;
default = [];
internal = true;
};
/* Config options */
doCheckByDefault = mkMassRebuild {
feature = "run <literal>checkPhase</literal> by default";
};
};
in {
inherit options;
}

View file

@ -41,7 +41,7 @@
} @ args:
let # Rename the function arguments
configExpr = config;
config0 = config;
crossSystem0 = crossSystem;
in let
@ -50,22 +50,37 @@ in let
# Allow both:
# { /* the config */ } and
# { pkgs, ... } : { /* the config */ }
config =
if lib.isFunction configExpr
then configExpr { inherit pkgs; }
else configExpr;
config1 =
if lib.isFunction config0
then config0 { inherit pkgs; }
else config0;
# From a minimum of `system` or `config` (actually a target triple, *not*
# nixpkgs configuration), infer the other one and platform as needed.
localSystem = lib.systems.elaborate (
# Allow setting the platform in the config file. This take precedence over
# the inferred platform, but not over an explicitly passed-in one.
builtins.intersectAttrs { platform = null; } config
builtins.intersectAttrs { platform = null; } config1
// args.localSystem);
crossSystem = if crossSystem0 == null then localSystem
else lib.systems.elaborate crossSystem0;
configEval = lib.evalModules {
modules = [
./config.nix
({ options, ... }: {
_file = "nixpkgs.config";
# filter-out known options, FIXME: remove this eventually
config = builtins.intersectAttrs options config1;
})
];
};
# take all the rest as-is
config = lib.showWarnings configEval.config.warnings
(config1 // builtins.removeAttrs configEval.config [ "_module" ]);
# A few packages make a new package set to draw their dependencies from.
# (Currently to get a cross tool chain, or forced-i686 package.) Rather than
# give `all-packages.nix` all the arguments to this function, even ones that