specialization: add module

This module adds basic support for configuration specializations.
These allow the user to build multiple alternative configurations that
should be part of the same generation.
This commit is contained in:
Robert Helgesson 2022-04-18 21:44:20 +02:00
parent af828536ed
commit 0304f0f58b
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
5 changed files with 92 additions and 0 deletions

View file

@ -0,0 +1,71 @@
{ config, extendModules, lib, ... }:
with lib;
{
options.specialization = mkOption {
type = types.attrsOf (types.submodule {
options = {
configuration = mkOption {
type = let
stopRecursion = { specialization = mkOverride 0 { }; };
extended = extendModules { modules = [ stopRecursion ]; };
in extended.type;
default = { };
visible = "shallow";
description = ''
Arbitrary Home Manager configuration settings.
'';
};
};
});
default = { };
description = ''
A set of named specialized configurations. These can be used to extend
your base configuration with additional settings. For example, you can
have specializations named <quote>light</quote> and <quote>dark</quote>
that applies light and dark color theme configurations.
</para><para>
Note, this is an experimental option for now and you therefore have to
activate the specialization by looking up and running the activation
script yourself. Note, running the activation script will create a new
Home Manager generation.
</para><para>
For example, to activate the <quote>dark</quote> specialization. You can
first look up your current Home Manager generation by running
<programlisting language="console">
$ home-manager generations | head -1
2022-05-02 22:49 : id 1758 -> /nix/store/jyac-home-manager-generation
</programlisting>
then run
<programlisting language="console">
$ /nix/store/jyac-home-manager-generation/specialization/dark/activate
Starting Home Manager activation
</programlisting>
</para><para>
WARNING! Since this option is experimental, the activation process may
change in backwards incompatible ways.
'';
};
config = mkIf (config.specialization != { }) {
home.extraBuilderCommands = let
link = n: v:
let pkg = v.configuration.home.activationPackage;
in "ln -s ${pkg} $out/specialization/${n}";
in ''
mkdir $out/specialization
${concatStringsSep "\n" (mapAttrsToList link config.specialization)}
'';
};
}

View file

@ -30,6 +30,7 @@ let
./misc/numlock.nix ./misc/numlock.nix
./misc/pam.nix ./misc/pam.nix
./misc/qt.nix ./misc/qt.nix
./misc/specialization.nix
./misc/submodule-support.nix ./misc/submodule-support.nix
./misc/tmpfiles.nix ./misc/tmpfiles.nix
./misc/version.nix ./misc/version.nix

View file

@ -46,6 +46,7 @@ import nmt {
./modules/home-environment ./modules/home-environment
./modules/misc/fontconfig ./modules/misc/fontconfig
./modules/misc/nix ./modules/misc/nix
./modules/misc/specialization
./modules/programs/alacritty ./modules/programs/alacritty
./modules/programs/alot ./modules/programs/alot
./modules/programs/aria2 ./modules/programs/aria2

View file

@ -0,0 +1 @@
{ specialization = ./specialization.nix; }

View file

@ -0,0 +1,18 @@
{ config, lib, pkgs, ... }:
with lib;
{
home.file.testfile.text = "not special";
specialization.test.configuration = {
home.file.testfile.text = "very special";
};
nmt.script = ''
assertFileExists home-files/testfile
assertFileContains home-files/testfile "not special"
assertFileExists specialization/test/home-files/testfile
assertFileContains specialization/test/home-files/testfile "not special"
'';
}