Subject: bug#29616: closed (Re: [bug#29616] [PATCH core-updates] gnu: guile: Move Readline support to a separate 'guile-readline' package.)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 08 Dec 2017 17:27:02 +0000

Your bug report

#29616: [PATCH core-updates] gnu: guile: Move Readline support to a separate 'guile-readline' package.

which was filed against the guix-patches package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
29616: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=29616
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: [bug#29616] [PATCH core-updates] gnu: guile: Move Readline support to a separate 'guile-readline' package.
From: [email-masked] (Ludovic Courtès)
To: [email-masked]
Date: Fri, 08 Dec 2017 18:26:22 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Ludovic Courtès <[email-masked]> skribis:

> This reduces the closure of Guile from 131 MiB to 116 MiB and removes
> extra readline/ncurses builds from the bootstrap path.
>
> * gnu/packages/guile.scm (guile-2.0)[inputs]: Remove READLINE.
> (make-guile-readline): New procedure.
> (guile-readline): New variable.
> * gnu/system/shadow.scm (default-skeletons): Adjust '.guile' so that it
> gracefully deals with missing (ice-9 readline).

Pushed as 2ba2c98d8aa695cce608313833a36c61b0fb3428 as discussed on IRC.

I’ve also started an evaluation of ‘core-updates’ on Hydra.

Ludo’.

Subject: [PATCH core-updates] gnu: guile: Move Readline support to a separate 'guile-readline' package.
From: Ludovic Courtès <[email-masked]>
To: [email-masked]
Cc: Ludovic Courtès <[email-masked]>
Date: Fri, 8 Dec 2017 17:35:53 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

This reduces the closure of Guile from 131 MiB to 116 MiB and removes
extra readline/ncurses builds from the bootstrap path.

* gnu/packages/guile.scm (guile-2.0)[inputs]: Remove READLINE.
(make-guile-readline): New procedure.
(guile-readline): New variable.
* gnu/system/shadow.scm (default-skeletons): Adjust '.guile' so that it
gracefully deals with missing (ice-9 readline).
---
 gnu/packages/guile.scm | 60 +++++++++++++++++++++++++++++++++++++++++++++++++-
 gnu/system/shadow.scm  | 12 ++++++----
 2 files changed, 67 insertions(+), 5 deletions(-)

diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
index 6e8b95395..352e7bd89 100644
--- a/gnu/packages/guile.scm
+++ b/gnu/packages/guile.scm
@@ -153,7 +153,6 @@ without requiring the source code to be rewritten.")
    (build-system gnu-build-system)
    (native-inputs `(("pkgconfig" ,pkg-config)))
    (inputs `(("libffi" ,libffi)
-             ("readline" ,readline)
              ,@(libiconv-if-needed)
 
              ;; We need Bash when cross-compiling because some of the scripts
@@ -265,6 +264,65 @@ without requiring the source code to be rewritten.")
 (define-public guile-next
   (deprecated-package "guile-next" guile-2.2))
 
+(define (make-guile-readline guile)
+  (package
+    (name "guile-readline")
+    (version (package-version guile))
+    (source (package-source guile))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:configure-flags '("--disable-silent-rules")
+       #:phases (modify-phases %standard-phases
+                  (add-before 'build 'chdir
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (invoke "make" "-C" "libguile" "scmconfig.h")
+                      (invoke "make" "-C" "lib")
+                      (chdir "guile-readline")
+
+                      (substitute* "Makefile"
+                        (("../libguile/libguile-[[:graph:]]+\\.la")
+                         ;; Remove dependency on libguile-X.Y.la.
+                         "")
+                        (("^READLINE_LIBS = (.*)$" _ libs)
+                         ;; Link against the provided libguile.
+                         (string-append "READLINE_LIBS = "
+                                        "-lguile-$(GUILE_EFFECTIVE_VERSION) "
+                                        libs "\n"))
+                        (("\\$\\(top_builddir\\)/meta/build-env")
+                         ;; Use the provided Guile, not the one from
+                         ;; $(builddir).
+                         "")
+
+                        ;; Install modules to the 'site' directories.
+                        (("^moddir = .*$")
+                         "moddir = $(pkgdatadir)/site/$(GUILE_EFFECTIVE_VERSION)\n")
+                        (("^ccachedir = .*$")
+                         "ccachedir = $(pkglibdir)/$(GUILE_EFFECTIVE_VERSION)/site-ccache\n"))
+
+                      ;; Load 'guile-readline.so' from the right place.
+                      (substitute* "ice-9/readline.scm"
+                        (("load-extension \"guile-readline\"")
+                         (format #f "load-extension \
+ (string-append ~s \"/lib/guile/\" (effective-version) \"/extensions/guile-readline\")"
+                                 (assoc-ref outputs "out"))))
+                      #t)))))
+    (home-page (package-home-page guile))
+    (native-inputs (package-native-inputs guile))
+    (inputs
+     `(,@(package-inputs guile)                   ;to placate 'configure'
+       ,@(package-propagated-inputs guile)
+       ("guile" ,guile)
+       ("readline" ,readline)))
+    (synopsis "Line editing support for GNU Guile")
+    (description
+     "This module provides line editing support via the Readline library for
+GNU@tie{}Guile.  Use the @code{(ice-9 readline)} module and call its
+@code{activate-readline} procedure to enable it.")
+    (license license:gpl3+)))
+
+(define-public guile-readline
+  (make-guile-readline guile-2.2))
+
 (define (guile-variant-package-name prefix)
   (lambda (name)
     "Return NAME with PREFIX instead of \"guile-\", when applicable."
diff --git a/gnu/system/shadow.scm b/gnu/system/shadow.scm
index b66239787..938de8dd4 100644
--- a/gnu/system/shadow.scm
+++ b/gnu/system/shadow.scm
@@ -193,10 +193,14 @@ set debug-file-directory ~/.guix-profile/lib/debug\n")))
       (".zlogin" ,zlogin)
       (".Xdefaults" ,xdefaults)
       (".guile" ,(plain-file "dot-guile"
-                             (string-append
-                              "(use-modules (ice-9 readline))\n\n"
-                              ";; Enable completion at the REPL.\n"
-                              "(activate-readline)\n")))
+                             "(cond ((false-if-exception (resolve-interface '(ice-9 readline)))
+       =>
+       (lambda (module)
+         ;; Enable completion and input history at the REPL.
+         ((module-ref module 'activate-readline))))
+      (else
+       (display \"Consider installing the 'guile-readline' package for
+convenient interactive line editing and input history.\\n\\n\")))\n"))
       (".guile-wm" ,guile-wm)
       (".gdbinit" ,gdbinit))))
 
-- 
2.15.0