diff options
author | Robert Helgesson <robert@rycee.net> | 2017-10-14 20:56:02 +0200 |
---|---|---|
committer | Robert Helgesson <robert@rycee.net> | 2018-02-07 20:50:01 +0100 |
commit | 1bc59f729047886b845ffd9162d40593fad5c7f0 (patch) | |
tree | d2c09ded840697e7b885ddaaeaadbc6f7e9ec9ae /nixos | |
parent | 563a20fc82124abebd75a1fbaa6b6ead835d2553 (diff) |
allow Home Manager to be used as a NixOS module
This is a NixOS module that is intended to be imported into a NixOS
system configuration. It allows the system users to be set up directly
from the system configuration.
The actual profile switch is performed by a oneshot systemd unit per
configured user that acts much like the regular `home-manager switch`
command.
With this implementation, the NixOS module does not work properly with
the `nixos-rebuild build-vm` command. This can be solved by using the
`users.users.<name?>.packages` option to install packages but this
does not work flawlessly with certain Nixpkgs packages. In particular,
for programs using the Qt libraries.
Diffstat (limited to 'nixos')
-rw-r--r-- | nixos/default.nix | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/nixos/default.nix b/nixos/default.nix new file mode 100644 index 00000000000..d72d8a19557 --- /dev/null +++ b/nixos/default.nix @@ -0,0 +1,57 @@ +{ config, lib, pkgs, utils, ... }: + +with lib; + +let + + cfg = config.home-manager; + + hmModule = types.submodule ({name, ...}: { + imports = import ../modules/modules.nix { + inherit lib pkgs; + nixosSubmodule = true; + }; + + config = { + home.username = config.users.users.${name}.name; + home.homeDirectory = config.users.users.${name}.home; + }; + }); + +in + +{ + options = { + home-manager.users = mkOption { + type = types.attrsOf hmModule; + default = {}; + description = '' + Per-user Home Manager configuration. + ''; + }; + }; + + config = mkIf (cfg.users != {}) { + systemd.services = mapAttrs' (username: usercfg: + nameValuePair ("home-manager-${utils.escapeSystemdPath username}") { + description = "Home Manager environment for ${username}"; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + User = username; + Type = "oneshot"; + RemainAfterExit = "yes"; + SyslogIdentifier = "hm-activate-${username}"; + + # The activation script is run by a login shell to make sure + # that the user is given a sane Nix environment. + ExecStart = pkgs.writeScript "activate-${username}" '' + #! ${pkgs.stdenv.shell} -el + echo Activating home-manager configuration for ${username} + exec ${usercfg.home.activationPackage}/activate + ''; + }; + } + ) cfg.users; + }; +} |