[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
?
Your comment

This issue is archived.

To comment on this conversation send an email to 38662@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 38662
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch