Merge pull request #199595 from hercules-ci/nixos-toplevel-maintenance

nixos/top-level: maintenance

Changed files
+115 -79
nixos
modules
system
activation
boot
loader
grub
+1
nixos/modules/module-list.nix
···
./services/x11/xfs.nix
./services/x11/xserver.nix
./system/activation/activation-script.nix
+
./system/activation/specialisation.nix
./system/activation/top-level.nix
./system/boot/binfmt.nix
./system/boot/emergency-mode.nix
+85
nixos/modules/system/activation/specialisation.nix
···
+
{ config, lib, pkgs, extendModules, noUserModules, ... }:
+
+
let
+
inherit (lib)
+
concatStringsSep
+
mapAttrs
+
mapAttrsToList
+
mkOption
+
types
+
;
+
+
# This attribute is responsible for creating boot entries for
+
# child configuration. They are only (directly) accessible
+
# when the parent configuration is boot default. For example,
+
# you can provide an easy way to boot the same configuration
+
# as you use, but with another kernel
+
# !!! fix this
+
children =
+
mapAttrs
+
(childName: childConfig: childConfig.configuration.system.build.toplevel)
+
config.specialisation;
+
+
in
+
{
+
options = {
+
+
specialisation = mkOption {
+
default = { };
+
example = lib.literalExpression "{ fewJobsManyCores.configuration = { nix.settings = { core = 0; max-jobs = 1; }; }; }";
+
description = lib.mdDoc ''
+
Additional configurations to build. If
+
`inheritParentConfig` is true, the system
+
will be based on the overall system configuration.
+
+
To switch to a specialised configuration
+
(e.g. `fewJobsManyCores`) at runtime, run:
+
+
```
+
sudo /run/current-system/specialisation/fewJobsManyCores/bin/switch-to-configuration test
+
```
+
'';
+
type = types.attrsOf (types.submodule (
+
local@{ ... }:
+
let
+
extend =
+
if local.config.inheritParentConfig
+
then extendModules
+
else noUserModules.extendModules;
+
in
+
{
+
options.inheritParentConfig = mkOption {
+
type = types.bool;
+
default = true;
+
description = lib.mdDoc "Include the entire system's configuration. Set to false to make a completely differently configured system.";
+
};
+
+
options.configuration = mkOption {
+
default = { };
+
description = lib.mdDoc ''
+
Arbitrary NixOS configuration.
+
+
Anything you can add to a normal NixOS configuration, you can add
+
here, including imports and config values, although nested
+
specialisations will be ignored.
+
'';
+
visible = "shallow";
+
inherit (extend { modules = [ ./no-clone.nix ]; }) type;
+
};
+
}
+
));
+
};
+
+
};
+
+
config = {
+
system.systemBuilderCommands = ''
+
mkdir $out/specialisation
+
${concatStringsSep "\n"
+
(mapAttrsToList (name: path: "ln -s ${path} $out/specialisation/${name}") children)}
+
'';
+
};
+
+
# uses extendModules to generate a type
+
meta.buildDocsInSandbox = false;
+
}
+24 -79
nixos/modules/system/activation/top-level.nix
···
-
{ config, lib, pkgs, extendModules, noUserModules, ... }:
+
{ config, lib, pkgs, ... }:
with lib;
let
-
-
-
# This attribute is responsible for creating boot entries for
-
# child configuration. They are only (directly) accessible
-
# when the parent configuration is boot default. For example,
-
# you can provide an easy way to boot the same configuration
-
# as you use, but with another kernel
-
# !!! fix this
-
children =
-
mapAttrs
-
(childName: childConfig: childConfig.configuration.system.build.toplevel)
-
config.specialisation;
-
systemBuilder =
let
kernelPath = "${config.boot.kernelPackages.kernel}/" +
···
ln -s ${config.system.path} $out/sw
ln -s "$systemd" $out/systemd
-
echo -n "$configurationName" > $out/configuration-name
echo -n "systemd ${toString config.systemd.package.interfaceVersion}" > $out/init-interface-version
echo -n "$nixosLabel" > $out/nixos-version
echo -n "${config.boot.kernelPackages.stdenv.hostPlatform.system}" > $out/system
-
-
mkdir $out/specialisation
-
${concatStringsSep "\n"
-
(mapAttrsToList (name: path: "ln -s ${path} $out/specialisation/${name}") children)}
mkdir $out/bin
export localeArchive="${config.i18n.glibcLocales}/lib/locale/locale-archive"
···
fi
''}
+
${config.system.systemBuilderCommands}
+
echo -n "${toString config.system.extraDependencies}" > $out/extra-dependencies
${config.system.extraSystemBuilderCmds}
···
# kernel, systemd units, init scripts, etc.) as well as a script
# `switch-to-configuration' that activates the configuration and
# makes it bootable.
-
baseSystem = pkgs.stdenvNoCC.mkDerivation {
+
baseSystem = pkgs.stdenvNoCC.mkDerivation ({
name = "nixos-system-${config.system.name}-${config.system.nixos.label}";
preferLocalBuild = true;
allowSubstitutes = false;
···
activationScript = config.system.activationScripts.script;
dryActivationScript = config.system.dryActivationScript;
nixosLabel = config.system.nixos.label;
-
-
configurationName = config.boot.loader.grub.configurationName;
# Needed by switch-to-configuration.
perl = pkgs.perl.withPackages (p: with p; [ ConfigIniFiles FileSlurp ]);
-
};
+
} // config.system.systemBuilderArgs);
# Handle assertions and warnings
···
pkgs.replaceDependency { inherit oldDependency newDependency drv; }
) baseSystemAssertWarn config.system.replaceRuntimeDependencies;
-
/* Workaround until https://github.com/NixOS/nixpkgs/pull/156533
-
Call can be replaced by argument when that's merged.
-
*/
-
tmpFixupSubmoduleBoundary = subopts:
-
lib.mkOption {
-
type = lib.types.submoduleWith {
-
modules = [ { options = subopts; } ];
-
};
-
};
-
in
{
···
options = {
-
specialisation = mkOption {
-
default = {};
-
example = lib.literalExpression "{ fewJobsManyCores.configuration = { nix.settings = { core = 0; max-jobs = 1; }; }; }";
-
description = lib.mdDoc ''
-
Additional configurations to build. If
-
`inheritParentConfig` is true, the system
-
will be based on the overall system configuration.
-
-
To switch to a specialised configuration
-
(e.g. `fewJobsManyCores`) at runtime, run:
-
-
```
-
sudo /run/current-system/specialisation/fewJobsManyCores/bin/switch-to-configuration test
-
```
-
'';
-
type = types.attrsOf (types.submodule (
-
local@{ ... }: let
-
extend = if local.config.inheritParentConfig
-
then extendModules
-
else noUserModules.extendModules;
-
in {
-
options.inheritParentConfig = mkOption {
-
type = types.bool;
-
default = true;
-
description = lib.mdDoc "Include the entire system's configuration. Set to false to make a completely differently configured system.";
-
};
-
-
options.configuration = mkOption {
-
default = {};
-
description = lib.mdDoc ''
-
Arbitrary NixOS configuration.
-
-
Anything you can add to a normal NixOS configuration, you can add
-
here, including imports and config values, although nested
-
specialisations will be ignored.
-
'';
-
visible = "shallow";
-
inherit (extend { modules = [ ./no-clone.nix ]; }) type;
-
};
-
})
-
);
-
};
-
system.boot.loader.id = mkOption {
internal = true;
default = "";
···
'';
};
-
system.build = tmpFixupSubmoduleBoundary {
+
system.build = {
installBootLoader = mkOption {
internal = true;
# "; true" => make the `$out` argument from switch-to-configuration.pl
···
'';
};
+
system.systemBuilderCommands = mkOption {
+
type = types.lines;
+
internal = true;
+
default = "";
+
description = ''
+
This code will be added to the builder creating the system store path.
+
'';
+
};
+
+
system.systemBuilderArgs = mkOption {
+
type = types.attrsOf types.unspecified;
+
internal = true;
+
default = {};
+
description = lib.mdDoc ''
+
`lib.mkDerivation` attributes that will be passed to the top level system builder.
+
'';
+
};
+
system.extraSystemBuilderCmds = mkOption {
type = types.lines;
internal = true;
···
};
-
# uses extendModules to generate a type
-
meta.buildDocsInSandbox = false;
}
+5
nixos/modules/system/boot/loader/grub/grub.nix
···
boot.loader.supportsInitrdSecrets = true;
+
system.systemBuilderArgs.configurationName = cfg.configurationName;
+
system.systemBuilderCommands = ''
+
echo -n "$configurationName" > $out/configuration-name
+
'';
+
system.build.installBootLoader =
let
install-grub-pl = pkgs.substituteAll {