treewide: fix loss of precision in NixOS systems

Prior to this patch:

$ nix-instantiate --eval -E '
> with import ./. {
> localSystem.config = "aarch64-unknown-linux-musl";
> };
> (nixos {}).config.nixpkgs.localSystem.config
> '
"aarch64-unknown-linux-gnu"

Because only the system triple was being passed through, the Musl part
of the system specification was lost. This patch fixes various
occurrences of NixOS evaluation when a Nixpkgs evaluation is already
available, to pass through the full elaborated system attribute set,
to avoid this loss of precision.

Changed files
+5 -4
nixos
modules
virtualisation
tests
pkgs
top-level
+2 -2
nixos/modules/virtualisation/nixos-containers.nix
···
DeviceAllow = map (d: "${d.node} ${d.modifier}") cfg.allowedDevices;
};
-
system = config.nixpkgs.localSystem.system;
kernelVersion = config.boot.kernelPackages.kernel.version;
bindMountOpts = { name, ... }: {
···
type = lib.mkOptionType {
name = "Toplevel NixOS config";
merge = loc: defs: (import "${toString config.nixpkgs}/nixos/lib/eval-config.nix" {
-
inherit system;
modules =
let
extraConfig = {
_file = "module at ${__curPos.file}:${toString __curPos.line}";
config = {
boot.isContainer = true;
networking.hostName = mkDefault name;
networking.useDHCP = false;
···
DeviceAllow = map (d: "${d.node} ${d.modifier}") cfg.allowedDevices;
};
+
inherit (config.nixpkgs) localSystem;
kernelVersion = config.boot.kernelPackages.kernel.version;
bindMountOpts = { name, ... }: {
···
type = lib.mkOptionType {
name = "Toplevel NixOS config";
merge = loc: defs: (import "${toString config.nixpkgs}/nixos/lib/eval-config.nix" {
modules =
let
extraConfig = {
_file = "module at ${__curPos.file}:${toString __curPos.line}";
config = {
+
nixpkgs = { inherit localSystem; };
boot.isContainer = true;
networking.hostName = mkDefault name;
networking.useDHCP = false;
+2 -1
nixos/tests/containers-imperative.nix
···
# container available within the VM, because we don't have network access.
virtualisation.additionalPaths = let
emptyContainer = import ../lib/eval-config.nix {
-
inherit (config.nixpkgs.localSystem) system;
modules = lib.singleton {
containers.foo.config = {
system.stateVersion = "18.03";
};
···
# container available within the VM, because we don't have network access.
virtualisation.additionalPaths = let
emptyContainer = import ../lib/eval-config.nix {
modules = lib.singleton {
+
nixpkgs = { inherit (config.nixpkgs) localSystem; };
+
containers.foo.config = {
system.stateVersion = "18.03";
};
+1 -1
pkgs/top-level/all-packages.nix
···
configuration:
let
c = import (path + "/nixos/lib/eval-config.nix") {
-
inherit (stdenv.hostPlatform) system;
modules =
[(
{ lib, ... }: {
config.nixpkgs.pkgs = lib.mkDefault pkgs;
}
)] ++ (
if builtins.isList configuration
···
configuration:
let
c = import (path + "/nixos/lib/eval-config.nix") {
modules =
[(
{ lib, ... }: {
config.nixpkgs.pkgs = lib.mkDefault pkgs;
+
config.nixpkgs.localSystem = lib.mkDefault stdenv.hostPlatform;
}
)] ++ (
if builtins.isList configuration