nixpkgs module: Clean up platform options

- `localSystem` is added, it strictly supercedes system

- `crossSystem`'s description mentions `localSystem` (and vice versa).

- No more weird special casing I don't even understand

TEMP

Changed files
+65 -24
lib
systems
nixos
doc
lib
modules
misc
services
virtualisation
pkgs
stdenv
generic
+2 -2
lib/systems/parse.nix
···
################################################################################
-
types.system = mkOptionType {
+
types.parsedPlatform = mkOptionType {
name = "system";
description = "fully parsed representation of llvm- or nix-style platform tuple";
merge = mergeOneOption;
···
isSystem = isType "system";
mkSystem = components:
-
assert types.system.check components;
+
assert types.parsedPlatform.check components;
setType "system" components;
mkSkeletonFromList = l: {
+3 -3
nixos/doc/manual/man-nixos-build-vms.xml
···
test1 = {pkgs, config, ...}:
{
services.openssh.enable = true;
-
nixpkgs.system = "i686-linux";
+
nixpkgs.localSystem.system = "i686-linux";
deployment.targetHost = "test1.example.net";
# Other NixOS options
···
services.openssh.enable = true;
services.httpd.enable = true;
environment.systemPackages = [ pkgs.lynx ];
-
nixpkgs.system = "x86_64-linux";
+
nixpkgs.localSystem.system = "x86_64-linux";
deployment.targetHost = "test2.example.net";
# Other NixOS options
···
The <varname>deployment.targetHost</varname> specifies the address
(domain name or IP address)
of the system which is used by <command>ssh</command> to perform
-
remote deployment operations. The <varname>nixpkgs.system</varname>
+
remote deployment operations. The <varname>nixpkgs.localSystem.system</varname>
attribute can be used to specify an architecture for the target machine,
such as <varname>i686-linux</varname> which builds a 32-bit NixOS
configuration. Omitting this property will build the configuration
+2 -2
nixos/lib/eval-config.nix
···
, lib ? import ../../lib
}:
-
let extraArgs_ = extraArgs; pkgs_ = pkgs; system_ = system;
+
let extraArgs_ = extraArgs; pkgs_ = pkgs;
extraModules = let e = builtins.getEnv "NIXOS_EXTRA_MODULE_PATH";
in if e == "" then [] else [(import (builtins.toPath e))];
in
···
_file = ./eval-config.nix;
key = _file;
config = {
-
nixpkgs.system = lib.mkDefault system_;
+
nixpkgs.localSystem = lib.mkDefault { inherit system; };
_module.args.pkgs = lib.mkIf (pkgs_ != null) (lib.mkForce pkgs_);
};
};
+53 -12
nixos/modules/misc/nixpkgs.nix
···
pkgs = mkOption {
defaultText = literalExample
''import "''${nixos}/.." {
-
inherit (config.nixpkgs) config overlays system;
+
inherit (config.nixpkgs) config overlays localSystem crossSystem;
}
'';
-
default = import ../../.. { inherit (cfg) config overlays system crossSystem; };
+
default = import ../../.. {
+
localSystem = { inherit (cfg) system; } // cfg.localSystem;
+
inherit (cfg) config overlays crossSystem;
+
};
type = pkgsType;
example = literalExample ''import <nixpkgs> {}'';
description = ''
···
relative to the location of this NixOS module, because
NixOS and Nixpkgs are distributed together for consistency,
so the <code>nixos</code> in the default value is in fact a
-
relative path. The <code>config</code>, <code>overlays</code>
-
and <code>system</code> come from this option's siblings.
+
relative path. The <code>config</code>, <code>overlays</code>,
+
<code>localSystem</code>, and <code>crossSystem</code> come
+
from this option's siblings.
This option can be used by applications like NixOps to increase
the performance of evaluation, or to create packages that depend
···
'';
};
+
localSystem = mkOption {
+
type = types.attrs; # TODO utilize lib.systems.parsedPlatform
+
default = { system = builtins.currentSystem; };
+
example = { system = "aarch64-linux"; config = "aarch64-unknown-linux-gnu"; };
+
defaultText = literalExample
+
''(import "''${nixos}/../lib").lib.systems.examples.aarch64-multiplatform'';
+
description = ''
+
Specifies the platform on which NixOS should be built. When
+
<code>nixpkgs.crossSystem</code> is unset, it also specifies
+
the platform <emphasis>for</emphasis> which NixOS should be
+
built. If this option is unset, it defaults to the platform
+
type of the machine where evaluation happens. Specifying this
+
option is useful when doing distributed multi-platform
+
deployment, or when building virtual machines. See its
+
description in the Nixpkgs manual for more details.
+
+
Ignored when <code>nixpkgs.pkgs</code> is set.
+
'';
+
};
+
crossSystem = mkOption {
-
type = types.nullOr types.attrs;
+
type = types.nullOr types.attrs; # TODO utilize lib.systems.parsedPlatform
default = null;
+
example = { system = "aarch64-linux"; config = "aarch64-unknown-linux-gnu"; };
+
defaultText = literalExample
+
''(import "''${nixos}/../lib").lib.systems.examples.aarch64-multiplatform'';
description = ''
-
The description of the system we're cross-compiling to, or null
-
if this isn't a cross-compile. See the description of the
-
crossSystem argument in the nixpkgs manual.
+
Specifies the platform for which NixOS should be
+
built. Specify this only if it is different from
+
<code>nixpkgs.localSystem</code>, the platform
+
<emphasis>on</emphasis> which NixOS should be built. In other
+
words, specify this to cross-compile NixOS. Otherwise it
+
should be set as null, the default. See its description in the
+
Nixpkgs manual for more details.
Ignored when <code>nixpkgs.pkgs</code> is set.
'';
···
type = types.str;
example = "i686-linux";
description = ''
-
Specifies the Nix platform type for which NixOS should be built.
-
If unset, it defaults to the platform type of your host system.
-
Specifying this option is useful when doing distributed
-
multi-platform deployment, or when building virtual machines.
+
Specifies the Nix platform type on which NixOS should be built.
+
It is better to specify <code>nixpkgs.localSystem</code> instead.
+
<programlisting>
+
{
+
nixpkgs.system = ..;
+
}
+
</programlisting>
+
is the same as
+
<programlisting>
+
{
+
nixpkgs.localSystem.system = ..;
+
}
+
</programlisting>
+
See <code>nixpkgs.localSystem</code> for more information.
Ignored when <code>nixpkgs.pkgs</code> is set.
'';
+1 -1
nixos/modules/services/misc/dysnomia.nix
···
services.dysnomia.properties = {
hostname = config.networking.hostName;
-
system = if config.nixpkgs.system == "" then builtins.currentSystem else config.nixpkgs.system;
+
inherit (config.nixpkgs.localSystem) system;
supportedTypes = (import "${pkgs.stdenv.mkDerivation {
name = "supportedtypes";
+1 -1
nixos/modules/services/misc/nixos-manual.nix
···
options =
let
scrubbedEval = evalModules {
-
modules = [ { nixpkgs.system = config.nixpkgs.system; } ] ++ baseModules;
+
modules = [ { nixpkgs.localSystem = config.nixpkgs.localSystem; } ] ++ baseModules;
args = (config._module.args) // { modules = [ ]; };
specialArgs = { pkgs = scrubDerivations "pkgs" pkgs; };
};
+2 -2
nixos/modules/virtualisation/containers.nix
···
# If the host is 64-bit and the container is 32-bit, add a
# --personality flag.
-
${optionalString (config.nixpkgs.system == "x86_64-linux") ''
+
${optionalString (config.nixpkgs.localSystem.system == "x86_64-linux") ''
if [ "$(< ''${SYSTEM_PATH:-/nix/var/nix/profiles/per-container/$INSTANCE/system}/system)" = i686-linux ]; then
extraFlags+=" --personality=x86"
fi
···
};
-
system = config.nixpkgs.system;
+
system = config.nixpkgs.localSystem.system;
bindMountOpts = { name, config, ... }: {
+1 -1
pkgs/stdenv/generic/check-meta.nix
···
license = either (listOf lib.types.attrs) (either lib.types.attrs str);
maintainers = listOf (attrsOf str);
priority = int;
-
platforms = listOf (either str lib.systems.parsed.types.system);
+
platforms = listOf (either str lib.systems.parsedPlatform.types.system);
hydraPlatforms = listOf str;
broken = bool;