diff --git a/modules/top-level/nixpkgs.nix b/modules/top-level/nixpkgs.nix index 3827f2d0..5e4c7b04 100644 --- a/modules/top-level/nixpkgs.nix +++ b/modules/top-level/nixpkgs.nix @@ -54,17 +54,7 @@ in description = '' If set, the `pkgs` argument to all Nixvim modules is the value of this option. - - If unset, an assertion will trigger. In the future a `pkgs` instance will be constructed. - - + If unset, the `pkgs` argument is determined by importing `nixpkgs.source`. This option can be used by external applications to increase the performance of evaluation, or to create packages that depend on a container that should be built with the exact same @@ -160,15 +150,8 @@ in For details, see the [Overlays chapter in the Nixpkgs manual](https://nixos.org/manual/nixpkgs/stable/#chap-overlays). - - Overlays specified using the {option}`nixpkgs.overlays` option will be - applied after the overlays that were already included in `nixpkgs.pkgs`. - - + If the {option}`nixpkgs.pkgs` option is set, overlays specified using `nixpkgs.overlays` + will be applied after the overlays that were already included in `nixpkgs.pkgs`. ''; }; @@ -228,26 +211,33 @@ in Ignored when `nixpkgs.pkgs` is set. ''; - - # FIXME: This is a stub option for now - internal = true; }; }; config = let - # TODO: construct a default pkgs instance from pkgsPath and cfg options - # https://github.com/nix-community/nixvim/issues/1784 - finalPkgs = if opt.pkgs.isDefined then cfg.pkgs.appendOverlays cfg.overlays else - # TODO: Remove once pkgs can be constructed internally - throw '' - nixvim: `nixpkgs.pkgs` is not defined. In the future, this option will be optional. - Currently a pkgs instance must be evaluated externally and assigned to `nixpkgs.pkgs` option. - ''; + let + args = { + inherit (cfg) config overlays; + }; + + # Configure `localSystem` and `crossSystem` as required + systemArgs = + if cfg.buildPlatform == cfg.hostPlatform then + { + localSystem = cfg.hostPlatform; + } + else + { + localSystem = cfg.buildPlatform; + crossSystem = cfg.hostPlatform; + }; + in + import cfg.source (args // systemArgs); in { # We explicitly set the default override priority, so that we do not need @@ -258,11 +248,6 @@ in # don't need to evaluate `finalPkgs`. _module.args.pkgs = lib.mkOverride lib.modules.defaultOverridePriority finalPkgs.__splicedPackages; - # FIXME: This is a stub option for now - warnings = lib.optional ( - opt.source.isDefined && opt.source.highestPrio < (lib.mkOptionDefault null).priority - ) "Defining the option `nixpkgs.source` currently has no effect"; - assertions = [ { assertion = opt.pkgs.isDefined -> cfg.config == { }; diff --git a/tests/nixpkgs-mock.nix b/tests/nixpkgs-mock.nix new file mode 100644 index 00000000..174ff07b --- /dev/null +++ b/tests/nixpkgs-mock.nix @@ -0,0 +1,15 @@ +# This mock nixpkgs can be used as `nixpkgs.source` in nixpkgs-module-test +# if we want/need to avoid importing & instantiating a real nixpkgs +{ + config ? { }, + ... +}: +let + pkgs = { + _type = "pkgs"; + __splicedPackages = pkgs; + inherit config pkgs; + mock = true; + }; +in +pkgs diff --git a/tests/nixpkgs-module.nix b/tests/nixpkgs-module.nix index ba04381b..67f79619 100644 --- a/tests/nixpkgs-module.nix +++ b/tests/nixpkgs-module.nix @@ -36,7 +36,51 @@ let in linkFarmFromDrvs "nixpkgs-module-test" [ - # TODO: expect not setting `nixpkgs.pkgs` to throw + # Test that pkgs-config is affected by `nixpkgs.config` + (testModule "nixpkgs-config" ( + { pkgs, ... }: + { + nixpkgs.config = { + permittedInsecurePackages = [ + "foobar123" + ]; + }; + + nixpkgs.hostPlatform = { + inherit (stdenv.hostPlatform) system; + }; + + assertions = [ + { + assertion = pkgs.config.permittedInsecurePackages == [ "foobar123" ]; + message = '' + Expected `pkgs.config.permittedInsecurePackages` to match [ "foobar123" ], but found: + ${lib.generators.toPretty { } pkgs.config.permittedInsecurePackages}''; + } + ]; + } + )) + + # Test that a nixpkgs revision can be specified using `nixpkgs.source` + (testModule "nixpkgs-source" ( + { pkgs, ... }: + { + nixpkgs.source = ./nixpkgs-mock.nix; + + nixpkgs.hostPlatform = { + inherit (stdenv.hostPlatform) system; + }; + + assertions = [ + { + assertion = pkgs.mock or false; + message = "Expected `pkgs.mock` to be true, but ${ + if pkgs ? mock then "found " + lib.generators.toPretty { } pkgs.mock else "isn't present" + }"; + } + ]; + } + )) (testModule "nixpkgs-overlays" ( { pkgs, ... }: