diff --git a/modules/home-environment.nix b/modules/home-environment.nix
index e5b6cc3a6..85d18f63a 100644
--- a/modules/home-environment.nix
+++ b/modules/home-environment.nix
@@ -229,7 +229,30 @@ in
home.sessionVariables = mkOption {
default = {};
- type = types.attrs;
+ type = types.submodule {
+ freeformType = with types;
+ lazyAttrsOf (oneOf [ package str int float ]);
+
+ options = {
+ PATH = mkOption {
+ type = types.envVar;
+ default = "$PATH";
+ defaultText = literalExample ''"$PATH"'';
+ description = ''
+ Content of the PATH variable.
+ '';
+ };
+
+ NIX_PATH = mkOption {
+ type = types.envVar;
+ default = "$NIX_PATH";
+ defaultText = literalExample ''"$NIX_PATH"'';
+ description = ''
+ Content of the NIX_PATH variable.
+ '';
+ };
+ };
+ };
example = { EDITOR = "emacs"; GS_OPTIONS = "-sPAPERSIZE=a4"; };
description = ''
Environment variables to always set at login.
diff --git a/tests/modules/home-environment/default.nix b/tests/modules/home-environment/default.nix
index e76e248a1..9fcafdcd0 100644
--- a/tests/modules/home-environment/default.nix
+++ b/tests/modules/home-environment/default.nix
@@ -1,4 +1,5 @@
{
- home-session-variables = ./session-variables.nix;
home-session-path = ./session-path.nix;
+ home-session-variables = ./session-variables.nix;
+ home-session-variables-explicit = ./session-variables-explicit.nix;
}
diff --git a/tests/modules/home-environment/session-variables-explicit.nix b/tests/modules/home-environment/session-variables-explicit.nix
new file mode 100644
index 000000000..8ee540716
--- /dev/null
+++ b/tests/modules/home-environment/session-variables-explicit.nix
@@ -0,0 +1,57 @@
+# Test of explicitly defined options inside the `home.sessionVariables` freeform
+# module.
+
+{ config, lib, pkgs, ... }:
+
+let
+
+ inherit (pkgs.stdenv.hostPlatform) isDarwin;
+
+ linuxExpected = ''
+ # Only source this once.
+ if [ -n "$__HM_SESS_VARS_SOURCED" ]; then return; fi
+ export __HM_SESS_VARS_SOURCED=1
+
+ export LOCALE_ARCHIVE_2_27="${pkgs.glibcLocales}/lib/locale/locale-archive"
+ export NIX_PATH="testpath=$HOME/testpath:$NIX_PATH"
+ export PATH="$PATH:$HOME/bin"
+ export XDG_CACHE_HOME="/home/hm-user/.cache"
+ export XDG_CONFIG_HOME="/home/hm-user/.config"
+ export XDG_DATA_HOME="/home/hm-user/.local/share"
+ '';
+
+ darwinExpected = ''
+ # Only source this once.
+ if [ -n "$__HM_SESS_VARS_SOURCED" ]; then return; fi
+ export __HM_SESS_VARS_SOURCED=1
+
+ export NIX_PATH="testpath=$HOME/testpath:$NIX_PATH"
+ export PATH="$PATH:$HOME/bin"
+ export XDG_CACHE_HOME="/home/hm-user/.cache"
+ export XDG_CONFIG_HOME="/home/hm-user/.config"
+ export XDG_DATA_HOME="/home/hm-user/.local/share"
+ '';
+
+ expected = pkgs.writeText "expected"
+ (if isDarwin then darwinExpected else linuxExpected);
+
+in {
+ config = {
+ home.sessionVariables = lib.mkMerge [
+ {
+ PATH = "$PATH";
+ NIX_PATH = "$NIX_PATH";
+ }
+ {
+ PATH = lib.mkAfter "$HOME/bin";
+ NIX_PATH = lib.mkBefore "testpath=$HOME/testpath";
+ }
+ ];
+
+ nmt.script = ''
+ assertFileExists home-path/etc/profile.d/hm-session-vars.sh
+ assertFileContent home-path/etc/profile.d/hm-session-vars.sh \
+ ${expected}
+ '';
+ };
+}
diff --git a/tests/modules/home-environment/session-variables.nix b/tests/modules/home-environment/session-variables.nix
index d939c05eb..bafedf9f2 100644
--- a/tests/modules/home-environment/session-variables.nix
+++ b/tests/modules/home-environment/session-variables.nix
@@ -10,6 +10,8 @@ let
export __HM_SESS_VARS_SOURCED=1
export LOCALE_ARCHIVE_2_27="${pkgs.glibcLocales}/lib/locale/locale-archive"
+ export NIX_PATH="$NIX_PATH"
+ export PATH="$PATH"
export V1="v1"
export V2="v2-v1"
export XDG_CACHE_HOME="/home/hm-user/.cache"
@@ -22,6 +24,8 @@ let
if [ -n "$__HM_SESS_VARS_SOURCED" ]; then return; fi
export __HM_SESS_VARS_SOURCED=1
+ export NIX_PATH="$NIX_PATH"
+ export PATH="$PATH"
export V1="v1"
export V2="v2-v1"
export XDG_CACHE_HOME="/home/hm-user/.cache"