From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxim Cournoyer Subject: Re: Emacs in multiple profiles Date: Mon, 28 Oct 2019 08:46:10 -0400 Message-ID: <87ftjdca25.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> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:54733) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iP4PZ-0002yD-SS for help-guix@gnu.org; Mon, 28 Oct 2019 08:46:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iP4PX-0001ZT-Cz for help-guix@gnu.org; Mon, 28 Oct 2019 08:46:17 -0400 Received: from mail-qt1-x82d.google.com ([2607:f8b0:4864:20::82d]:40611) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iP4PX-0001Yh-2I for help-guix@gnu.org; Mon, 28 Oct 2019 08:46:15 -0400 Received: by mail-qt1-x82d.google.com with SMTP id o49so14302045qta.7 for ; Mon, 28 Oct 2019 05:46:14 -0700 (PDT) In-Reply-To: <87mudpm5nt.fsf@ambrevar.xyz> (Pierre Neidhardt's message of "Fri, 25 Oct 2019 13:21:58 +0200") 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: Pierre Neidhardt Cc: Alex Kost , myglc2@gmail.com, help-guix@gnu.org --=-=-= Content-Type: text/plain 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 --=-=-= 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 518b529fec93b8a767655f54e32aadade19da89f 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..a4ded4dbb9 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 `(,(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-gnu-emacs-Remove-custom-guix-emacs-code.patch Content-Transfer-Encoding: quoted-printable >From fe39bda4f2b6f8be433f8c89d80a6900e5732182 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer 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 long= er 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 =3D \ # Auxiliary files for packages. AUX_FILES =3D \ 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 =C2=A9 2014, 2015, 2016, 2017 Alex Kost -;; Copyright =C2=A9 2017 Kyle Meyer - -;; 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 . - -;;; 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=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))))) - -;;;###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=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)))))))) - -(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 packag= es - ;; 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.e= l") - (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))) =20 (native-search-paths --=20 2.23.0 --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0003-build-system-emacs-Simplify-the-SET-EMACS-LOAD-PATH-.patch Content-Transfer-Encoding: quoted-printable >From 1905a04b4495481991058a75469f2808cbb47bae Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer 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 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..5cd5e7656c 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 #: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-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))) =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 --=-=-=--