glibc: fix locale fallback on non-nixos systems

There is a nixpkgs' glibc patch that makes it look at environment variables to
locate the locale-archive. It has a fallback to /usr/lib/locale/locale-archive,
which is a pretty good one since nearly all non-nixos systems use that exact
path since glibc hard codes it looking at PREFIX/lib/locale/locale-archive. IE
debian/EL/Arch/Gentoo and others all use the same path for locale-archive. That
hard coding in glibc is why nixpkgs even has this patch in the first place.
Other wise you would need to rebuild every single package whenever you wanted to
change the locale-archive at runtime.

The problem with that final fallback is that glibc in nixpkgs includes a minimal
locale-archive with just C.UTF-8. It does this so tests that require UTF-8
support can work in nixpkgs. The current patch will _always_ find the minimal
locale-archive and never actually fall back to the system one.

This can be very confusing, especially when looking at the patch and wondering
why your CI system is throwing locale errors. Eventually you realize that some
test sanitizes the environment, but still confused since it should fall back to
the system's locale-archive.

On systems that do not set LOCALE_ARCHIVE and do not have
/usr/lib/locale/locale-archive then we fall back to that super minimal
locale-archive included with the default nixpkgs' glibc.

Testing:
== Before ==
% env -u LOCALE_ARCHIVE_2_27 -u LOCALE_ARCHIVE LANG=en_US.UTF-8 /nix/store/gdq185xa4cmka46nv67vkmjlmkd9yr1k-cowsay-3.8.3/bin/cowsay hello
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "",
        LC_ALL = (unset),
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
 _______
< hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

== After ==
% env -u LOCALE_ARCHIVE_2_27 -u LOCALE_ARCHIVE LANG=en_US.UTF-8 /nix/store/hhc2gzs6gax4frk8985w2ada2ra35zyw-cowsay-3.8.3/bin/cowsay hello
 _______
< hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

=== On NixOS ===
% env -u LOCALE_ARCHIVE_2_27 -u LOCALE_ARCHIVE LANG=en_US.UTF-8 /nix/store/hhc2gzs6gax4frk8985w2ada2ra35zyw-cowsay-3.8.3/bin/cowsay hello
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LC_CTYPE = (unset),
        LC_NUMERIC = (unset),
        LC_COLLATE = (unset),
        LC_TIME = (unset),
        LC_MESSAGES = (unset),
        LC_MONETARY = (unset),
        LC_ADDRESS = (unset),
        LC_IDENTIFICATION = (unset),
        LC_MEASUREMENT = (unset),
        LC_PAPER = (unset),
        LC_TELEPHONE = (unset),
        LC_NAME = (unset),
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
 _______
< hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

=== Still can get the minimal locale-archive included with glibc ===
% env -u LOCALE_ARCHIVE_2_27 -u LOCALE_ARCHIVE LANG=C.UTF-8 /nix/store/hhc2gzs6gax4frk8985w2ada2ra35zyw-cowsay-3.8.3/bin/cowsay hello
 _______
< hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
This commit is contained in:
George Shammas 2024-10-11 14:05:15 -04:00
parent 9fda0f5ae0
commit de64f49396

View File

@ -17,9 +17,9 @@ index 512769eaec..171dbb4ad9 100644
+ if (path && fd < 0)
+ fd = __open_nocancel (path, O_RDONLY|O_LARGEFILE|O_CLOEXEC);
+ if (fd < 0)
+ fd = __open_nocancel (archfname, O_RDONLY|O_LARGEFILE|O_CLOEXEC);
+ if (fd < 0)
+ fd = __open_nocancel ("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC);
+ if (fd < 0)
+ fd = __open_nocancel (archfname, O_RDONLY|O_LARGEFILE|O_CLOEXEC);
+ return fd;
+}
+
@ -64,9 +64,9 @@ index ca0a95be99..e484783402 100644
+ if (path && fd < 0)
+ fd = open64 (path, O_RDONLY);
+ if (fd < 0)
+ fd = open64 (ARCHIVE_NAME, O_RDONLY);
+ if (fd < 0)
+ fd = open64 ("/usr/lib/locale/locale-archive", O_RDONLY);
+ if (fd < 0)
+ fd = open64 (ARCHIVE_NAME, O_RDONLY);
+ return fd;
+}
+