From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:470:142:3::10]:47880) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQOVg-00019H-RW for guix-patches@gnu.org; Fri, 01 Nov 2019 00:26:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQOVe-0006ER-Jg for guix-patches@gnu.org; Fri, 01 Nov 2019 00:26:04 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:46093) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iQOVe-0006EI-FW for guix-patches@gnu.org; Fri, 01 Nov 2019 00:26:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1iQOVe-0007je-AH for guix-patches@gnu.org; Fri, 01 Nov 2019 00:26:02 -0400 Subject: [bug#38015] Emacs in multiple profiles Resent-Message-ID: Received: from eggs.gnu.org ([2001:470:142:3::10]:47710) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQOUr-0000jS-Ml for guix-patches@gnu.org; Fri, 01 Nov 2019 00:25:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQOUp-0003I8-GD for guix-patches@gnu.org; Fri, 01 Nov 2019 00:25:13 -0400 From: Maxim Cournoyer References: <9c395fd0-9458-7894-af8b-9294d212c60b@fastmail.net> <878tajzu03.fsf@gmail.com> <87a7uyd7qy.fsf@gmail.com> <874ll51mq3.fsf@gmail.com> <87zi2t4jgh.fsf@gmail.com> <877ep4z44b.fsf@gmail.com> <87tv88ihzc.fsf@ambrevar.xyz> <878spgo7ex.fsf@gmail.com> <87o8yccwtq.fsf@ambrevar.xyz> <871rv1ed8v.fsf@gmail.com> <87mudpm5nt.fsf@ambrevar.xyz> <874kzscpgs.fsf@gmail.com> <87eeyvespq.fsf@ambrevar.xyz> <87zhhhbhzl.fsf@gmail.com> <877e4l5c9h.fsf@ambrevar.xyz> Date: Fri, 01 Nov 2019 00:25:02 -0400 In-Reply-To: <877e4l5c9h.fsf@ambrevar.xyz> (Pierre Neidhardt's message of "Thu, 31 Oct 2019 13:29:30 +0100") Message-ID: <87mudgb4v5.fsf@gmail.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 38015@debbugs.gnu.org, mail@ambrevar.xyz Cc: Alex Kost , myglc2@gmail.com, help-guix@gnu.org --=-=-= Content-Type: text/plain [+ guix-patches] Hello! Pierre Neidhardt writes: > I've reviewed and tested the patch: > > - review: 5/5 stars :D > - test: pass! > > I've tested the following: > > $ /home/ambrevar/projects/guix/pre-inst-env guix package -i emacs-2048-game emacs -p ~/temp/foo > $ cd ~/temp > $ env -i $(which bash) --login --noprofile --norc > bash-5.0$ /run/current-system/profile/bin/env DISPLAY=:1 emacs > > > Content of *Messages*: > > Loading /gnu/store/ghdkfqnvrxipp4ikakags5rl7flywb72-profile/share/emacs/site-lisp/guix.d/2048-game-20151026.1233/2048-game-autoloads.el (source)...done > For information about GNU Emacs and the GNU system, type C-h C-a. > > > And > > M-x 2048-game RET > > works! I'm glad it works and fixes your use case :-). > Can we merge this on master? We have some 700 emacs packages that are > going to be rebuilt, but it's rather light for the build farm. What do > you think? I'm not worried about the 700 Emacs packages that will need to be rebuild, but I'd prefer to take a bit of time to let people comment on this non-trivial change. The new behavior (of not always loading stuff from the user profile and system profiles) is different and may break the flow of some people. For one, I think restarting my Emacs server (started at login) won't be enough to discover newly installed packages to my profile. Emacs-Magit may also be impacted, I haven't reviewed if it uses that autoload function from site-start.el. Refreshing an environment variable value for a process (such as Emacs) is not as convenient as re-scanning a directory. I'll let some time pass (2 weeks), and if nobody objects, I'll merge it to master. Thanks for the review! Maxim --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-gnu-emacs-Locate-Elisp-libraries-via-EMACSLOADPATH.patch Content-Transfer-Encoding: quoted-printable >From d5dc7fd8a2406939346b44457859764a98afece0 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer 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..16f9af0a0a 100644 --- a/gnu/packages/emacs.scm +++ b/gnu/packages/emacs.scm @@ -9,7 +9,7 @@ ;;; Copyright =C2=A9 2016 David Thompson ;;; Copyright =C2=A9 2016 ng0 ;;; Copyright =C2=A9 2017 Marius Bakke -;;; Copyright =C2=A9 2017 Maxim Cournoyer +;;; Copyright =C2=A9 2017, 2019 Maxim Cournoyer ;;; Copyright =C2=A9 2017 Alex Vong ;;; Copyright =C2=A9 2017, 2018 Ricardo Wurmus ;;; Copyright =C2=A9 2017 Jan Nieuwenhuizen @@ -185,6 +185,13 @@ =20 (native-search-paths (list (search-path-specification + (variable "EMACSLOADPATH") + ;; The versioned entries are for the Emacs' builtin libraries. + (files (list (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"))))) =20 --=20 2.23.0 --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0002-build-system-emacs-Simplify-the-SET-EMACS-LOAD-PATH-.patch Content-Transfer-Encoding: quoted-printable >From 9c4897347bee7f3b6afb97a6c766d57f0bee1b9d Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Mon, 28 Oct 2019 08:09:03 -0400 Subject: [PATCH 2/3] build-system: emacs: Simplify the SET-EMACS-LOAD-PATH phase. It is no longer necessary to search for the Elisp libraries manually, as Em= acs 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-sys= tem.scm index 47a9eda9e6..f0c41812f1 100644 --- a/guix/build/emacs-build-system.scm +++ b/guix/build/emacs-build-system.scm @@ -2,7 +2,7 @@ ;;; Copyright =C2=A9 2015 Federico Beffa ;;; Copyright =C2=A9 2016 David Thompson ;;; Copyright =C2=A9 2016 Alex Kost -;;; Copyright =C2=A9 2018 Maxim Cournoyer +;;; Copyright =C2=A9 2018, 2019 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -74,40 +74,14 @@ archive, a directory, or an Emacs Lisp file." #t) (gnu:unpack #:source source))) =20 -(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-i= nstall-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 fou= nd." +(define* (add-source-to-load-path #:key dummy #:allow-other-keys) + "Augment the EMACSLOADPATH environment variable with the source director= y." (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-append (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))) =20 (define* (build #:key outputs inputs #:allow-other-keys) "Compile .el files." @@ -269,7 +243,7 @@ second hyphen. This corresponds to 'name-version' as u= sed 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 --=20 2.23.0 --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0003-gnu-emacs-Adapt-the-autoloads-auxiliary-code-to-use-.patch Content-Transfer-Encoding: quoted-printable >From 39b31bb30b8ecab67bd6de315b5aa1bb59a3ee20 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Tue, 29 Oct 2019 22:07:55 -0400 Subject: [PATCH 3/3] gnu: emacs: Adapt the autoloads auxiliary code to use EMACSLOADPATH. The Elisp directories to scan for autoloads are now taken from EMACSLOADPATH instead of from the user profile, environment profile or system profile. Manually adding the Elisp directories to the `load-path' is no longer necessary, as this is covered by Emacs when they are in EMACSLOADPATH. The caching logic is also removed, as this code is not typically run often and = the gain is marginal (loading autoloads files is cheap). * gnu/packages/aux-files/emacs/guix-emacs.el (guix-emacs-directory) (guix-emacs-subdirs, guix-emacs-directories): Remove procedures. (guix-emacs-find-autoloads): Filter the directory entries by passing the regexp to `directory-files' directly, which is ten times faster. Remove deduplication. (guix-emacs-autoloads-regexp): Remove the group, which used to filter out t= he file extension; it no longer works this way due to passing the regexp to the `directory-files' procedure directly, which doesn't care about groups. (guix-emacs-autoload-packages): Update doc. Search package directories from EMACSLOADPATH. Do not populate the load-path. Remove cache. --- gnu/packages/aux-files/emacs/guix-emacs.el | 98 ++++++---------------- 1 file changed, 24 insertions(+), 74 deletions(-) diff --git a/gnu/packages/aux-files/emacs/guix-emacs.el b/gnu/packages/aux-= files/emacs/guix-emacs.el index 9a49e8861c..46ee557f20 100644 --- a/gnu/packages/aux-files/emacs/guix-emacs.el +++ b/gnu/packages/aux-files/emacs/guix-emacs.el @@ -2,6 +2,7 @@ =20 ;; Copyright =C2=A9 2014, 2015, 2016, 2017 Alex Kost ;; Copyright =C2=A9 2017 Kyle Meyer +;; Copyright =C2=A9 2019 Maxim Cournoyer =20 ;; This file is part of GNU Guix. =20 @@ -24,91 +25,40 @@ ;; installed with Guix. =20 ;;; 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.") +(require 'seq) =20 (defvar guix-emacs-autoloads-regexp - (rx (group (* any) "-autoloads") - ".el" (zero-or-one "c") string-end) + (rx (* any) "-autoloads.el" (zero-or-one "c") string-end) "Regexp to match Emacs 'autoloads' file.") =20 -(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=3D)) - -(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 package= s. -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))))) + ;; `directory-files' doesn't honor group in regexp. + (mapcar #'file-name-sans-extension + (directory-files directory 'full-name guix-emacs-autoloads-regex= p))) =20 ;;;###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. +(defun guix-emacs-autoload-packages () + "Autoload Emacs packages found in EMACSLOADPATH. =20 -'Autoload' means add directories with Emacs packages to -`load-path' and load 'autoloads' files matching +'Autoload' means to load the '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=3D))) - (dolist (dir dirs) - (cl-pushnew (directory-file-name dir) - load-path - :test #'string=3D)) - (dolist (file new-autoloads) - (load file 'noerror)) - (setq guix-emacs-autoloads - (append new-autoloads guix-emacs-autoloads)))))))) + ;; FIXME: The autoloads generated by the emacs-build-system are not byte + ;; compiled. + (interactive) + (let* ((emacs-load-path (getenv "EMACSLOADPATH")) + (emacs-non-core-load-path-directories + ;; Filter out core Elisp directories, which are already autoload= ed + ;; by Emacs. + (seq-filter (lambda (dir) + (string-match-p "/share/emacs/site-lisp" dir)) + (split-string emacs-load-path ":"))) + (autoloads (mapcan #'guix-emacs-find-autoloads + emacs-non-core-load-path-directories))) + (mapc (lambda (f) + (load f 'noerror)) + autoloads))) =20 (provide 'guix-emacs) =20 --=20 2.23.0 --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxim Cournoyer Subject: Re: Emacs in multiple profiles Date: Fri, 01 Nov 2019 00:25:02 -0400 Message-ID: <87mudgb4v5.fsf@gmail.com> References: <9c395fd0-9458-7894-af8b-9294d212c60b@fastmail.net> <878tajzu03.fsf@gmail.com> <87a7uyd7qy.fsf@gmail.com> <874ll51mq3.fsf@gmail.com> <87zi2t4jgh.fsf@gmail.com> <877ep4z44b.fsf@gmail.com> <87tv88ihzc.fsf@ambrevar.xyz> <878spgo7ex.fsf@gmail.com> <87o8yccwtq.fsf@ambrevar.xyz> <871rv1ed8v.fsf@gmail.com> <87mudpm5nt.fsf@ambrevar.xyz> <874kzscpgs.fsf@gmail.com> <87eeyvespq.fsf@ambrevar.xyz> <87zhhhbhzl.fsf@gmail.com> <877e4l5c9h.fsf@ambrevar.xyz> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:47683) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQOUm-0000hq-Jn for help-guix@gnu.org; Fri, 01 Nov 2019 00:25:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQOUk-0002gI-9f for help-guix@gnu.org; Fri, 01 Nov 2019 00:25:08 -0400 In-Reply-To: <877e4l5c9h.fsf@ambrevar.xyz> (Pierre Neidhardt's message of "Thu, 31 Oct 2019 13:29:30 +0100") List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-guix-bounces+gcggh-help-guix=m.gmane.org@gnu.org Sender: "Help-Guix" To: guix-patches , Pierre Neidhardt Cc: Alex Kost , myglc2@gmail.com, help-guix@gnu.org --=-=-= Content-Type: text/plain [+ guix-patches] Hello! Pierre Neidhardt writes: > I've reviewed and tested the patch: > > - review: 5/5 stars :D > - test: pass! > > I've tested the following: > > $ /home/ambrevar/projects/guix/pre-inst-env guix package -i emacs-2048-game emacs -p ~/temp/foo > $ cd ~/temp > $ env -i $(which bash) --login --noprofile --norc > bash-5.0$ /run/current-system/profile/bin/env DISPLAY=:1 emacs > > > Content of *Messages*: > > Loading /gnu/store/ghdkfqnvrxipp4ikakags5rl7flywb72-profile/share/emacs/site-lisp/guix.d/2048-game-20151026.1233/2048-game-autoloads.el (source)...done > For information about GNU Emacs and the GNU system, type C-h C-a. > > > And > > M-x 2048-game RET > > works! I'm glad it works and fixes your use case :-). > Can we merge this on master? We have some 700 emacs packages that are > going to be rebuilt, but it's rather light for the build farm. What do > you think? I'm not worried about the 700 Emacs packages that will need to be rebuild, but I'd prefer to take a bit of time to let people comment on this non-trivial change. The new behavior (of not always loading stuff from the user profile and system profiles) is different and may break the flow of some people. For one, I think restarting my Emacs server (started at login) won't be enough to discover newly installed packages to my profile. Emacs-Magit may also be impacted, I haven't reviewed if it uses that autoload function from site-start.el. Refreshing an environment variable value for a process (such as Emacs) is not as convenient as re-scanning a directory. I'll let some time pass (2 weeks), and if nobody objects, I'll merge it to master. Thanks for the review! Maxim --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-gnu-emacs-Locate-Elisp-libraries-via-EMACSLOADPATH.patch Content-Transfer-Encoding: quoted-printable >From d5dc7fd8a2406939346b44457859764a98afece0 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer 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..16f9af0a0a 100644 --- a/gnu/packages/emacs.scm +++ b/gnu/packages/emacs.scm @@ -9,7 +9,7 @@ ;;; Copyright =C2=A9 2016 David Thompson ;;; Copyright =C2=A9 2016 ng0 ;;; Copyright =C2=A9 2017 Marius Bakke -;;; Copyright =C2=A9 2017 Maxim Cournoyer +;;; Copyright =C2=A9 2017, 2019 Maxim Cournoyer ;;; Copyright =C2=A9 2017 Alex Vong ;;; Copyright =C2=A9 2017, 2018 Ricardo Wurmus ;;; Copyright =C2=A9 2017 Jan Nieuwenhuizen @@ -185,6 +185,13 @@ =20 (native-search-paths (list (search-path-specification + (variable "EMACSLOADPATH") + ;; The versioned entries are for the Emacs' builtin libraries. + (files (list (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"))))) =20 --=20 2.23.0 --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0002-build-system-emacs-Simplify-the-SET-EMACS-LOAD-PATH-.patch Content-Transfer-Encoding: quoted-printable >From 9c4897347bee7f3b6afb97a6c766d57f0bee1b9d Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Mon, 28 Oct 2019 08:09:03 -0400 Subject: [PATCH 2/3] build-system: emacs: Simplify the SET-EMACS-LOAD-PATH phase. It is no longer necessary to search for the Elisp libraries manually, as Em= acs 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-sys= tem.scm index 47a9eda9e6..f0c41812f1 100644 --- a/guix/build/emacs-build-system.scm +++ b/guix/build/emacs-build-system.scm @@ -2,7 +2,7 @@ ;;; Copyright =C2=A9 2015 Federico Beffa ;;; Copyright =C2=A9 2016 David Thompson ;;; Copyright =C2=A9 2016 Alex Kost -;;; Copyright =C2=A9 2018 Maxim Cournoyer +;;; Copyright =C2=A9 2018, 2019 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -74,40 +74,14 @@ archive, a directory, or an Emacs Lisp file." #t) (gnu:unpack #:source source))) =20 -(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-i= nstall-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 fou= nd." +(define* (add-source-to-load-path #:key dummy #:allow-other-keys) + "Augment the EMACSLOADPATH environment variable with the source director= y." (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-append (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))) =20 (define* (build #:key outputs inputs #:allow-other-keys) "Compile .el files." @@ -269,7 +243,7 @@ second hyphen. This corresponds to 'name-version' as u= sed 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 --=20 2.23.0 --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0003-gnu-emacs-Adapt-the-autoloads-auxiliary-code-to-use-.patch Content-Transfer-Encoding: quoted-printable >From 39b31bb30b8ecab67bd6de315b5aa1bb59a3ee20 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Tue, 29 Oct 2019 22:07:55 -0400 Subject: [PATCH 3/3] gnu: emacs: Adapt the autoloads auxiliary code to use EMACSLOADPATH. The Elisp directories to scan for autoloads are now taken from EMACSLOADPATH instead of from the user profile, environment profile or system profile. Manually adding the Elisp directories to the `load-path' is no longer necessary, as this is covered by Emacs when they are in EMACSLOADPATH. The caching logic is also removed, as this code is not typically run often and = the gain is marginal (loading autoloads files is cheap). * gnu/packages/aux-files/emacs/guix-emacs.el (guix-emacs-directory) (guix-emacs-subdirs, guix-emacs-directories): Remove procedures. (guix-emacs-find-autoloads): Filter the directory entries by passing the regexp to `directory-files' directly, which is ten times faster. Remove deduplication. (guix-emacs-autoloads-regexp): Remove the group, which used to filter out t= he file extension; it no longer works this way due to passing the regexp to the `directory-files' procedure directly, which doesn't care about groups. (guix-emacs-autoload-packages): Update doc. Search package directories from EMACSLOADPATH. Do not populate the load-path. Remove cache. --- gnu/packages/aux-files/emacs/guix-emacs.el | 98 ++++++---------------- 1 file changed, 24 insertions(+), 74 deletions(-) diff --git a/gnu/packages/aux-files/emacs/guix-emacs.el b/gnu/packages/aux-= files/emacs/guix-emacs.el index 9a49e8861c..46ee557f20 100644 --- a/gnu/packages/aux-files/emacs/guix-emacs.el +++ b/gnu/packages/aux-files/emacs/guix-emacs.el @@ -2,6 +2,7 @@ =20 ;; Copyright =C2=A9 2014, 2015, 2016, 2017 Alex Kost ;; Copyright =C2=A9 2017 Kyle Meyer +;; Copyright =C2=A9 2019 Maxim Cournoyer =20 ;; This file is part of GNU Guix. =20 @@ -24,91 +25,40 @@ ;; installed with Guix. =20 ;;; 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.") +(require 'seq) =20 (defvar guix-emacs-autoloads-regexp - (rx (group (* any) "-autoloads") - ".el" (zero-or-one "c") string-end) + (rx (* any) "-autoloads.el" (zero-or-one "c") string-end) "Regexp to match Emacs 'autoloads' file.") =20 -(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=3D)) - -(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 package= s. -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))))) + ;; `directory-files' doesn't honor group in regexp. + (mapcar #'file-name-sans-extension + (directory-files directory 'full-name guix-emacs-autoloads-regex= p))) =20 ;;;###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. +(defun guix-emacs-autoload-packages () + "Autoload Emacs packages found in EMACSLOADPATH. =20 -'Autoload' means add directories with Emacs packages to -`load-path' and load 'autoloads' files matching +'Autoload' means to load the '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=3D))) - (dolist (dir dirs) - (cl-pushnew (directory-file-name dir) - load-path - :test #'string=3D)) - (dolist (file new-autoloads) - (load file 'noerror)) - (setq guix-emacs-autoloads - (append new-autoloads guix-emacs-autoloads)))))))) + ;; FIXME: The autoloads generated by the emacs-build-system are not byte + ;; compiled. + (interactive) + (let* ((emacs-load-path (getenv "EMACSLOADPATH")) + (emacs-non-core-load-path-directories + ;; Filter out core Elisp directories, which are already autoload= ed + ;; by Emacs. + (seq-filter (lambda (dir) + (string-match-p "/share/emacs/site-lisp" dir)) + (split-string emacs-load-path ":"))) + (autoloads (mapcan #'guix-emacs-find-autoloads + emacs-non-core-load-path-directories))) + (mapc (lambda (f) + (load f 'noerror)) + autoloads))) =20 (provide 'guix-emacs) =20 --=20 2.23.0 --=-=-=--