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