nixos/i18n: fix eval for non-glibc systems (e.g. musl)

`pkgs.glibcLocales` is null for musl systems, so
`options.i18n.glibcLocales` needs to also be nullable.
otherwise, the `.override` and subsequence path interpolations
fail for non-gnu systems.
This commit is contained in:
Colin
2026-04-29 19:26:02 +00:00
parent d3b4456e49
commit cce4239d68
6 changed files with 43 additions and 18 deletions
+24 -13
View File
@@ -31,16 +31,23 @@ in
i18n = {
glibcLocales = lib.mkOption {
type = lib.types.path;
default = pkgs.glibcLocales.override {
allLocales = lib.elem "all" config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
};
type = lib.types.nullOr lib.types.path;
default =
if pkgs.glibcLocales != null then
pkgs.glibcLocales.override {
allLocales = lib.elem "all" config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
}
else
null;
defaultText = lib.literalExpression ''
pkgs.glibcLocales.override {
allLocales = lib.elem "all" config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
}
if pkgs.glibcLocales != null then
pkgs.glibcLocales.override {
allLocales = lib.elem "all" config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
}
else
null
'';
example = lib.literalExpression "pkgs.glibcLocales";
description = ''
@@ -171,7 +178,9 @@ in
environment.systemPackages =
# We increase the priority a little, so that plain glibc in systemPackages can't win.
lib.optional (config.i18n.supportedLocales != [ ]) (lib.setPrio (-1) config.i18n.glibcLocales);
lib.optional (config.i18n.glibcLocales != null && config.i18n.supportedLocales != [ ]) (
lib.setPrio (-1) config.i18n.glibcLocales
);
environment.sessionVariables = {
LANG = config.i18n.defaultLocale;
@@ -179,9 +188,11 @@ in
}
// config.i18n.extraLocaleSettings;
systemd.globalEnvironment = lib.mkIf (config.i18n.supportedLocales != [ ]) {
LOCALE_ARCHIVE = "${config.i18n.glibcLocales}/lib/locale/locale-archive";
};
systemd.globalEnvironment =
lib.mkIf (config.i18n.glibcLocales != null && config.i18n.supportedLocales != [ ])
{
LOCALE_ARCHIVE = "${config.i18n.glibcLocales}/lib/locale/locale-archive";
};
# /etc/locale.conf is used by systemd.
environment.etc."locale.conf".source = pkgs.writeText "locale.conf" ''
+3 -1
View File
@@ -95,7 +95,9 @@ in
include "${pkgs.apparmor-profiles}/etc/apparmor.d/abstractions/base"
${pkgs.stdenv.cc.libc}/share/locale/** r,
${pkgs.stdenv.cc.libc}/share/locale.alias r,
${config.i18n.glibcLocales}/lib/locale/locale-archive r,
${lib.optionalString (
config.i18n.glibcLocales != null
) "${config.i18n.glibcLocales}/lib/locale/locale-archive r,"}
${etcRule "localtime"}
${pkgs.tzdata}/share/zoneinfo/** r,
${pkgs.stdenv.cc.libc}/share/i18n/** r,
@@ -77,6 +77,8 @@ let
BindReadOnlyPaths = [
"/etc"
"/run/systemd"
]
++ lib.optionals (config.i18n.glibcLocales != null) [
"${config.i18n.glibcLocales}"
]
++ mapAttrsToList (name: inbox: inbox.description) cfg.inboxes
+6 -2
View File
@@ -39,8 +39,12 @@ let
# Ensure that clipboard works for non-ASCII characters
sed -i -e '/.*SessionVariables.*/ a\
LANG=${config.i18n.defaultLocale}\
LOCALE_ARCHIVE=${config.i18n.glibcLocales}/lib/locale/locale-archive
LANG=${config.i18n.defaultLocale}${
lib.optionalString (config.i18n.glibcLocales != null) ''
\
LOCALE_ARCHIVE=${config.i18n.glibcLocales}/lib/locale/locale-archive
''
}
' $out/sesman.ini
${cfg.extraConfDirCommands}
@@ -58,7 +58,11 @@
--set DISTRO_ID ${lib.escapeShellArg config.system.nixos.distroId} \
--set INSTALL_BOOTLOADER ${lib.escapeShellArg config.system.build.installBootLoader} \
--set PRE_SWITCH_CHECK ${lib.escapeShellArg config.system.preSwitchChecksScript} \
--set LOCALE_ARCHIVE ${config.i18n.glibcLocales}/lib/locale/locale-archive \
${
lib.optionalString (
config.i18n.glibcLocales != null
) "--set LOCALE_ARCHIVE ${config.i18n.glibcLocales}/lib/locale/locale-archive"
} \
--set SYSTEMD ${config.systemd.package}
)
'';
@@ -351,7 +351,6 @@ in
# Legacy environment variables. These were used by the activation script,
# but some other script might still depend on them, although unlikely.
installBootLoader = config.system.build.installBootLoader;
localeArchive = "${config.i18n.glibcLocales}/lib/locale/locale-archive";
distroId = config.system.nixos.distroId;
perl = pkgs.perl.withPackages (
p: with p; [
@@ -374,6 +373,9 @@ in
# option, as opposed to `system.extraDependencies`.
passedChecks = concatStringsSep " " config.system.checks;
}
// lib.optionalAttrs (config.i18n.glibcLocales != null) {
localeArchive = "${config.i18n.glibcLocales}/lib/locale/locale-archive";
}
// lib.optionalAttrs (config.system.forbiddenDependenciesRegexes != [ ]) {
closureInfo = pkgs.closureInfo {
rootPaths = [