{ config, lib, pkgs, ... }: with lib; with import ./lib/dag.nix { inherit lib; }; let cfg = config.systemd.user; enabled = cfg.services != {} || cfg.sockets != {} || cfg.targets != {} || cfg.timers != {}; toSystemdIni = generators.toINI { mkKeyValue = key: value: let value' = if isBool value then (if value then "true" else "false") else toString value; in "${key}=${value'}"; }; buildService = style: name: serviceCfg: let source = pkgs.writeText "${name}.${style}" (toSystemdIni serviceCfg); wantedBy = target: { name = "systemd/user/${target}.wants/${name}.${style}"; value = { inherit source; }; }; in singleton { name = "systemd/user/${name}.${style}"; value = { inherit source; }; } ++ map wantedBy (serviceCfg.Install.WantedBy or []); buildServices = style: serviceCfgs: concatLists (mapAttrsToList (buildService style) serviceCfgs); in { meta.maintainers = [ maintainers.rycee ]; options = { systemd.user = { systemctlPath = mkOption { default = "${pkgs.systemd}/bin/systemctl"; defaultText = "\${pkgs.systemd}/bin/systemctl"; type = types.str; description = '' Absolute path to the systemctl tool. This option may need to be set if running Home Manager on a non-NixOS distribution. ''; }; services = mkOption { default = {}; type = types.attrs; description = "Definition of systemd per-user service units."; }; sockets = mkOption { default = {}; type = types.attrs; description = "Definition of systemd per-user sockets"; }; targets = mkOption { default = {}; type = types.attrs; description = "Definition of systemd per-user targets"; }; timers = mkOption { default = {}; type = types.attrs; description = "Definition of systemd per-user timers"; }; }; }; config = mkMerge [ { assertions = [ { assertion = enabled -> pkgs.stdenv.isLinux; message = let names = concatStringsSep ", " ( attrNames ( cfg.services // cfg.sockets // cfg.targets // cfg.timers ) ); in "Must use Linux for modules that require systemd: " + names; } ]; } # If we run under a Linux system we assume that systemd is # available, in particular we assume that systemctl is in PATH. (mkIf pkgs.stdenv.isLinux { xdg.configFile = listToAttrs ( (buildServices "service" cfg.services) ++ (buildServices "socket" cfg.sockets) ++ (buildServices "target" cfg.targets) ++ (buildServices "timer" cfg.timers) ); home.activation.reloadSystemD = dagEntryAfter ["linkGeneration"] (import ./systemd-activate.nix cfg.systemctlPath); }) ]; }