[PATCH 0/2] Getting rid of Guile's locale warning

  • Done
  • quality assurance status badge
Details
2 participants
  • Lars-Dominik Braun
  • Ludovic Courtès
Owner
unassigned
Submitted by
Ludovic Courtès
Severity
normal
L
L
Ludovic Courtès wrote on 1 Oct 2020 10:35
(address . guix-patches@gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201001083507.27246-1-ludo@gnu.org
Hello Guix!

These two patches provide the ultimate hack to get rid of:

guile: warning: failed to install locale

This warning annoys all users, mostly on foreign distro, especially
when it gets printed each time something gets downloaded (‘guix
substitute’ is invoked) and they have no idea how to get rid of it.

It’s also fairly pointless because (guix ui) has its own locale
handling already, and because we already go to great lengths to set
‘GUIX_LOCPATH’ to a sensible value by default.

Let me know what you think!

Ludo’.

Ludovic Courtès (2):
self: Use a 'guile' that doesn't complain about locales.
build: Use a 'guile' executable that doesn't warn about locales.

Makefile.am | 12 +++++++
configure.ac | 3 ++
gnu/packages/aux-files/guile-launcher.c | 46 ++++++++++++++++++++++++
guix/self.scm | 48 ++++++++++++++++++++++++-
4 files changed, 108 insertions(+), 1 deletion(-)
create mode 100644 gnu/packages/aux-files/guile-launcher.c

--
2.28.0
L
L
Ludovic Courtès wrote on 1 Oct 2020 10:38
[PATCH 1/2] self: Use a 'guile' that doesn't complain about locales.
(address . 43737@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201001083848.27390-1-ludo@gnu.org
Since commit ba48895899a117d6ace2209c3f54411a4a989133, selected UTF-8
locales are bundled. However, because 'guix-command' is itself a Guile
script, users would still see Guile's warning, particularly on foreign
distros:

$ LC_ALL=sdf guix foo
guile: warning: failed to install locale
hint: Consider installing the `glibc-utf8-locales' [...]

User commands would print that warning, but more importantly, each
invocation of 'guix substitute' would print it, even though
'guix-daemon.service' explicitly chooses "en_US.utf8", which is in
'glibc-utf8-locales'. This leads to confusion since users would keep
seeing this message unless/until they realize they also need to install
'glibc-utf8-locales' in root's profile.

This patch gets rid of "guile: warning: ..." for a guix-pulled 'guix'
command.

* guix/self.scm (specification->package): Add "gcc-toolchain".
(quiet-guile): New procedure.
(guix-command): Use it.
* gnu/packages/aux-files/guile-launcher.c: New file.
* Makefile.am (AUX_FILES): Add it.
---
Makefile.am | 1 +
gnu/packages/aux-files/guile-launcher.c | 46 ++++++++++++++++++++++++
guix/self.scm | 48 ++++++++++++++++++++++++-
3 files changed, 94 insertions(+), 1 deletion(-)
create mode 100644 gnu/packages/aux-files/guile-launcher.c

Toggle diff (146 lines)
diff --git a/Makefile.am b/Makefile.am
index 8e91e1e558..bc3efd2b6f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -330,6 +330,7 @@ dist_noinst_DATA = \
# Auxiliary files for packages.
AUX_FILES = \
+ gnu/packages/aux-files/guile-launcher.c \
gnu/packages/aux-files/chromium/master-preferences.json \
gnu/packages/aux-files/emacs/guix-emacs.el \
gnu/packages/aux-files/linux-libre/5.8-arm.conf \
diff --git a/gnu/packages/aux-files/guile-launcher.c b/gnu/packages/aux-files/guile-launcher.c
new file mode 100644
index 0000000000..886ede2846
--- /dev/null
+++ b/gnu/packages/aux-files/guile-launcher.c
@@ -0,0 +1,46 @@
+/* GNU Guix --- Functional package management for GNU
+ Copyright 1996-1997,2000-2001,2006,2008,2011,2013,2018
+ Free Software Foundation, Inc.
+ Copyright (C) 2020 Ludovic Courtès <ludo@gnu.org>
+
+ This file is part of GNU Guix.
+
+ GNU Guix is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or (at
+ your option) any later version.
+
+ GNU Guix is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This file implements a variant of the 'guile' executable that does not
+ complain about locale issues. */
+
+#include <locale.h>
+#include <libguile.h>
+
+static void
+inner_main (void *unused, int argc, char **argv)
+{
+ scm_shell (argc, argv);
+}
+
+int
+main (int argc, char **argv)
+{
+ /* Try to install the current locale; remain silent if it fails. */
+ if (setlocale (LC_ALL, "") == NULL)
+ /* The 'guix pull'-provided 'guix' includes at least en_US.utf8 so use
+ that. That gives us UTF-8 support for 'scm_to_locale_string', etc.,
+ which is always preferable over the C locale. */
+ setlocale (LC_ALL, "en_US.utf8");
+
+ scm_install_gmp_memory_functions = 1;
+ scm_boot_guile (argc, argv, inner_main, 0);
+ return 0; /* never reached */
+}
diff --git a/guix/self.scm b/guix/self.scm
index 5eb80f42fe..bbfd2f1b95 100644
--- a/guix/self.scm
+++ b/guix/self.scm
@@ -27,6 +27,7 @@
#:use-module (guix packages)
#:use-module (guix sets)
#:use-module (guix modules)
+ #:use-module ((guix utils) #:select (version-major+minor))
#:use-module ((guix build utils) #:select (find-files))
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-9)
@@ -62,6 +63,7 @@
("xz" (ref '(gnu packages compression) 'xz))
("po4a" (ref '(gnu packages gettext) 'po4a))
("gettext" (ref '(gnu packages gettext) 'gettext-minimal))
+ ("gcc-toolchain" (ref '(gnu packages commencement) 'gcc-toolchain))
(_ #f)))) ;no such package
@@ -580,6 +582,48 @@ that provide Guile modules."
(computed-file name build))
+(define (quiet-guile guile)
+ "Return a wrapper that does the same as the 'guile' executable of GUILE,
+except that it does not complain about locales and falls back to 'en_US.utf8'
+instead of 'C'."
+ (define gcc
+ (specification->package "gcc-toolchain"))
+
+ (define source
+ (search-path %load-path
+ "gnu/packages/aux-files/guile-launcher.c"))
+
+ (define effective
+ (version-major+minor (package-version guile)))
+
+ (define build
+ ;; XXX: Reuse <c-compiler> from (guix scripts pack) instead?
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils)
+ (srfi srfi-26))
+
+ (mkdir-p (string-append #$output "/bin"))
+
+ (setenv "PATH" #$(file-append gcc "/bin"))
+ (setenv "C_INCLUDE_PATH"
+ (string-join
+ (map (cut string-append <> "/include")
+ '#$(match (bag-transitive-build-inputs
+ (package->bag guile))
+ (((labels packages . _) ...)
+ (filter package? packages))))
+ ":"))
+ (setenv "LIBRARY_PATH" #$(file-append gcc "/lib"))
+
+ (invoke "gcc" #$(local-file source) "-Wall" "-g0" "-O2"
+ "-I" #$(file-append guile "/include/guile/" effective)
+ "-L" #$(file-append guile "/lib")
+ #$(string-append "-lguile-" effective)
+ "-o" (string-append #$output "/bin/guile")))))
+
+ (computed-file "guile-wrapper" build))
+
(define* (guix-command modules
#:key source (dependencies '())
guile (guile-version (effective-version)))
@@ -634,7 +678,9 @@ load path."
;; XXX: It would be more convenient to change it to:
;; (exit (apply guix-main (command-line)))
(apply guix-main (command-line))))
- #:guile guile))
+
+ ;; Use a 'guile' variant that doesn't complain about locales.
+ #:guile (quiet-guile guile)))
(define (miscellaneous-files source)
"Return data files taken from SOURCE."
--
2.28.0
L
L
Ludovic Courtès wrote on 1 Oct 2020 10:38
[PATCH 2/2] build: Use a 'guile' executable that doesn't warn about locales.
(address . 43737@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201001083848.27390-2-ludo@gnu.org
This gets rid of:

guile: warning: failed to install locale

when running the 'guix' command on a foreign distro where 'GUIX_LOCPATH'
isn't set.

* Makefile.am (pkglibexec_PROGRAMS, guile_SOURCES, guile_LDADD)
(guile_CFLAGS): New variables.
(install-exec-hook): New target.
(AUX_FILES): Remove 'guile-launcher.c'.
* configure.ac: Use 'GUILE_FLAGS'.
---
Makefile.am | 13 ++++++++++++-
configure.ac | 3 +++
2 files changed, 15 insertions(+), 1 deletion(-)

Toggle diff (47 lines)
diff --git a/Makefile.am b/Makefile.am
index bc3efd2b6f..7aaf15cf8a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -47,6 +47,18 @@ scripts/guix: scripts/guix.in Makefile
$(AM_V_GEN)$(do_subst) < "$(srcdir)/$@.in" > "$@-t"
$(AM_V_at)chmod a+x,a-w "$@-t" && mv -f "$@-t" "$@"
+# This is our variant of the 'guile' executable, one that doesn't complain
+# about locales.
+pkglibexec_PROGRAMS = guile
+guile_SOURCES = gnu/packages/aux-files/guile-launcher.c
+guile_LDADD = $(GUILE_LIBS)
+guile_CFLAGS = $(GUILE_CFLAGS)
+
+# Have the 'guix' command refer to our 'guile'.
+install-exec-hook:
+ $(SED) -i "$(DESTDIR)$(bindir)/guix" \
+ -e 's,^#![[:graph:]]\+,#!$(pkglibexecdir)/guile,g'
+
nodist_noinst_SCRIPTS = \
pre-inst-env \
test-env
@@ -330,7 +342,6 @@ dist_noinst_DATA = \
# Auxiliary files for packages.
AUX_FILES = \
- gnu/packages/aux-files/guile-launcher.c \
gnu/packages/aux-files/chromium/master-preferences.json \
gnu/packages/aux-files/emacs/guix-emacs.el \
gnu/packages/aux-files/linux-libre/5.8-arm.conf \
diff --git a/configure.ac b/configure.ac
index adca374619..6861112eaf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -105,6 +105,9 @@ if test "x$GUILE_EFFECTIVE_VERSION" = "x2.2"; then
PKG_CHECK_MODULES([GUILE], [guile-2.2 >= 2.2.3])
fi
+dnl Get CFLAGS and LDFLAGS for libguile.
+GUILE_FLAGS
+
dnl Installation directories for .scm and .go files.
guilemoduledir="${datarootdir}/guile/site/$GUILE_EFFECTIVE_VERSION"
guileobjectdir="${libdir}/guile/$GUILE_EFFECTIVE_VERSION/site-ccache"
--
2.28.0
L
L
Lars-Dominik Braun wrote on 1 Oct 2020 13:31
Re: [PATCH 0/2] Getting rid of Guile's locale warning
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . guix-patches@gnu.org)
20201001113113.GA14083@zpidnp36
Hi Ludo,

I can confirm this patchset resolves https://issues.guix.gnu.org/issue/43739

(I applied the patches to a local tree, guix pull’ed it and restarted the daemon.)

Cheers,
Lars
-----BEGIN PGP SIGNATURE-----

iQGzBAABCgAdFiEEyk+M9DfXR4/aBV/UQhN3ARo3hEYFAl91vf0ACgkQQhN3ARo3
hEawkQwAzd5hYRe8f/CT3WUARrWnht3pnxVZ69VJ0bTUcZFtD0n0ZlfdyVnMdNb4
8kmH5eHw3m9pFzb6H4jVB2g8YqUIoDLq2Aa5N29yWF6i5SsfUJORXajFmZcgO34F
KmA46JPpUqY9jMeWBafvgaTh5083yCTV3MvrSpnZvIGqvVJiaQKj/sU774OVR6CE
pElfNlwqJZYaWZ88ngmPQqwgCWVF/ek9P7jcxB3pHRYWUdkvZsQbT4mH9IDt0TzH
GfGIGrNCBcgDlA0XHYYwnA1liwatczX3SIBunFa0lPLvN8VUxBYX76ixTtlynLKR
fdQCkHrU0Lzck9idp14G8vn0X8LaJ51joObJtzrtGU8pN65m7kqwKWygrnTlkzIK
vHdz3uFC57R3rV+oBZil0PcsuLAiKEFjgKI6pvr6fNHmZOkXqFKVfgAsWpn5+svj
JNh0+Z/cPfVYhzs0sXOL/EvFUOfSTCOgJO357jP9XyeNWZzf1Pg6V/GNhcEup1WK
HpkAkFvi
=Xp5F
-----END PGP SIGNATURE-----


L
L
Ludovic Courtès wrote on 6 Oct 2020 14:26
Re: [bug#43737] [PATCH 0/2] Getting rid of Guile's locale warning
(address . 43737-done@debbugs.gnu.org)
87k0w3v8va.fsf@gnu.org
Hi!

Ludovic Courtès <ludo@gnu.org> skribis:

Toggle quote (3 lines)
> self: Use a 'guile' that doesn't complain about locales.
> build: Use a 'guile' executable that doesn't warn about locales.

Pushed as 880fe019ae64df37815bbdb1a22305f99dae759d.

Lars-Dominik Braun <ldb@leibniz-psychology.org> skribis:

Toggle quote (2 lines)
> I can confirm this patchset resolves https://issues.guix.gnu.org/issue/43739

Awesome, thanks for testing!

Ludo’.
Closed
?