From 4a647dd225571e91d81c1306c69e3473fdd9a8c5 Mon Sep 17 00:00:00 2001 From: Jan Malakhovski Date: Sat, 23 Feb 2019 00:00:01 +0000 Subject: [PATCH] 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). --- pkgs/top-level/config.nix | 51 ++++++++++++++++++++++++++++++++++++++ pkgs/top-level/default.nix | 27 +++++++++++++++----- 2 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 pkgs/top-level/config.nix diff --git a/pkgs/top-level/config.nix b/pkgs/top-level/config.nix new file mode 100644 index 000000000000..62e4bebe4497 --- /dev/null +++ b/pkgs/top-level/config.nix @@ -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 checkPhase by default"; + }; + + }; + +in { + + inherit options; + +} diff --git a/pkgs/top-level/default.nix b/pkgs/top-level/default.nix index f2de6d6f81d4..4afea6d7fdff 100644 --- a/pkgs/top-level/default.nix +++ b/pkgs/top-level/default.nix @@ -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