Hello Pierre,

I just made the following patches to remove the custom site-start.el we
had in our Emacs package, but this seems to break autoloading.

To be continued.

Maxim

>From 518b529fec93b8a767655f54e32aadade19da89f Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <maxim.courno...@gmail.com>
Date: Sat, 3 Jun 2017 12:56:36 -0700
Subject: [PATCH 1/3] gnu: emacs: Locate Elisp libraries via EMACSLOADPATH.

* gnu/packages/emacs.scm (emacs): Add a search path specification for
EMACSLOADPATH.
---
 gnu/packages/emacs.scm | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index 6c6f0e4567..a4ded4dbb9 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -9,7 +9,7 @@
 ;;; Copyright © 2016 David Thompson <dthomps...@worcester.edu>
 ;;; Copyright © 2016 ng0 <n...@n0.is>
 ;;; Copyright © 2017 Marius Bakke <mba...@fastmail.com>
-;;; Copyright © 2017 Maxim Cournoyer <maxim.courno...@gmail.com>
+;;; Copyright © 2017, 2019 Maxim Cournoyer <maxim.courno...@gmail.com>
 ;;; Copyright © 2017 Alex Vong <alexvong1...@gmail.com>
 ;;; Copyright © 2017, 2018 Ricardo Wurmus <rek...@elephly.net>
 ;;; Copyright © 2017 Jan Nieuwenhuizen <jann...@gnu.org>
