[PATCH] gnu: Add emacs-next.

  • Done
  • quality assurance status badge
Details
4 participants
  • Amin Bandali
  • Brett Gilio
  • Ludovic Courtès
  • Valentin Ignatev
Owner
unassigned
Submitted by
Amin Bandali
Severity
normal
A
A
Amin Bandali wrote on 18 Dec 2019 21:04
(address . guix-patches@gnu.org)(name . Amin Bandali)(address . bandali@gnu.org)
20191218200419.28836-1-bandali@gnu.org
Add `emacs-next' for building latest Emacs from git.

* gnu/packages/emacs.scm (emacs-next): New variable.
(emacs): make the autoload deletion snippet not fail when eshell/esh-groups.el
does not exist. This enables reuse of the entire snippet field of `emacs' for
`emacs-next'.
---
gnu/packages/emacs.scm | 64 +++++++++++++++++++-
gnu/packages/patches/emacs27-exec-path.patch | 12 ++++
2 files changed, 73 insertions(+), 3 deletions(-)
create mode 100644 gnu/packages/patches/emacs27-exec-path.patch

Toggle diff (122 lines)
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index eba7f88551..102754deed 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -17,6 +17,9 @@
;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2019 Jesse John Gildersleve <jessejohngildersleve@zohomail.eu>
+;;; Copyright © 2019 Valentin Ignatev <valentignatev@gmail.com>
+;;; Copyright © 2019 Leo Prikler <leo.prikler@student.tugraz.at>
+;;; Copyright © 2019 Amin Bandali <bandali@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -61,6 +64,7 @@
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages texinfo)
#:use-module (gnu packages tls)
+ #:use-module (gnu packages web) ; for jansson
#:use-module (gnu packages webkit)
#:use-module (gnu packages xml)
#:use-module (gnu packages xorg)
@@ -83,15 +87,15 @@
"emacs-source-date-epoch.patch"))
(modules '((guix build utils)))
(snippet
- ;; Delete the bundled byte-compiled elisp files and
- ;; generated autoloads.
'(with-directory-excursion "lisp"
+ ;; Delete the bundled byte-compiled elisp files and generated
+ ;; autoloads.
(for-each delete-file
(append (find-files "." "\\.elc$")
(find-files "." "loaddefs\\.el$")
;; This is the only "autoloads" file that
;; does not have "*loaddefs.el" name.
- '("eshell/esh-groups.el")))
+ (find-files "." "eshell/esh-groups\\.el$")))
;; Make sure Tramp looks for binaries in the right places on
;; remote Guix System machines, where 'getconf PATH' returns
@@ -211,6 +215,60 @@ large Lisp programs. It has full Unicode support for nearly all human
languages.")
(license license:gpl3+)))
+(define-public emacs-next
+ (let ((commit "6008b679f65f8377a1a1b4601024ac83df013caf")
+ (revision "0"))
+ (package
+ (inherit emacs)
+ (name "emacs-next")
+ (version (git-version "27" revision commit))
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://git.savannah.gnu.org/git/emacs.git")
+ (commit commit)))
+ (sha256 (base32 "0niamywp3cq05hqc7k693c3d12jbqbzbfgl4aza9dja0jidv4b80"))
+ (file-name (git-file-name name version))
+ (patches (search-patches "emacs27-exec-path.patch"
+ "emacs-fix-scheme-indent-function.patch"
+ "emacs-source-date-epoch.patch"))
+ (modules (origin-modules (package-source emacs)))
+ (snippet (origin-snippet (package-source emacs)))))
+ (arguments
+ (substitute-keyword-arguments (package-arguments emacs)
+ ((#:phases phases)
+ `(modify-phases ,phases
+ ;; The 'reset-gzip-timestamps phase will throw a
+ ;; permission error if gzip files aren't writable then
+ (add-before
+ 'reset-gzip-timestamps
+ 'make-compressed-files-writable
+ (lambda _
+ (for-each make-file-writable
+ (find-files %output ".*\\.t?gz$"))
+ #t))
+ ;; restore the dump file that Emacs installs somewhere in
+ ;; libexec/ to its original state
+ (add-after 'glib-or-gtk-wrap 'restore-emacs-pdmp
+ (lambda* (#:key outputs target #:allow-other-keys)
+ (let* ((libexec (string-append (assoc-ref outputs "out")
+ "/libexec"))
+ ;; each of these find-files should return one file
+ (pdmp (find-files libexec "^emacs\\.pdmp$"))
+ (pdmp-real (find-files libexec "^\\.emacs\\.pdmp-real$")))
+ (for-each (lambda (wrapper real)
+ (delete-file wrapper)
+ (rename-file real wrapper))
+ pdmp pdmp-real)
+ #t)))))))
+ (inputs
+ `(("jansson" ,jansson)
+ ,@(package-inputs emacs)))
+ (native-inputs
+ `(("autoconf" ,autoconf) ; needed when building from trunk
+ ,@(package-native-inputs emacs))))))
+
(define-public emacs-minimal
;; This is the version that you should use as an input to packages that just
;; need to byte-compile .el files.
diff --git a/gnu/packages/patches/emacs27-exec-path.patch b/gnu/packages/patches/emacs27-exec-path.patch
new file mode 100644
index 0000000000..368fa6e33a
--- /dev/null
+++ b/gnu/packages/patches/emacs27-exec-path.patch
@@ -0,0 +1,12 @@
+--- a/lisp/loadup.el
++++ b/lisp/loadup.el
+@@ -479,7 +479,8 @@ lost after dumping")))
+ ((equal dump-mode "dump") "emacs")
+ ((equal dump-mode "bootstrap") "emacs")
+ ((equal dump-mode "pbootstrap") "bootstrap-emacs.pdmp")
+- (t (error "unrecognized dump mode %s" dump-mode)))))
++ (t (error "unrecognized dump mode %s" dump-mode))))
++ (exec-path nil))
+ (message "Dumping under the name %s" output)
+ (condition-case ()
+ (delete-file output)
--
2.23.0
A
A
Amin Bandali wrote on 18 Dec 2019 21:15
(address . 38662@debbugs.gnu.org)
877e2tz8z5.fsf@gnu.org
Many thanks to Valentin and Leo both for their work and for helping me
put this together.
B
B
Brett Gilio wrote on 19 Dec 2019 03:28
(name . Amin Bandali)(address . bandali@gnu.org)
bdfd5e06-55a5-4fe3-9364-1aef6c090daa@localhost
Dec 18, 2019 2:06:12 PM Amin Bandali :

Toggle quote (137 lines)
> Add `emacs-next' for building latest Emacs from git.
>
> * gnu/packages/emacs.scm (emacs-next): New variable.
> (emacs): make the autoload deletion snippet not fail when eshell/esh-groups.el
> does not exist. This enables reuse of the entire snippet field of `emacs' for
> `emacs-next'.
> ---
> gnu/packages/emacs.scm | 64 +++++++++++++++++++-
> gnu/packages/patches/emacs27-exec-path.patch | 12 ++++
> 2 files changed, 73 insertions(+), 3 deletions(-)
> create mode 100644 gnu/packages/patches/emacs27-exec-path.patch
>
> diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
> index eba7f88551..102754deed 100644
> --- a/gnu/packages/emacs.scm
> +++ b/gnu/packages/emacs.scm
> @@ -17,6 +17,9 @@
> ;;; Copyright ? 2018 Mathieu Othacehe
> ;;; Copyright ? 2018, 2019 Tobias Geerinckx-Rice
> ;;; Copyright ? 2019 Jesse John Gildersleve
> +;;; Copyright ? 2019 Valentin Ignatev
> +;;; Copyright ? 2019 Leo Prikler
> +;;; Copyright ? 2019 Amin Bandali
> ;;;
> ;;; This file is part of GNU Guix.
> ;;;
> @@ -61,6 +64,7 @@
> #:use-module (gnu packages pkg-config)
> #:use-module (gnu packages texinfo)
> #:use-module (gnu packages tls)
> + #:use-module (gnu packages web) ; for jansson
> #:use-module (gnu packages webkit)
> #:use-module (gnu packages xml)
> #:use-module (gnu packages xorg)
> @@ -83,15 +87,15 @@
> "emacs-source-date-epoch.patch"))
> (modules '((guix build utils)))
> (snippet
> - ;; Delete the bundled byte-compiled elisp files and
> - ;; generated autoloads.
> '(with-directory-excursion "lisp"
> + ;; Delete the bundled byte-compiled elisp files and generated
> + ;; autoloads.
> (for-each delete-file
> (append (find-files "." "\\.elc$")
> (find-files "." "loaddefs\\.el$")
> ;; This is the only "autoloads" file that
> ;; does not have "*loaddefs.el" name.
> - '("eshell/esh-groups.el")))
> + (find-files "." "eshell/esh-groups\\.el$")))
>
> ;; Make sure Tramp looks for binaries in the right places on
> ;; remote Guix System machines, where 'getconf PATH' returns
> @@ -211,6 +215,60 @@ large Lisp programs. It has full Unicode support for nearly all human
> languages.")
> (license license:gpl3+)))
>
> +(define-public emacs-next
> + (let ((commit "6008b679f65f8377a1a1b4601024ac83df013caf")
> + (revision "0"))
> + (package
> + (inherit emacs)
> + (name "emacs-next")
> + (version (git-version "27" revision commit))
> + (source
> + (origin
> + (method git-fetch)
> + (uri (git-reference
> + (url "https://git.savannah.gnu.org/git/emacs.git")
> + (commit commit)))
> + (sha256 (base32 "0niamywp3cq05hqc7k693c3d12jbqbzbfgl4aza9dja0jidv4b80"))
> + (file-name (git-file-name name version))
> + (patches (search-patches "emacs27-exec-path.patch"
> + "emacs-fix-scheme-indent-function.patch"
> + "emacs-source-date-epoch.patch"))
> + (modules (origin-modules (package-source emacs)))
> + (snippet (origin-snippet (package-source emacs)))))
> + (arguments
> + (substitute-keyword-arguments (package-arguments emacs)
> + ((#:phases phases)
> + `(modify-phases ,phases
> + ;; The 'reset-gzip-timestamps phase will throw a
> + ;; permission error if gzip files aren't writable then
> + (add-before
> + 'reset-gzip-timestamps
> + 'make-compressed-files-writable
> + (lambda _
> + (for-each make-file-writable
> + (find-files %output ".*\\.t?gz$"))
> + #t))
> + ;; restore the dump file that Emacs installs somewhere in
> + ;; libexec/ to its original state
> + (add-after 'glib-or-gtk-wrap 'restore-emacs-pdmp
> + (lambda* (#:key outputs target #:allow-other-keys)
> + (let* ((libexec (string-append (assoc-ref outputs "out")
> + "/libexec"))
> + ;; each of these find-files should return one file
> + (pdmp (find-files libexec "^emacs\\.pdmp$"))
> + (pdmp-real (find-files libexec "^\\.emacs\\.pdmp-real$")))
> + (for-each (lambda (wrapper real)
> + (delete-file wrapper)
> + (rename-file real wrapper))
> + pdmp pdmp-real)
> + #t)))))))
> + (inputs
> + `(("jansson" ,jansson)
> + ,@(package-inputs emacs)))
> + (native-inputs
> + `(("autoconf" ,autoconf) ; needed when building from trunk
> + ,@(package-native-inputs emacs))))))
> +
> (define-public emacs-minimal
> ;; This is the version that you should use as an input to packages that just
> ;; need to byte-compile .el files.
> diff --git a/gnu/packages/patches/emacs27-exec-path.patch b/gnu/packages/patches/emacs27-exec-path.patch
> new file mode 100644
> index 0000000000..368fa6e33a
> --- /dev/null
> +++ b/gnu/packages/patches/emacs27-exec-path.patch
> @@ -0,0 +1,12 @@
> +--- a/lisp/loadup.el
> ++++ b/lisp/loadup.el
> +@@ -479,7 +479,8 @@ lost after dumping")))
> + ((equal dump-mode "dump") "emacs")
> + ((equal dump-mode "bootstrap") "emacs")
> + ((equal dump-mode "pbootstrap") "bootstrap-emacs.pdmp")
> +- (t (error "unrecognized dump mode %s" dump-mode)))))
> ++ (t (error "unrecognized dump mode %s" dump-mode))))
> ++ (exec-path nil))
> + (message "Dumping under the name %s" output)
> + (condition-case ()
> + (delete-file output)
> --
> 2.23.0
>


This looks good to me! Thank you for your hard work Amin, et al.

--
Brett M. Gilio
GNU Guix, Contributor | GNU Project, Webmaster
[DFC0 C7F7 9EE6 0CA7 AE55 5E19 6722 43C4 A03F 0EEE]
<brettg@gnu.org> <brettg@posteo.net>
V
V
Valentin Ignatev wrote on 19 Dec 2019 14:38
(address . 38662@debbugs.gnu.org)
CADXmXkjP7RPSET-PkfH2TKzQEoOfTA_4JbjRQY5L14TnNwL1tA@mail.gmail.com
Thanks a lot for submitting the patch, I'm eager to see emacs-next in
upstream!
However, there is a potential issue with it. Original emacs package that we
inherit here sets EMACSLOADPATH with two values, one of which is some
directory path combined with the version:

Every Emacs version creates a dir along the lines of
.gix-profile/share/emacs/version/lisp. Current emacs from master hardcodes
this version to 27.0.50, so this path becomes
.gix-profile/share/emacs/27.0.50/lisp. But since we set version based on
commit in this submitted patch, EMACSLOADPATH becomes invalid and this
specific directory doesn't end up in the guix-profile/etc/profile script,
so when you run emacs, you get multiple errors because Emacs can't load
builtin packages. I think that hardcoding a version of emacs-next to
"27.0.50" should work well. I'm attaching a patch that can be applied to
Amin's emacs-next patch.

Regards,
Valentin
Attachment: file
Hardcode version in `emacs-next', use commit in `file-name'

* gnu/packages/emacs.scm (emacs-next):
Hardcode version to be 27.0.50.
Change file-name to use commit instead of version to avoid checkout collisions.

Toggle diff (22 lines)
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index 102754deed..86795ba046 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -221,7 +221,7 @@ languages.")
(package
(inherit emacs)
(name "emacs-next")
- (version (git-version "27" revision commit))
+ (version "27.0.50")
(source
(origin
(method git-fetch)
@@ -229,7 +229,7 @@ languages.")
(url "https://git.savannah.gnu.org/git/emacs.git")
(commit commit)))
(sha256 (base32 "0niamywp3cq05hqc7k693c3d12jbqbzbfgl4aza9dja0jidv4b80"))
- (file-name (git-file-name name version))
+ (file-name (git-file-name name commit))
(patches (search-patches "emacs27-exec-path.patch"
"emacs-fix-scheme-indent-function.patch"
"emacs-source-date-epoch.patch"))
V
V
Valentin Ignatev wrote on 19 Dec 2019 15:08
(address . 38662@debbugs.gnu.org)
CADXmXkjMZDTiEBmJOZ88Fixca4=bhkb6V6gXOikuR7_9sswVwg@mail.gmail.com
As Leo pointed out on IRC, my patch would break guix package -u emacs-next
because of hardcoded version. So it's better to fix the search patch
instead of applying it.
Attachment: file
L
L
Ludovic Courtès wrote on 20 Dec 2019 22:59
(name . Amin Bandali)(address . bandali@gnu.org)(address . 38662@debbugs.gnu.org)
871rsypsir.fsf@gnu.org
Hi Amin,

Amin Bandali <bandali@gnu.org> skribis:

Toggle quote (7 lines)
> Add `emacs-next' for building latest Emacs from git.
>
> * gnu/packages/emacs.scm (emacs-next): New variable.
> (emacs): make the autoload deletion snippet not fail when eshell/esh-groups.el
> does not exist. This enables reuse of the entire snippet field of `emacs' for
> `emacs-next'.

Nice! Please also mention the new patch file and add it to
gnu/local.mk.

It LGTM, but…

Toggle quote (14 lines)
> (snippet
> - ;; Delete the bundled byte-compiled elisp files and
> - ;; generated autoloads.
> '(with-directory-excursion "lisp"
> + ;; Delete the bundled byte-compiled elisp files and generated
> + ;; autoloads.
> (for-each delete-file
> (append (find-files "." "\\.elc$")
> (find-files "." "loaddefs\\.el$")
> ;; This is the only "autoloads" file that
> ;; does not have "*loaddefs.el" name.
> - '("eshell/esh-groups.el")))
> + (find-files "." "eshell/esh-groups\\.el$")))

This change causes a rebuild of ‘emacs’, ‘emacs-minimal’, and everything
that depends on them (1K+ packages.) Can it be avoided somehow?

One solution would be to duplicate the snippet for now in ‘emacs-next’.

Toggle quote (3 lines)
> --- /dev/null
> +++ b/gnu/packages/patches/emacs27-exec-path.patch

Please add a line or two at the top explaining what this patch does.

Could you send an updated patch?

Thanks!

Ludo’.
A
A
Amin Bandali wrote on 22 Dec 2019 07:15
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 38662@debbugs.gnu.org)
87woaonaxl.fsf@gnu.org
Hi Ludo’, all,

Thanks for the all feedback. Below you will find v2 with the requested
changes, as well as a workaround for "EMACSLOADPATH" to use the correct
version name, currently 27.0.50, for `emacs-next', which I forgot to
include in my previous patch.
L
L
Ludovic Courtès wrote on 23 Dec 2019 19:26
(name . Amin Bandali)(address . bandali@gnu.org)(address . 38662-done@debbugs.gnu.org)
87lfr2j3u1.fsf@gnu.org
Hi Amin,

Amin Bandali <bandali@gnu.org> skribis:

Toggle quote (19 lines)
> Thanks for the all feedback. Below you will find v2 with the requested
> changes, as well as a workaround for "EMACSLOADPATH" to use the correct
> version name, currently 27.0.50, for `emacs-next', which I forgot to
> include in my previous patch.
>
> From 3a03851868440c6c0bda81b30693e3ead1196bd2 Mon Sep 17 00:00:00 2001
> From: Amin Bandali <bandali@gnu.org>
> Date: Tue, 17 Dec 2019 23:49:49 -0500
> Subject: [PATCH v2] gnu: Add emacs-next.
>
> Add `emacs-next' for building latest Emacs from git.
>
> * gnu/packages/emacs.scm (emacs-next): New variable.
> (emacs): make the autoload deletion snippet not fail when eshell/esh-groups.el
> does not exist. This enables reuse of the entire snippet field of `emacs' for
> `emacs-next'.
> * gnu/packages/patches/emacs27-exec-path.patch: New file.
> * gnu/local.mk (dist_patch_DATA): Add the above patch file to it.

Applied, thanks!

Ludo’.
Closed
?