From b5904fcc34596e0aabb85020808b746e4c8b39a0 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Thu, 29 Mar 2018 20:52:41 -0400 Subject: build-system: emacs: Search all inputs for Emacs Lisp directories. * guix/build/emacs-build-system.scm (set-emacs-load-path): Include Emacs Lisp directories from all inputs. Also, add the unpacked source directory to EMACSLOADPATH. (emacs-inputs, emacs-inputs-directories, emacs-input->el-directory, emacs-inputs-el-directories): Remove. (%standard-phases): Move set-emacs-load-path phase to after unpack phase. Signed-off-by: Arun Isaac --- guix/build/emacs-build-system.scm | 71 +++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 40 deletions(-) (limited to 'guix') diff --git a/guix/build/emacs-build-system.scm b/guix/build/emacs-build-system.scm index b779847424..41c0142cd9 100644 --- a/guix/build/emacs-build-system.scm +++ b/guix/build/emacs-build-system.scm @@ -74,12 +74,37 @@ (define* (unpack #:key source #:allow-other-keys) #t) (gnu:unpack #:source source))) -(define* (set-emacs-load-path #:key inputs #:allow-other-keys) +(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." - (let* ((input-elisp-dirs (emacs-inputs-el-directories - (emacs-inputs-directories inputs))) - (emacs-load-path-value (string-join - input-elisp-dirs ":" 'suffix))) + (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))) (setenv "EMACSLOADPATH" emacs-load-path-value) (format #t "environment variable `EMACSLOADPATH' set to ~a\n" emacs-load-path-value))) @@ -210,40 +235,6 @@ (define (emacs-package? name) "Check if NAME correspond to the name of an Emacs package." (string-prefix? "emacs-" name)) -(define (emacs-inputs inputs) - "Retrieve the list of Emacs packages from INPUTS." - (filter (match-lambda - ((label . directory) - (emacs-package? ((compose package-name->name+version - strip-store-file-name) - directory))) - (_ #f)) - inputs)) - -(define (emacs-inputs-directories inputs) - "Extract the list of Emacs package directories from INPUTS." - (let ((inputs (emacs-inputs inputs))) - (match inputs - (((names . directories) ...) directories)))) - -(define (emacs-input->el-directory emacs-input) - "Return the correct Elisp directory location of EMACS-INPUT or #f if none." - (let ((legacy-elisp-dir (string-append emacs-input %legacy-install-suffix)) - (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 directory -DIRS." - (filter-map emacs-input->el-directory dirs)) - (define (package-name-version->elpa-name-version name-ver) "Convert the Guix package NAME-VER to the corresponding ELPA name-version format. Essentially drop the prefix used in Guix." @@ -260,8 +251,8 @@ (define (store-directory->elpa-name-version store-dir) (define %standard-phases (modify-phases gnu:%standard-phases - (add-after 'set-paths 'set-emacs-load-path set-emacs-load-path) (replace 'unpack unpack) + (add-after 'unpack 'set-emacs-load-path set-emacs-load-path) (delete 'configure) ;; Move the build phase after install: the .el files are byte compiled ;; directly in the store. -- cgit v1.2.3 From 8a8fa82e72f55526e8aae85809c8655f5ff26690 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Sun, 15 Apr 2018 22:46:26 -0400 Subject: build-system: emacs: Replace system* with invoke. * guix/build/emacs-utils.scm: Use (guix build utils) for invoke. (emacs-batch-eval, emacs-batch-edit-file): Replace system* with invoke. * guix/build/emacs-build-system.scm (make-autoloads): No need to return #t explicitly since emacs-generate-autoloads now uses invoke. Signed-off-by: Arun Isaac --- guix/build/emacs-build-system.scm | 3 +-- guix/build/emacs-utils.scm | 14 +++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) (limited to 'guix') diff --git a/guix/build/emacs-build-system.scm b/guix/build/emacs-build-system.scm index 41c0142cd9..da17eb17b1 100644 --- a/guix/build/emacs-build-system.scm +++ b/guix/build/emacs-build-system.scm @@ -228,8 +228,7 @@ (define* (make-autoloads #:key outputs inputs #:allow-other-keys) (elpa-name (package-name->name+version elpa-name-ver)) (el-dir (string-append out %install-suffix "/" elpa-name-ver))) (parameterize ((%emacs emacs)) - (emacs-generate-autoloads elpa-name el-dir)) - #t)) + (emacs-generate-autoloads elpa-name el-dir)))) (define (emacs-package? name) "Check if NAME correspond to the name of an Emacs package." diff --git a/guix/build/emacs-utils.scm b/guix/build/emacs-utils.scm index 8389ca582f..2bd4e39854 100644 --- a/guix/build/emacs-utils.scm +++ b/guix/build/emacs-utils.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Mark H Weaver ;;; Copyright © 2014 Alex Kost +;;; Copyright © 2018 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -18,6 +19,7 @@ ;;; along with GNU Guix. If not, see . (define-module (guix build emacs-utils) + #:use-module (guix build utils) #:export (%emacs emacs-batch-eval emacs-batch-edit-file @@ -39,16 +41,14 @@ (define %emacs (define (emacs-batch-eval expr) "Run Emacs in batch mode, and execute the elisp code EXPR." - (unless (zero? (system* (%emacs) "--quick" "--batch" - (format #f "--eval=~S" expr))) - (error "emacs-batch-eval failed!" expr))) + (invoke (%emacs) "--quick" "--batch" + (format #f "--eval=~S" expr))) (define (emacs-batch-edit-file file expr) "Load FILE in Emacs using batch mode, and execute the elisp code EXPR." - (unless (zero? (system* (%emacs) "--quick" "--batch" - (string-append "--visit=" file) - (format #f "--eval=~S" expr))) - (error "emacs-batch-edit-file failed!" file expr))) + (invoke (%emacs) "--quick" "--batch" + (string-append "--visit=" file) + (format #f "--eval=~S" expr))) (define (emacs-generate-autoloads name directory) "Generate autoloads for Emacs package NAME placed in DIRECTORY." -- cgit v1.2.3 From facc0a96a171631bd346b37ffd47bcda6d82e892 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Sun, 11 Feb 2018 00:51:26 -0500 Subject: build-system: emacs: Add improved check phase. * guix/build-system/emacs.scm (emacs-build): Add #:test-command keyword argument. Remove #:configure-flags and #:test-target keyword arguments. * guix/build/emacs-build-system.scm (check): New procedure. (%standard-phases): Register check phase after the build phase. Signed-off-by: Arun Isaac --- guix/build-system/emacs.scm | 6 ++---- guix/build/emacs-build-system.scm | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) (limited to 'guix') diff --git a/guix/build-system/emacs.scm b/guix/build-system/emacs.scm index d9f1a8d289..ef6d1b3397 100644 --- a/guix/build-system/emacs.scm +++ b/guix/build-system/emacs.scm @@ -84,8 +84,7 @@ (define* (emacs-build store name inputs #:key source (tests? #f) (parallel-tests? #t) - (test-target "test") - (configure-flags ''()) + (test-command ''("make" "check")) (phases '(@ (guix build emacs-build-system) %standard-phases)) (outputs '("out")) @@ -110,9 +109,8 @@ (define builder source) (source source)) - #:configure-flags ,configure-flags #:system ,system - #:test-target ,test-target + #:test-command ,test-command #:tests? ,tests? #:phases ,phases #:outputs %outputs diff --git a/guix/build/emacs-build-system.scm b/guix/build/emacs-build-system.scm index da17eb17b1..094b04750a 100644 --- a/guix/build/emacs-build-system.scm +++ b/guix/build/emacs-build-system.scm @@ -158,6 +158,24 @@ (define (substitute-program-names) (substitute-program-names)))) #t)) +(define* (check #:key tests? (test-command '("make" "check")) + (parallel-tests? #t) #:allow-other-keys) + "Run the tests by invoking TEST-COMMAND. + +When TEST-COMMAND uses make and PARALLEL-TESTS is #t, the tests are run in +parallel. PARALLEL-TESTS? is ignored when using a non-make TEST-COMMAND." + (match-let (((test-program . args) test-command)) + (let ((using-make? (string=? test-program "make"))) + (if tests? + (apply invoke test-program + `(,@args + ,@(if (and using-make? parallel-tests?) + `("-j" ,(number->string (parallel-job-count))) + '()))) + (begin + (format #t "test suite not run~%") + #t))))) + (define* (install #:key outputs (include %default-include) (exclude %default-exclude) @@ -256,6 +274,7 @@ (define %standard-phases ;; Move the build phase after install: the .el files are byte compiled ;; directly in the store. (delete 'build) + (replace 'check check) (replace 'install install) (add-after 'install 'build build) (add-after 'install 'make-autoloads make-autoloads) -- cgit v1.2.3