@@ -185,6 +185,13 @@
 
     (native-search-paths
      (list (search-path-specification
+            (variable "EMACSLOADPATH")
+            ;; The versioned entries are for the Emacs' builtin libraries.
+            (files `(,(string-append "share/emacs/" version "/site-lisp")
+                     ,(string-append "share/emacs/" version "/lisp")
+                     "share/emacs/site-lisp"))
+            (file-pattern ".*"))        ;recursively add any sub directory
+           (search-path-specification
             (variable "INFOPATH")
             (files '("share/info")))))
 
-- 
2.23.0

>From fe39bda4f2b6f8be433f8c89d80a6900e5732182 Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <maxim.courno...@gmail.com>
Date: Sun, 27 Oct 2019 23:26:51 -0400
Subject: [PATCH 2/3] gnu: emacs: Remove custom guix-emacs code.

This used to be necessary to find the Elisp library modules, but is no longer
the case.  The environment variable EMACSLOADPATH/search path specification is
now used for that purpose.

* gnu/packages/aux-files/emacs/guix-emacs.el: Remove file.
* Makefile.am (AUX_FILES): Unregister it.
* gnu/packages/emacs.scm (emacs)[phases]: Remove the 'install-site-start
phase.
[native-inputs]: Remove the "guix-emacs.el" input.
---
 Makefile.am                                |   1 -
 gnu/packages/aux-files/emacs/guix-emacs.el | 115 ---------------------
 gnu/packages/emacs.scm                     |  21 +---
 3 files changed, 2 insertions(+), 135 deletions(-)
 delete mode 100644 gnu/packages/aux-files/emacs/guix-emacs.el

diff --git a/Makefile.am b/Makefile.am
index 36767c2f47..2a4431b2c2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -315,7 +315,6 @@ dist_noinst_DATA =				\
 # Auxiliary files for packages.
 AUX_FILES =						\
   gnu/packages/aux-files/chromium/master-preferences.json		\
-  gnu/packages/aux-files/emacs/guix-emacs.el		\
   gnu/packages/aux-files/linux-libre/5.3-arm.conf	\
   gnu/packages/aux-files/linux-libre/5.3-arm-veyron.conf       \
   gnu/packages/aux-files/linux-libre/5.3-arm64.conf	\
diff --git a/gnu/packages/aux-files/emacs/guix-emacs.el b/gnu/packages/aux-files/emacs/guix-emacs.el
deleted file mode 100644
index 9a49e8861c..0000000000
--- a/gnu/packages/aux-files/emacs/guix-emacs.el
+++ /dev/null
@@ -1,115 +0,0 @@
-;;; guix-emacs.el --- Emacs packages installed with Guix
-
-;; Copyright © 2014, 2015, 2016, 2017 Alex Kost <alez...@gmail.com>
-;; Copyright © 2017 Kyle Meyer <k...@kyleam.com>
-
-;; 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 this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides auxiliary code to autoload Emacs packages
-;; installed with Guix.
-
-;;; Code:
-
-(require 'cl-lib)
-
-(defvar guix-user-profile (expand-file-name "~/.guix-profile"))
-
-(defvar guix-emacs-autoloads nil
-  "List of the last loaded Emacs autoloads.")
-
-(defvar guix-emacs-autoloads-regexp
-  (rx (group (* any) "-autoloads")
-      ".el" (zero-or-one "c") string-end)
-  "Regexp to match Emacs 'autoloads' file.")
-
-(defun guix-emacs-directory (&optional profile)
-  "Return directory with Emacs packages installed in PROFILE.
-If PROFILE is nil, use `guix-user-profile'."
-  (expand-file-name "share/emacs/site-lisp"
-                    (or profile guix-user-profile)))
-
-(defun guix-emacs-find-autoloads (directory)
-  "Return a list of Emacs 'autoloads' files in DIRECTORY.
-The files in the list do not have extensions (.el, .elc)."
-  (cl-remove-duplicates
-   (delq nil
-        (mapcar (lambda (file)
-                  (when (string-match guix-emacs-autoloads-regexp file)
-                    (match-string 1 file)))
-                (directory-files directory 'full-name nil 'no-sort)))
-   :test #'string=))
-
-(defun guix-emacs-subdirs (directory)
-  "Return list of DIRECTORY subdirectories."
-  (cl-remove-if (lambda (file)
-                  (or (string-match-p (rx "/." string-end) file)
-                      (string-match-p (rx "/.." string-end) file)
-                      (not (file-directory-p file))))
-                (directory-files directory 'full-name nil 'no-sort)))
-
-(defun guix-emacs-directories (&optional profile)
-  "Return the list of directories under PROFILE that contain Emacs packages.
-This includes both `share/emacs/site-lisp/guix.d/PACKAGE'
-sub-directories and `share/emacs/site-lisp' itself.
-
-If PROFILE is nil, use `guix-user-profile'.
-Return nil, if Emacs packages are not installed in PROFILE."
-  (let ((root-dir (guix-emacs-directory (or profile guix-user-profile))))
-    (when (file-directory-p root-dir)
-      (let* ((pkgs-dir  (expand-file-name "guix.d" root-dir))
-             (pkgs-dirs (when (file-directory-p pkgs-dir)
-                          (guix-emacs-subdirs pkgs-dir))))
-        (cons root-dir pkgs-dirs)))))
-
-;;;###autoload
-(defun guix-emacs-autoload-packages (&rest profiles)
-  "Autoload Emacs packages installed in PROFILES.
-If PROFILES are not specified, use a default user and system
-profiles.
-
-'Autoload' means add directories with Emacs packages to
-`load-path' and load 'autoloads' files matching
-`guix-emacs-autoloads-regexp'."
-  (interactive (list (if (fboundp 'guix-read-package-profile)
-                         (funcall 'guix-read-package-profile)
-                       guix-user-profile)))
-  (let* ((env      (getenv "GUIX_ENVIRONMENT"))
-         (profiles (or profiles
-                       (append (list "/run/current-system/profile"
-                                     guix-user-profile)
-                               (and env (list env))))))
-    (dolist (profile profiles)
-      (let ((dirs (guix-emacs-directories profile)))
-        (when dirs
-          (let* ((autoloads     (cl-mapcan #'guix-emacs-find-autoloads
-                                           dirs))
-                 (new-autoloads (cl-nset-difference autoloads
-                                                    guix-emacs-autoloads
-                                                    :test #'string=)))
-            (dolist (dir dirs)
-              (cl-pushnew (directory-file-name dir)
-                          load-path
-                          :test #'string=))
-            (dolist (file new-autoloads)
-              (load file 'noerror))
-            (setq guix-emacs-autoloads
-                  (append new-autoloads guix-emacs-autoloads))))))))
-
-(provide 'guix-emacs)
-
-;;; guix-emacs.el ends here
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index a4ded4dbb9..23361d7341 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -127,23 +127,7 @@
              (substitute* (find-files "." "^Makefile\\.in$")
                (("/bin/pwd")
                 "pwd"))
-             #t))
-         (add-after 'install 'install-site-start
-           ;; Use 'guix-emacs' in "site-start.el".  This way, Emacs packages
-           ;; provided by Guix and installed in
-           ;; ~/.guix-profile/share/emacs/site-lisp/guix.d/PACKAGE-VERSION are
-           ;; automatically found.
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let* ((out      (assoc-ref outputs "out"))
-                    (lisp-dir (string-append out "/share/emacs/site-lisp")))
-               (copy-file (assoc-ref inputs "guix-emacs.el")
-                          (string-append lisp-dir "/guix-emacs.el"))
-               (with-output-to-file (string-append lisp-dir "/site-start.el")
-                 (lambda ()
-                   (display
-                    (string-append "(when (require 'guix-emacs nil t)\n"
-                                   "  (guix-emacs-autoload-packages))\n"))))
-               #t))))))
+             #t)))))
     (inputs
      `(("gnutls" ,gnutls)
        ("ncurses" ,ncurses)
@@ -179,8 +163,7 @@
        ("libotf" ,libotf)
        ("m17n-lib" ,m17n-lib)))
     (native-inputs
-     `(("guix-emacs.el" ,(search-auxiliary-file "emacs/guix-emacs.el"))
-       ("pkg-config" ,pkg-config)
+     `(("pkg-config" ,pkg-config)
        ("texinfo" ,texinfo)))
 
     (native-search-paths
-- 
2.23.0

>From 1905a04b4495481991058a75469f2808cbb47bae Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <maxim.courno...@gmail.com>
Date: Mon, 28 Oct 2019 08:09:03 -0400
Subject: [PATCH 3/3] build-system: emacs: Simplify the SET-EMACS-LOAD-PATH
 phase.

It is no longer necessary to search for the Elisp libraries manually, as Emacs
now include a search path specification serving that purpose.

* guix/build/emacs-build-system.scm (set-emacs-load-path): Replace by...
(add-source-to-load-path): ...this.
(%standard-phases): Adjust accordingly.
---
 guix/build/emacs-build-system.scm | 42 ++++++-------------------------
 1 file changed, 8 insertions(+), 34 deletions(-)

diff --git a/guix/build/emacs-build-system.scm b/guix/build/emacs-build-system.scm
index 47a9eda9e6..5cd5e7656c 100644
--- a/guix/build/emacs-build-system.scm
+++ b/guix/build/emacs-build-system.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2015 Federico Beffa <be...@fbengineering.ch>
 ;;; Copyright © 2016 David Thompson <da...@gnu.org>
 ;;; Copyright © 2016 Alex Kost <alez...@gmail.com>
-;;; Copyright © 2018 Maxim Cournoyer <maxim.courno...@gmail.com>
+;;; Copyright © 2018, 2019 Maxim Cournoyer <maxim.courno...@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -74,40 +74,14 @@ archive, a directory, or an Emacs Lisp file."
         #t)
       (gnu:unpack #:source source)))
 
-(define* (set-emacs-load-path #:key source inputs #:allow-other-keys)
-  (define (inputs->directories inputs)
-    "Extract the directory part from INPUTS."
-    (match inputs
-      (((names . directories) ...) directories)))
-
-  (define (input-directory->el-directory input-directory)
-    "Return the correct Emacs Lisp directory in INPUT-DIRECTORY or #f, if there
-is no Emacs Lisp directory."
-    (let ((legacy-elisp-directory (string-append input-directory %legacy-install-suffix))
-          (guix-elisp-directory
-           (string-append
-            input-directory %install-suffix "/"
-            (store-directory->elpa-name-version input-directory))))
-      (cond
-       ((file-exists? guix-elisp-directory) guix-elisp-directory)
-       ((file-exists? legacy-elisp-directory) legacy-elisp-directory)
-       (else #f))))
-
-  (define (input-directories->el-directories input-directories)
-    "Return the list of Emacs Lisp directories in INPUT-DIRECTORIES."
-    (filter-map input-directory->el-directory input-directories))
-
-  "Set the EMACSLOADPATH environment variable so that dependencies are found."
+(define* (add-source-to-load-path #:allow-other-keys)
+  "Augment the EMACSLOADPATH environment variable with the source directory."
   (let* ((source-directory (getcwd))
-         (input-elisp-directories (input-directories->el-directories
-                                   (inputs->directories inputs)))
-         (emacs-load-path-value
-          (string-join
-           (append input-elisp-directories (list source-directory))
-           ":" 'suffix)))
+         (emacs-load-path-value (string-join (getenv "EMACSLOADPATH") ":"
+                                             source-directory)))
     (setenv "EMACSLOADPATH" emacs-load-path-value)
-    (format #t "environment variable `EMACSLOADPATH' set to ~a\n"
-            emacs-load-path-value)))
+    (format #t "source directory ~s appended to the `EMACSLOADPATH' \
+environment variable\n" source-directory)))
 
 (define* (build #:key outputs inputs #:allow-other-keys)
   "Compile .el files."
@@ -269,7 +243,7 @@ second hyphen.  This corresponds to 'name-version' as used in ELPA packages."
 (define %standard-phases
   (modify-phases gnu:%standard-phases
     (replace 'unpack unpack)
-    (add-after 'unpack 'set-emacs-load-path set-emacs-load-path)
+    (add-after 'unpack 'add-source-to-load-path add-source-to-load-path)
     (delete 'bootstrap)
     (delete 'configure)
     ;; Move the build phase after install: the .el files are byte compiled
-- 
2.23.0

Reply via email to