nixos/specialisation.nix: Extract module
This commit is contained in:
parent
d3ac0938a7
commit
0b05ed2c78
|
@ -1220,6 +1220,7 @@
|
||||||
./services/x11/xfs.nix
|
./services/x11/xfs.nix
|
||||||
./services/x11/xserver.nix
|
./services/x11/xserver.nix
|
||||||
./system/activation/activation-script.nix
|
./system/activation/activation-script.nix
|
||||||
|
./system/activation/specialisation.nix
|
||||||
./system/activation/top-level.nix
|
./system/activation/top-level.nix
|
||||||
./system/boot/binfmt.nix
|
./system/boot/binfmt.nix
|
||||||
./system/boot/emergency-mode.nix
|
./system/boot/emergency-mode.nix
|
||||||
|
|
85
nixos/modules/system/activation/specialisation.nix
Normal file
85
nixos/modules/system/activation/specialisation.nix
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
{ 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;
|
||||||
|
}
|
|
@ -1,21 +1,8 @@
|
||||||
{ config, lib, pkgs, extendModules, noUserModules, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
let
|
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 =
|
systemBuilder =
|
||||||
let
|
let
|
||||||
kernelPath = "${config.boot.kernelPackages.kernel}/" +
|
kernelPath = "${config.boot.kernelPackages.kernel}/" +
|
||||||
|
@ -77,10 +64,6 @@ let
|
||||||
echo -n "$nixosLabel" > $out/nixos-version
|
echo -n "$nixosLabel" > $out/nixos-version
|
||||||
echo -n "${config.boot.kernelPackages.stdenv.hostPlatform.system}" > $out/system
|
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
|
mkdir $out/bin
|
||||||
export localeArchive="${config.i18n.glibcLocales}/lib/locale/locale-archive"
|
export localeArchive="${config.i18n.glibcLocales}/lib/locale/locale-archive"
|
||||||
substituteAll ${./switch-to-configuration.pl} $out/bin/switch-to-configuration
|
substituteAll ${./switch-to-configuration.pl} $out/bin/switch-to-configuration
|
||||||
|
@ -163,49 +146,6 @@ in
|
||||||
|
|
||||||
options = {
|
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 {
|
system.boot.loader.id = mkOption {
|
||||||
internal = true;
|
internal = true;
|
||||||
default = "";
|
default = "";
|
||||||
|
@ -377,6 +317,4 @@ in
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# uses extendModules to generate a type
|
|
||||||
meta.buildDocsInSandbox = false;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue