From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59104) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eeaMR-0006Xq-Hr for guix-patches@gnu.org; Thu, 25 Jan 2018 00:46:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eeaMN-00067u-5O for guix-patches@gnu.org; Thu, 25 Jan 2018 00:46:07 -0500 Received: from debbugs.gnu.org ([208.118.235.43]:33731) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eeaMM-00067G-PJ for guix-patches@gnu.org; Thu, 25 Jan 2018 00:46:03 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1eeaMM-0002ol-A7 for guix-patches@gnu.org; Thu, 25 Jan 2018 00:46:02 -0500 Subject: [bug#30119] [PATCHv2] Add emacs-realgud and varia Resent-Message-ID: From: Maxim Cournoyer References: <87d12bbwfa.fsf@gmail.com> Date: Thu, 25 Jan 2018 00:45:31 -0500 In-Reply-To: <87d12bbwfa.fsf@gmail.com> (Maxim Cournoyer's message of "Sun, 14 Jan 2018 23:03:37 -0500") Message-ID: <87bmhi8pac.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: 30119@debbugs.gnu.org --=-=-= Content-Type: text/plain Maxim Cournoyer writes: > This patch series introduces some changes and bugfixes to the Emacs > build system and goes on to add RealGUD and its dependencies. I've just reworked those patches to include an improvement suggested by Ludovic in another patch. I've also cleaned the #t and #f returned from the build phases and used invoke instead of system*. Maxim --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-emacs-build-system-Add-set-emacs-load-path-phase.patch Content-Transfer-Encoding: quoted-printable >From 379cf143bb078c7785d104a41a762d6136f1508e Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Sat, 13 Jan 2018 17:54:18 -0500 Subject: [PATCH 1/4] emacs-build-system: Add set-emacs-load-path phase. This generalizes the mechanism by which the Emacs dependencies are made vis= ible, so that any build phase can make use of them. * guix/build/emacs-build-system.scm (%legacy-install-suffix): New variable. (%install-suffix): Redefine in terms of %legacy-install-suffix. (set-emacs-load-path): Add new phase used for dependency resolution. (build): Remove ad-hoc dependency discovery mechanism. (emacs-input->el-directory): Add new procedure. (emacs-inputs-el-directories): Use it. (package-name-version->elpa-name-version): Fix typo. (%standard-phases): Include the new `set-emacs-load-path' phase. Refactor to make the ordering of the phases clearer. * guix/build/emacs-utils.scm (emacs-byte-compile-directory): Remove the optional `dependency-dirs' argument, which is now obsoleted by the `set-emacs-load-path' phase. --- guix/build/emacs-build-system.scm | 50 ++++++++++++++++++++++++++++-------= ---- guix/build/emacs-utils.scm | 11 +++------ 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/guix/build/emacs-build-system.scm b/guix/build/emacs-build-sys= tem.scm index bd0d2e026..395c55545 100644 --- a/guix/build/emacs-build-system.scm +++ b/guix/build/emacs-build-system.scm @@ -2,6 +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 ;;; ;;; This file is part of GNU Guix. ;;; @@ -42,7 +43,8 @@ ;; Directory suffix where we install ELPA packages. We avoid ".../elpa" as ;; Emacs expects to find the ELPA repository 'archive-contents' file and t= he ;; archive signature. -(define %install-suffix "/share/emacs/site-lisp/guix.d") +(define %legacy-install-suffix "/share/emacs/site-lisp") +(define %install-suffix (string-append %legacy-install-suffix "/guix.d")) =20 ;; These are the default inclusion/exclusion regexps for the install phase. (define %default-include '("^[^/]*\\.el$" "^[^/]*\\.info$" "^doc/.*\\.info= $")) @@ -72,17 +74,25 @@ archive, a directory, or an Emacs Lisp file." #t) (gnu:unpack #:source source))) =20 +(define* (set-emacs-load-path #:key inputs #:allow-other-keys) + "Set the EMACSLOADPATH environment variable so that dependencies are fou= nd." + (let* ((input-elisp-dirs (emacs-inputs-el-directories + (emacs-inputs-directories inputs))) + (emacs-load-path-value (string-join + input-elisp-dirs ":" 'suffix))) + (setenv "EMACSLOADPATH" emacs-load-path-value) + (format #t "environment variable `EMACSLOADPATH' set to ~a\n" + emacs-load-path-value))) + (define* (build #:key outputs inputs #:allow-other-keys) "Compile .el files." (let* ((emacs (string-append (assoc-ref inputs "emacs") "/bin/emacs")) (out (assoc-ref outputs "out")) (elpa-name-ver (store-directory->elpa-name-version out)) - (el-dir (string-append out %install-suffix "/" elpa-name-ver)) - (deps-dirs (emacs-inputs-directories inputs))) + (el-dir (string-append out %install-suffix "/" elpa-name-ver))) (setenv "SHELL" "sh") (parameterize ((%emacs emacs)) - (emacs-byte-compile-directory el-dir - (emacs-inputs-el-directories deps-dirs= ))))) + (emacs-byte-compile-directory el-dir)))) =20 (define* (patch-el-files #:key outputs #:allow-other-keys) "Substitute the absolute \"/bin/\" directory with the right location in = the @@ -199,18 +209,27 @@ store in '.el' files." (match inputs (((names . directories) ...) directories)))) =20 +(define (emacs-input->el-directory emacs-input) + "Return the correct Elisp directory location of EMACS-INPUT or #f if non= e." + (let ((legacy-elisp-dir (string-append emacs-input %legacy-install-suffi= x)) + (guix-elisp-dir (string-append + emacs-input %install-suffix "/" + (store-directory->elpa-name-version emacs-input))= )) + (cond + ((file-exists? guix-elisp-dir) guix-elisp-dir) + ((file-exists? legacy-elisp-dir) legacy-elisp-dir) + (else (format #t "warning: could not locate elisp directory under `~a= '\n" + emacs-input) + #f)))) + (define (emacs-inputs-el-directories dirs) "Build the list of Emacs Lisp directories from the Emacs package directo= ry DIRS." - (append-map (lambda (d) - (list (string-append d "/share/emacs/site-lisp") - (string-append d %install-suffix "/" - (store-directory->elpa-name-version d= )))) - dirs)) + (filter string? (map emacs-input->el-directory dirs))) =20 (define (package-name-version->elpa-name-version name-ver) "Convert the Guix package NAME-VER to the corresponding ELPA name-version -format. Essnetially drop the prefix used in Guix." +format. Essentially drop the prefix used in Guix." (if (emacs-package? name-ver) ; checks for "emacs-" prefix (string-drop name-ver (string-length "emacs-")) name-ver)) @@ -224,12 +243,15 @@ second hyphen. This corresponds to 'name-version' as= used in ELPA packages." =20 (define %standard-phases (modify-phases gnu:%standard-phases + (add-after 'set-paths 'set-emacs-load-path set-emacs-load-path) (replace 'unpack unpack) (delete 'configure) (delete 'check) - (delete 'install) - (replace 'build build) - (add-before 'build 'install install) + ;; Move the build phase after install: the .el files are byte compiled + ;; directly in the store. + (delete 'build) + (replace 'install install) + (add-after 'install 'build build) (add-after 'install 'make-autoloads make-autoloads) (add-after 'make-autoloads 'patch-el-files patch-el-files) (add-after 'make-autoloads 'move-doc move-doc))) diff --git a/guix/build/emacs-utils.scm b/guix/build/emacs-utils.scm index fd06aad7a..8389ca582 100644 --- a/guix/build/emacs-utils.scm +++ b/guix/build/emacs-utils.scm @@ -58,14 +58,9 @@ (update-directory-autoloads ,directory)))) (emacs-batch-eval expr))) =20 -(define* (emacs-byte-compile-directory dir #:optional (dependency-dirs '()= )) - "Byte compile all files in DIR and its sub-directories. Before compiling -the files, add DIR and all directories in DEPENDENCY-DIRS to 'load-path'." - (let ((expr `(progn - (add-to-list 'load-path ,dir) - (when ',dependency-dirs - (setq load-path (append ',dependency-dirs load-path))) - (byte-recompile-directory (file-name-as-directory ,dir) 0)= ))) +(define* (emacs-byte-compile-directory dir) + "Byte compile all files in DIR and its sub-directories." + (let ((expr `(byte-recompile-directory (file-name-as-directory ,dir) 0))) (emacs-batch-eval expr))) =20 (define-syntax emacs-substitute-sexps --=20 2.16.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-emacs-build-system-Reinstate-the-check-phase.patch >From f76b5faee8b0752d1aae95b9df7a1e9e6d88bd08 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Sat, 13 Jan 2018 17:54:57 -0500 Subject: [PATCH 2/4] emacs-build-system: Reinstate the check phase. * guix/build/emacs-build-system.scm (%standard-phases): Reinstate the check phase from the gnu-build-system. * guix/build-system/emacs.scm (emacs-build)[tests?]: But do not enable it by default. [parallel-tests?]: Add argument. --- guix/build-system/emacs.scm | 3 ++- guix/build/emacs-build-system.scm | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guix/build-system/emacs.scm b/guix/build-system/emacs.scm index 02296829c..d9f1a8d28 100644 --- a/guix/build-system/emacs.scm +++ b/guix/build-system/emacs.scm @@ -82,7 +82,8 @@ (define* (emacs-build store name inputs #:key source - (tests? #t) + (tests? #f) + (parallel-tests? #t) (test-target "test") (configure-flags ''()) (phases '(@ (guix build emacs-build-system) diff --git a/guix/build/emacs-build-system.scm b/guix/build/emacs-build-system.scm index 395c55545..791af3437 100644 --- a/guix/build/emacs-build-system.scm +++ b/guix/build/emacs-build-system.scm @@ -246,7 +246,6 @@ second hyphen. This corresponds to 'name-version' as used in ELPA packages." (add-after 'set-paths 'set-emacs-load-path set-emacs-load-path) (replace 'unpack unpack) (delete 'configure) - (delete 'check) ;; Move the build phase after install: the .el files are byte compiled ;; directly in the store. (delete 'build) -- 2.16.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0003-emacs-build-system-Work-around-issue-30611.patch >From 50a671765b3d610e38f6e052a59b3eef316f4226 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Sun, 14 Jan 2018 22:38:20 -0500 Subject: [PATCH 3/4] emacs-build-system: Work around issue 30611. This is a temporary workaround issue 30611, where substitute* crashes on files containing NUL characters. * guix/build/emacs-build-system.scm (patch-el-files): Filter out elisp files that contain NUL characters. --- guix/build/emacs-build-system.scm | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/guix/build/emacs-build-system.scm b/guix/build/emacs-build-system.scm index 791af3437..83dd3e3c3 100644 --- a/guix/build/emacs-build-system.scm +++ b/guix/build/emacs-build-system.scm @@ -97,11 +97,26 @@ archive, a directory, or an Emacs Lisp file." (define* (patch-el-files #:key outputs #:allow-other-keys) "Substitute the absolute \"/bin/\" directory with the right location in the store in '.el' files." + + ;; TODO: Remove after issue 30611 is fixed in master (see: + ;; https://debbugs.gnu.org/30116). + (define (file-contains-nul-char? file) + (call-with-input-file file + (lambda (in) + (let loop ((line (read-line in 'concat))) + (cond + ((eof-object? line) #f) + ((string-index line #\nul) #t) + (else (loop (read-line in 'concat)))))) + #:binary #t)) + (let* ((out (assoc-ref outputs "out")) (elpa-name-ver (store-directory->elpa-name-version out)) (el-dir (string-append out %install-suffix "/" elpa-name-ver)) + (el-files (remove file-contains-nul-char? + (find-files "." "\\.el$"))) (substitute-cmd (lambda () - (substitute* (find-files "." "\\.el$") + (substitute* el-files (("\"/bin/([^.]\\S*)\"" _ cmd-name) (let ((cmd (which cmd-name))) (unless cmd -- 2.16.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0004-gnu-Add-emacs-realgud.patch >From 1e4a28920b17f7a3bf3e34a999b29e0245233942 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Mon, 11 Dec 2017 00:07:57 -0500 Subject: [PATCH 4/4] gnu: Add emacs-realgud. * gnu/packages/emacs.scm (emacs-test-simple, emacs-load-relative, emacs-loc-changes, emacs-realgud): New public variables. --- gnu/packages/emacs.scm | 122 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm index ed95104e0..e49e48b77 100644 --- a/gnu/packages/emacs.scm +++ b/gnu/packages/emacs.scm @@ -3165,6 +3165,128 @@ perspective only its buffers are available by default.") ;; the Expat license. (license license:gpl3+))) +(define-public emacs-test-simple + (package + (name "emacs-test-simple") + (version "1.3.0") + (source + (origin + (method url-fetch) + (uri (string-append "https://elpa.gnu.org/packages/test-simple-" + version ".el")) + (sha256 + (base32 + "1yd61jc9ds95a5n09052kwc5gasy57g4lxr0jsff040brlyi9czz")))) + (build-system emacs-build-system) + (home-page "https://github.com/rocky/emacs-test-simple") + (synopsis "Simple unit test framework for Emacs Lisp") + (description + "Test Simple is a simple unit test framework for Emacs Lisp. It +alleviates the need for context macros, enclosing specifications or required +test tags. It supports both interactive and non-interactive use.") + (license license:gpl3+))) + +(define-public emacs-load-relative + (package + (name "emacs-load-relative") + (version "1.3") + (source + (origin + (method url-fetch) + (uri (string-append "https://elpa.gnu.org/packages/load-relative-" + version ".el")) + (sha256 + (base32 + "1hfxb2436jdsi9wfmsv47lkkpa5galjf5q81bqabbsv79rv59dps")))) + (build-system emacs-build-system) + (home-page "http://github.com/rocky/emacs-load-relative") + (synopsis "Emacs Lisp relative file loading related functions") + (description + "Provides functions which facilitate writing multi-file Emacs packages +and running from the source tree without having to \"install\" code or fiddle +with @{load-path}. + +The main function, @code{load-relative}, loads an Emacs Lisp file relative to +another (presumably currently running) Emacs Lisp file.") + (license license:gpl3+))) + +(define-public emacs-loc-changes + (package + (name "emacs-loc-changes") + (version "1.2") + (source + (origin + (method url-fetch) + (uri (string-append "https://elpa.gnu.org/packages/loc-changes-" + version ".el")) + (sha256 + (base32 + "1x8fn8vqasayf1rb8a6nma9n6nbvkx60krmiahyb05vl5rrsw6r3")))) + (build-system emacs-build-system) + (home-page "https://github.com/rocky/emacs-loc-changes") + (synopsis "Keeps track of positions even after buffer changes") + (description + "This Emacs package provides a mean to track important buffer positions +after buffer changes.") + (license license:gpl3+))) + +(define-public emacs-realgud + (package + (name "emacs-realgud") + (version "1.4.4") + (source + (origin + (method url-fetch) + (uri (string-append "https://elpa.gnu.org/packages/realgud-" + version ".tar")) + (sha256 + (base32 + "1nc8km339ip90h1j55ahfga03v7x7rh4iycmw6yrxyzir68vwn7c")))) + (build-system emacs-build-system) + (arguments + `(#:tests? #t + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-autogen-script + (lambda _ + (substitute* "autogen.sh" + (("./configure") "sh configure")))) + (add-after 'fix-autogen-script 'autogen + (lambda _ + (setenv "CONFIG_SHELL" "sh") + (invoke "sh" "autogen.sh"))) + (add-after 'fix-autogen-script 'set-home + (lambda _ + (setenv "HOME" (getenv "TMPDIR")))) + (add-before 'patch-el-files 'remove-realgud-pkg.el + (lambda _ + ;; XXX: This file is auto-generated at some point and causes + ;; substitute* to crash during the `patch-el-files' phase with: + ;; ERROR: In procedure stat: No such file or directory: + ;; "./realgud-pkg.el" + (delete-file "./realgud-pkg.el") + ;; FIXME: `patch-el-files' crashes on this file with error: + ;; unable to locate "bashdb". + (delete-file "./test/test-regexp-bashdb.el")))) + #:include (cons* ".*\\.el$" %default-include))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("emacs-test-simple" ,emacs-test-simple))) + (propagated-inputs + `(("emacs-load-relative" ,emacs-load-relative) + ("emacs-loc-changes" ,emacs-loc-changes))) + (home-page "https://github.com/realgud/realgud/") + (synopsis + "Modular front-end for interacting with external debuggers") + (description + "RealGUD is a modular, extensible GNU Emacs front-end for interacting +with external debuggers. It integrates various debuggers such as gdb, pdb, +ipdb, jdb, lldb, bashdb, zshdb, etc. and allows to visually step code in the +sources. Unlike GUD, it also supports running multiple debug sessions in +parallel.") + (license license:gpl3+))) + (define-public emacs-request (package (name "emacs-request") -- 2.16.0 --=-=-=--