Merge pull request #177672 from hercules-ci/nixos-generate-config-add-nixpkgs.system
nixos-generate-config: Add nixpkgs.hostPlatform to hardware-configuration.nix
This commit is contained in:
commit
c7eacbf87e
@ -131,7 +131,8 @@ let
|
|||||||
getValues getFiles
|
getValues getFiles
|
||||||
optionAttrSetToDocList optionAttrSetToDocList'
|
optionAttrSetToDocList optionAttrSetToDocList'
|
||||||
scrubOptionValue literalExpression literalExample literalDocBook
|
scrubOptionValue literalExpression literalExample literalDocBook
|
||||||
showOption showFiles unknownModule mkOption mkPackageOption
|
showOption showOptionWithDefLocs showFiles
|
||||||
|
unknownModule mkOption mkPackageOption
|
||||||
mdDoc literalMD;
|
mdDoc literalMD;
|
||||||
inherit (self.types) isType setType defaultTypeMerge defaultFunctor
|
inherit (self.types) isType setType defaultTypeMerge defaultFunctor
|
||||||
isOptionType mkOptionType;
|
isOptionType mkOptionType;
|
||||||
|
@ -7,6 +7,7 @@ let
|
|||||||
collect
|
collect
|
||||||
concatLists
|
concatLists
|
||||||
concatMap
|
concatMap
|
||||||
|
concatMapStringsSep
|
||||||
elemAt
|
elemAt
|
||||||
filter
|
filter
|
||||||
foldl'
|
foldl'
|
||||||
@ -340,6 +341,11 @@ rec {
|
|||||||
in "\n- In `${def.file}'${result}"
|
in "\n- In `${def.file}'${result}"
|
||||||
) defs;
|
) defs;
|
||||||
|
|
||||||
|
showOptionWithDefLocs = opt: ''
|
||||||
|
${showOption opt.loc}, with values defined in:
|
||||||
|
${concatMapStringsSep "\n" (defFile: " - ${defFile}") opt.files}
|
||||||
|
'';
|
||||||
|
|
||||||
unknownModule = "<unknown-file>";
|
unknownModule = "<unknown-file>";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,65 @@
|
|||||||
<literal>stdenv.buildPlatform.canExecute stdenv.hostPlatform</literal>.
|
<literal>stdenv.buildPlatform.canExecute stdenv.hostPlatform</literal>.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
The <literal>nixpkgs.hostPlatform</literal> and
|
||||||
|
<literal>nixpkgs.buildPlatform</literal> options have been
|
||||||
|
added. These cover and override the
|
||||||
|
<literal>nixpkgs.{system,localSystem,crossSystem}</literal>
|
||||||
|
options.
|
||||||
|
</para>
|
||||||
|
<itemizedlist spacing="compact">
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<literal>hostPlatform</literal> is the platform or
|
||||||
|
<quote><literal>system</literal></quote> string of the
|
||||||
|
NixOS system described by the configuration.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<literal>buildPlatform</literal> is the platform that is
|
||||||
|
responsible for building the NixOS configuration. It
|
||||||
|
defaults to the <literal>hostPlatform</literal>, for a
|
||||||
|
non-cross build configuration. To cross compile, set
|
||||||
|
<literal>buildPlatform</literal> to a different value.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
<para>
|
||||||
|
The new options convey the same information, but with fewer
|
||||||
|
options, and following the Nixpkgs terminology.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The existing options
|
||||||
|
<literal>nixpkgs.{system,localSystem,crossSystem}</literal>
|
||||||
|
have not been formally deprecated, to allow for evaluation of
|
||||||
|
the change and to allow for a transition period so that in
|
||||||
|
time the ecosystem can switch without breaking compatibility
|
||||||
|
with any supported NixOS release.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<literal>nixos-generate-config</literal> now generates
|
||||||
|
configurations that can be built in pure mode. This is
|
||||||
|
achieved by setting the new
|
||||||
|
<literal>nixpkgs.hostPlatform</literal> option.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You may have to unset the <literal>system</literal> parameter
|
||||||
|
in <literal>lib.nixosSystem</literal>, or similarly remove
|
||||||
|
definitions of the
|
||||||
|
<literal>nixpkgs.{system,localSystem,crossSystem}</literal>
|
||||||
|
options.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Alternatively, you can remove the
|
||||||
|
<literal>hostPlatform</literal> line and use NixOS like you
|
||||||
|
would in NixOS 22.05 and earlier.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
PHP now defaults to PHP 8.1, updated from 8.0.
|
PHP now defaults to PHP 8.1, updated from 8.0.
|
||||||
|
@ -17,6 +17,33 @@ In addition to numerous new and upgraded packages, this release has the followin
|
|||||||
built for `stdenv.hostPlatform` (i.e. produced by `stdenv.cc`) by evaluating
|
built for `stdenv.hostPlatform` (i.e. produced by `stdenv.cc`) by evaluating
|
||||||
`stdenv.buildPlatform.canExecute stdenv.hostPlatform`.
|
`stdenv.buildPlatform.canExecute stdenv.hostPlatform`.
|
||||||
|
|
||||||
|
- The `nixpkgs.hostPlatform` and `nixpkgs.buildPlatform` options have been added.
|
||||||
|
These cover and override the `nixpkgs.{system,localSystem,crossSystem}` options.
|
||||||
|
|
||||||
|
- `hostPlatform` is the platform or "`system`" string of the NixOS system
|
||||||
|
described by the configuration.
|
||||||
|
- `buildPlatform` is the platform that is responsible for building the NixOS
|
||||||
|
configuration. It defaults to the `hostPlatform`, for a non-cross
|
||||||
|
build configuration. To cross compile, set `buildPlatform` to a different
|
||||||
|
value.
|
||||||
|
|
||||||
|
The new options convey the same information, but with fewer options, and
|
||||||
|
following the Nixpkgs terminology.
|
||||||
|
|
||||||
|
The existing options `nixpkgs.{system,localSystem,crossSystem}` have not
|
||||||
|
been formally deprecated, to allow for evaluation of the change and to allow
|
||||||
|
for a transition period so that in time the ecosystem can switch without
|
||||||
|
breaking compatibility with any supported NixOS release.
|
||||||
|
|
||||||
|
- `nixos-generate-config` now generates configurations that can be built in pure
|
||||||
|
mode. This is achieved by setting the new `nixpkgs.hostPlatform` option.
|
||||||
|
|
||||||
|
You may have to unset the `system` parameter in `lib.nixosSystem`, or similarly
|
||||||
|
remove definitions of the `nixpkgs.{system,localSystem,crossSystem}` options.
|
||||||
|
|
||||||
|
Alternatively, you can remove the `hostPlatform` line and use NixOS like you
|
||||||
|
would in NixOS 22.05 and earlier.
|
||||||
|
|
||||||
- PHP now defaults to PHP 8.1, updated from 8.0.
|
- PHP now defaults to PHP 8.1, updated from 8.0.
|
||||||
|
|
||||||
- `hardware.nvidia` has a new option `open` that can be used to opt in the opensource version of NVIDIA kernel driver. Note that the driver's support for GeForce and Workstation GPUs is still alpha quality, see [NVIDIA Releases Open-Source GPU Kernel Modules](https://developer.nvidia.com/blog/nvidia-releases-open-source-gpu-kernel-modules/) for the official announcement.
|
- `hardware.nvidia` has a new option `open` that can be used to opt in the opensource version of NVIDIA kernel driver. Note that the driver's support for GeForce and Workstation GPUs is still alpha quality, see [NVIDIA Releases Open-Source GPU Kernel Modules](https://developer.nvidia.com/blog/nvidia-releases-open-source-gpu-kernel-modules/) for the official announcement.
|
||||||
|
@ -84,6 +84,15 @@ sub debug {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# nixpkgs.system
|
||||||
|
my ($status, @systemLines) = runCommand("nix-instantiate --impure --eval --expr builtins.currentSystem");
|
||||||
|
if ($status != 0 || join("", @systemLines) =~ /error/) {
|
||||||
|
die "Failed to retrieve current system type from nix.\n";
|
||||||
|
}
|
||||||
|
chomp(my $system = @systemLines[0]);
|
||||||
|
push @attrs, "nixpkgs.hostPlatform = lib.mkDefault $system;";
|
||||||
|
|
||||||
|
|
||||||
my $cpuinfo = read_file "/proc/cpuinfo";
|
my $cpuinfo = read_file "/proc/cpuinfo";
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,9 +55,46 @@ let
|
|||||||
check = builtins.isAttrs;
|
check = builtins.isAttrs;
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultPkgs = import ../../.. {
|
hasBuildPlatform = opt.buildPlatform.highestPrio < (mkOptionDefault {}).priority;
|
||||||
inherit (cfg) config overlays localSystem crossSystem;
|
hasHostPlatform = opt.hostPlatform.isDefined;
|
||||||
};
|
hasPlatform = hasHostPlatform || hasBuildPlatform;
|
||||||
|
|
||||||
|
# Context for messages
|
||||||
|
hostPlatformLine = optionalString hasHostPlatform "${showOptionWithDefLocs opt.hostPlatform}";
|
||||||
|
buildPlatformLine = optionalString hasBuildPlatform "${showOptionWithDefLocs opt.buildPlatform}";
|
||||||
|
platformLines = optionalString hasPlatform ''
|
||||||
|
Your system configuration configures nixpkgs with platform parameters:
|
||||||
|
${hostPlatformLine
|
||||||
|
}${buildPlatformLine
|
||||||
|
}'';
|
||||||
|
|
||||||
|
legacyOptionsDefined =
|
||||||
|
optional opt.system.isDefined opt.system
|
||||||
|
++ (optional (opt.localSystem.highestPrio < (mkOptionDefault {}).priority) opt.localSystem)
|
||||||
|
++ (optional (opt.crossSystem.highestPrio < (mkOptionDefault {}).priority) opt.crossSystem)
|
||||||
|
;
|
||||||
|
|
||||||
|
defaultPkgs =
|
||||||
|
if opt.hostPlatform.isDefined
|
||||||
|
then
|
||||||
|
let isCross = cfg.buildPlatform != cfg.hostPlatform;
|
||||||
|
systemArgs =
|
||||||
|
if isCross
|
||||||
|
then {
|
||||||
|
localSystem = cfg.buildPlatform;
|
||||||
|
crossSystem = cfg.hostPlatform;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
localSystem = cfg.hostPlatform;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
import ../../.. ({
|
||||||
|
inherit (cfg) config overlays;
|
||||||
|
} // systemArgs)
|
||||||
|
else
|
||||||
|
import ../../.. {
|
||||||
|
inherit (cfg) config overlays localSystem crossSystem;
|
||||||
|
};
|
||||||
|
|
||||||
finalPkgs = if opt.pkgs.isDefined then cfg.pkgs.appendOverlays cfg.overlays else defaultPkgs;
|
finalPkgs = if opt.pkgs.isDefined then cfg.pkgs.appendOverlays cfg.overlays else defaultPkgs;
|
||||||
|
|
||||||
@ -157,6 +194,46 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
hostPlatform = mkOption {
|
||||||
|
type = types.either types.str types.attrs; # TODO utilize lib.systems.parsedPlatform
|
||||||
|
example = { system = "aarch64-linux"; config = "aarch64-unknown-linux-gnu"; };
|
||||||
|
# Make sure that the final value has all fields for sake of other modules
|
||||||
|
# referring to this. TODO make `lib.systems` itself use the module system.
|
||||||
|
apply = lib.systems.elaborate;
|
||||||
|
defaultText = literalExpression
|
||||||
|
''(import "''${nixos}/../lib").lib.systems.examples.aarch64-multiplatform'';
|
||||||
|
description = ''
|
||||||
|
Specifies the platform where the NixOS configuration will run.
|
||||||
|
|
||||||
|
To cross-compile, set also <code>nixpkgs.buildPlatform</code>.
|
||||||
|
|
||||||
|
Ignored when <code>nixpkgs.pkgs</code> is set.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
buildPlatform = mkOption {
|
||||||
|
type = types.either types.str types.attrs; # TODO utilize lib.systems.parsedPlatform
|
||||||
|
default = cfg.hostPlatform;
|
||||||
|
example = { system = "x86_64-linux"; config = "x86_64-unknown-linux-gnu"; };
|
||||||
|
# Make sure that the final value has all fields for sake of other modules
|
||||||
|
# referring to this.
|
||||||
|
apply = lib.systems.elaborate;
|
||||||
|
defaultText = literalExpression
|
||||||
|
''config.nixpkgs.hostPlatform'';
|
||||||
|
description = ''
|
||||||
|
Specifies the platform on which NixOS should be built.
|
||||||
|
By default, NixOS is built on the system where it runs, but you can
|
||||||
|
change where it's built. Setting this option will cause NixOS to be
|
||||||
|
cross-compiled.
|
||||||
|
|
||||||
|
For instance, if you're doing distributed multi-platform deployment,
|
||||||
|
or if you're building machines, you can set this to match your
|
||||||
|
development system and/or build farm.
|
||||||
|
|
||||||
|
Ignored when <code>nixpkgs.pkgs</code> is set.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
localSystem = mkOption {
|
localSystem = mkOption {
|
||||||
type = types.attrs; # TODO utilize lib.systems.parsedPlatform
|
type = types.attrs; # TODO utilize lib.systems.parsedPlatform
|
||||||
default = { inherit (cfg) system; };
|
default = { inherit (cfg) system; };
|
||||||
@ -176,10 +253,13 @@ in
|
|||||||
deployment, or when building virtual machines. See its
|
deployment, or when building virtual machines. See its
|
||||||
description in the Nixpkgs manual for more details.
|
description in the Nixpkgs manual for more details.
|
||||||
|
|
||||||
Ignored when <code>nixpkgs.pkgs</code> is set.
|
Ignored when <code>nixpkgs.pkgs</code> or <code>hostPlatform</code> is set.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# TODO deprecate. "crossSystem" is a nonsense identifier, because "cross"
|
||||||
|
# is a relation between at least 2 systems in the context of a
|
||||||
|
# specific build step, not a single system.
|
||||||
crossSystem = mkOption {
|
crossSystem = mkOption {
|
||||||
type = types.nullOr types.attrs; # TODO utilize lib.systems.parsedPlatform
|
type = types.nullOr types.attrs; # TODO utilize lib.systems.parsedPlatform
|
||||||
default = null;
|
default = null;
|
||||||
@ -193,7 +273,7 @@ in
|
|||||||
should be set as null, the default. See its description in the
|
should be set as null, the default. See its description in the
|
||||||
Nixpkgs manual for more details.
|
Nixpkgs manual for more details.
|
||||||
|
|
||||||
Ignored when <code>nixpkgs.pkgs</code> is set.
|
Ignored when <code>nixpkgs.pkgs</code> or <code>hostPlatform</code> is set.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -216,8 +296,7 @@ in
|
|||||||
</programlisting>
|
</programlisting>
|
||||||
See <code>nixpkgs.localSystem</code> for more information.
|
See <code>nixpkgs.localSystem</code> for more information.
|
||||||
|
|
||||||
Ignored when <code>nixpkgs.localSystem</code> is set.
|
Ignored when <code>nixpkgs.pkgs</code>, <code>nixpkgs.localSystem</code> or <code>nixpkgs.hostPlatform</code> is set.
|
||||||
Ignored when <code>nixpkgs.pkgs</code> is set.
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -240,10 +319,23 @@ in
|
|||||||
else "nixpkgs.localSystem";
|
else "nixpkgs.localSystem";
|
||||||
pkgsSystem = finalPkgs.stdenv.targetPlatform.system;
|
pkgsSystem = finalPkgs.stdenv.targetPlatform.system;
|
||||||
in {
|
in {
|
||||||
assertion = nixosExpectedSystem == pkgsSystem;
|
assertion = !hasPlatform -> nixosExpectedSystem == pkgsSystem;
|
||||||
message = "The NixOS nixpkgs.pkgs option was set to a Nixpkgs invocation that compiles to target system ${pkgsSystem} but NixOS was configured for system ${nixosExpectedSystem} via NixOS option ${nixosOption}. The NixOS system settings must match the Nixpkgs target system.";
|
message = "The NixOS nixpkgs.pkgs option was set to a Nixpkgs invocation that compiles to target system ${pkgsSystem} but NixOS was configured for system ${nixosExpectedSystem} via NixOS option ${nixosOption}. The NixOS system settings must match the Nixpkgs target system.";
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
{
|
||||||
|
assertion = hasPlatform -> legacyOptionsDefined == [];
|
||||||
|
message = ''
|
||||||
|
Your system configures nixpkgs with the platform parameter${optionalString hasBuildPlatform "s"}:
|
||||||
|
${hostPlatformLine
|
||||||
|
}${buildPlatformLine
|
||||||
|
}
|
||||||
|
However, it also defines the legacy options:
|
||||||
|
${concatMapStrings showOptionWithDefLocs legacyOptionsDefined}
|
||||||
|
For a future proof system configuration, we recommend to remove
|
||||||
|
the legacy definitions.
|
||||||
|
'';
|
||||||
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,8 +1,63 @@
|
|||||||
{ evalMinimalConfig, pkgs, lib, stdenv }:
|
{ evalMinimalConfig, pkgs, lib, stdenv }:
|
||||||
|
let
|
||||||
|
eval = mod: evalMinimalConfig {
|
||||||
|
imports = [ ../nixpkgs.nix mod ];
|
||||||
|
};
|
||||||
|
withHost = eval {
|
||||||
|
nixpkgs.hostPlatform = "aarch64-linux";
|
||||||
|
};
|
||||||
|
withHostAndBuild = eval {
|
||||||
|
nixpkgs.hostPlatform = "aarch64-linux";
|
||||||
|
nixpkgs.buildPlatform = "aarch64-darwin";
|
||||||
|
};
|
||||||
|
ambiguous = {
|
||||||
|
_file = "ambiguous.nix";
|
||||||
|
nixpkgs.hostPlatform = "aarch64-linux";
|
||||||
|
nixpkgs.buildPlatform = "aarch64-darwin";
|
||||||
|
nixpkgs.system = "x86_64-linux";
|
||||||
|
nixpkgs.localSystem.system = "x86_64-darwin";
|
||||||
|
nixpkgs.crossSystem.system = "i686-linux";
|
||||||
|
imports = [
|
||||||
|
{ _file = "repeat.nix";
|
||||||
|
nixpkgs.hostPlatform = "aarch64-linux";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
getErrors = module:
|
||||||
|
let
|
||||||
|
uncheckedEval = lib.evalModules { modules = [ ../nixpkgs.nix module ]; };
|
||||||
|
in map (ass: ass.message) (lib.filter (ass: !ass.assertion) uncheckedEval.config.assertions);
|
||||||
|
in
|
||||||
lib.recurseIntoAttrs {
|
lib.recurseIntoAttrs {
|
||||||
invokeNixpkgsSimple =
|
invokeNixpkgsSimple =
|
||||||
(evalMinimalConfig ({ config, modulesPath, ... }: {
|
(eval {
|
||||||
imports = [ (modulesPath + "/misc/nixpkgs.nix") ];
|
|
||||||
nixpkgs.system = stdenv.hostPlatform.system;
|
nixpkgs.system = stdenv.hostPlatform.system;
|
||||||
}))._module.args.pkgs.hello;
|
})._module.args.pkgs.hello;
|
||||||
|
assertions =
|
||||||
|
assert withHost._module.args.pkgs.stdenv.hostPlatform.system == "aarch64-linux";
|
||||||
|
assert withHost._module.args.pkgs.stdenv.buildPlatform.system == "aarch64-linux";
|
||||||
|
assert withHostAndBuild._module.args.pkgs.stdenv.hostPlatform.system == "aarch64-linux";
|
||||||
|
assert withHostAndBuild._module.args.pkgs.stdenv.buildPlatform.system == "aarch64-darwin";
|
||||||
|
assert builtins.trace (lib.head (getErrors ambiguous))
|
||||||
|
getErrors ambiguous ==
|
||||||
|
[''
|
||||||
|
Your system configures nixpkgs with the platform parameters:
|
||||||
|
nixpkgs.hostPlatform, with values defined in:
|
||||||
|
- repeat.nix
|
||||||
|
- ambiguous.nix
|
||||||
|
nixpkgs.buildPlatform, with values defined in:
|
||||||
|
- ambiguous.nix
|
||||||
|
|
||||||
|
However, it also defines the legacy options:
|
||||||
|
nixpkgs.system, with values defined in:
|
||||||
|
- ambiguous.nix
|
||||||
|
nixpkgs.localSystem, with values defined in:
|
||||||
|
- ambiguous.nix
|
||||||
|
nixpkgs.crossSystem, with values defined in:
|
||||||
|
- ambiguous.nix
|
||||||
|
|
||||||
|
For a future proof system configuration, we recommend to remove
|
||||||
|
the legacy definitions.
|
||||||
|
''];
|
||||||
|
pkgs.emptyFile;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user