[PATCH] WIP: Add gccemacs

OpenSubmitted by John Soo.
Details
2 participants
  • John Soo
  • zimoun
Owner
unassigned
Severity
normal
J
J
John Soo wrote 7 days ago
(address . guix-patches@gnu.org)
874kljnk8z.fsf@asu.edu
Hi Guix,
I was curious how fast this gccemacs branch might be, so I got it tocompile.
It feels fast but there are bugs and the closure is huge. Also thesepatches do not use any of the parameterization machinery.
I just thought I would share my work.
Thanks,
John
From 642c087de1592aeea0e65d04589423a05a96d68e Mon Sep 17 00:00:00 2001From: John Soo <jsoo1@asu.edu>Date: Sat, 21 Nov 2020 00:56:30 -0800Subject: [PATCH 1/3] gnu: Add emacs-next-no-x.
* gnu/packages/emacs.scm (emacs-next-no-x): New variable.--- gnu/packages/emacs.scm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
Toggle diff (42 lines)diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scmindex 4f5a67093c..2d9f2e7ec1 100644--- a/gnu/packages/emacs.scm+++ b/gnu/packages/emacs.scm@@ -22,6 +22,7 @@ ;;; Copyright © 2019 Amin Bandali <bandali@gnu.org> ;;; Copyright © 2020 Jack Hill <jackhill@jackhill.us> ;;; Copyright © 2020 Morgan Smith <Morgan.J.Smith@outlook.com>+;;; Copyright © 2020 John Soo <jsoo1@asu.edu> ;;; ;;; This file is part of GNU Guix. ;;;@@ -376,6 +377,27 @@ editor (console only)") (delete 'restore-emacs-pdmp) (delete 'strip-double-wrap))))))) +(define-public emacs-next-no-x+ (package+ (inherit emacs-next)+ (name "emacs-next-no-x")+ (synopsis (package-synopsis emacs-no-x))+ (build-system gnu-build-system)+ (arguments+ (substitute-keyword-arguments (package-arguments emacs-next)+ ((#:configure-flags flags)+ `(append '("--with-x-toolkit=no"+ "--with-xpm=no"+ "--with-jpeg=no"+ "--with-gif=no"+ "--with-tiff=no")+ ,flags))+ ((#:phases phases)+ `(modify-phases ,phases+ (delete 'restore-emacs-pdmp)+ (delete 'strip-double-wrap)))))+ (inputs (package-inputs emacs-no-x))))+ (define-public emacs-no-x-toolkit (package/inherit emacs (name "emacs-no-x-toolkit")-- 2.29.1
From 3d1948d2512a5fc09ed36de752fb36178517cab2 Mon Sep 17 00:00:00 2001From: John Soo <jsoo1@asu.edu>Date: Sat, 21 Nov 2020 00:57:27 -0800Subject: [PATCH 2/3] gnu: Add gccemacs.
* gnu/packages/emacs.scm (gccemacs): New variable.
Add supporting definitions for gccemacs-{version,commit,source} for othergccemacsen.--- gnu/packages/emacs.scm | 89 +++++++++++++++++++ gnu/packages/patches/gccemacs-exec-path.patch | 18 ++++ 2 files changed, 107 insertions(+) create mode 100644 gnu/packages/patches/gccemacs-exec-path.patch
Toggle diff (133 lines)diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scmindex 2d9f2e7ec1..6312fde3ad 100644--- a/gnu/packages/emacs.scm+++ b/gnu/packages/emacs.scm@@ -53,6 +53,7 @@ #:use-module (gnu packages compression) #:use-module (gnu packages fontutils) #:use-module (gnu packages fribidi)+ #:use-module (gnu packages gcc) #:use-module (gnu packages gd) #:use-module (gnu packages gettext) #:use-module (gnu packages glib)@@ -398,6 +399,94 @@ editor (console only)") (delete 'strip-double-wrap))))) (inputs (package-inputs emacs-no-x)))) +;; feature/native-comp+(define-public gccemacs-commit+ "6781cd670d1487bbf0364d80de68ca9733342769")++(define-public gccemacs-version+ (git-version "28.0.50" "0" gccemacs-commit))++(define-public gccemacs-source+ (origin+ (method git-fetch)+ (uri (git-reference+ (url "git://git.sv.gnu.org/emacs.git")+ (commit gccemacs-commit)))+ (sha256+ (base32+ "13pmrak5jvk5qp4i5iccn0fqa6by8ig8l0n3qqirm67dxrqiz2ya"))+ (patches (search-patches "gccemacs-exec-path.patch"+ "emacs-fix-scheme-indent-function.patch"+ "emacs-ignore-empty-xim-styles.patch"+ "emacs-source-date-epoch.patch"))+ (modules '((guix build utils)))+ (snippet+ '(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$")+ (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+ ;; something bogus.+ (substitute* "net/tramp-sh.el"+ ;; Patch the line after "(defcustom tramp-remote-path".+ (("\\(tramp-default-remote-path")+ (format #f "(tramp-default-remote-path ~s ~s ~s ~s "+ "~/.guix-profile/bin" "~/.guix-profile/sbin"+ "/run/current-system/profile/bin"+ "/run/current-system/profile/sbin")))++ ;; Make sure Man looks for C header files in the right+ ;; places.+ (substitute* "man.el"+ (("\"/usr/local/include\"" line)+ (string-join+ (list line+ "\"~/.guix-profile/include\""+ "\"/var/guix/profiles/system/profile/include\"")+ " ")))+ #t))))++(define add-libgccjit-gcc-lib-to-library-path+ '(lambda* (#:key inputs #:allow-other-keys)+ (let* ((libgccjit (assoc-ref inputs "libgccjit"))+ (gcc-dirs (find-files+ libgccjit "^gcc$" #:directories? #t))+ (gcc-dirs-paths (string-join gcc-dirs ":"))+ (prepend-to-env (lambda (val var)+ (setenv+ var (string-append+ val+ (or (getenv var) ""))))))+ (prepend-to-env gcc-dirs-paths "LIBRARY_PATH")+ (prepend-to-env gcc-dirs-paths "LD_LIBRARY_PATH")+ (prepend-to-env gcc-dirs-paths "PATH")+ #t)))++(define-public gccemacs+ (package+ (inherit emacs-next)+ (name "gccemacs")+ (version gccemacs-version)+ (source gccemacs-source)+ (synopsis "The extensible, customizeable, self-documenting text+editor (from the native compilation branch)")+ (inputs+ `(("libgccjit" ,(canonical-package libgccjit))+ ,@(package-inputs emacs-next)))+ (arguments+ (substitute-keyword-arguments (package-arguments emacs-next)+ ((#:phases p)+ `(modify-phases ,p+ (add-after 'bootstrap 'add-libgccjit-gcc-lib-to-library-path+ ,add-libgccjit-gcc-lib-to-library-path)))+ ((#:configure-flags flags ''())+ `(cons "--with-nativecomp" ,flags))))))+ (define-public emacs-no-x-toolkit (package/inherit emacs (name "emacs-no-x-toolkit")diff --git a/gnu/packages/patches/gccemacs-exec-path.patch b/gnu/packages/patches/gccemacs-exec-path.patchnew file mode 100644index 0000000000..3c75f9465e--- /dev/null+++ b/gnu/packages/patches/gccemacs-exec-path.patch@@ -0,0 +1,18 @@+Do not capture the build-time value of $PATH in the 'emacs' executable+since this can noticeably increase the size of the closure of Emacs+with things like GCC being referenced.++diff --git a/lisp/loadup.el.old b/lisp/loadup.el+index 158a4bf..f853a48 100644+--- a/lisp/loadup.el++++ b/lisp/loadup.el+@@ -509,7 +509,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))+ (when (and (featurep 'nativecomp)+ (equal dump-mode "pdump"))+ ;; Don't enable this before bootstrap is completed the as the-- 2.29.1
From f23ebabab5e57b22b45fea3a26f9a1814331f39a Mon Sep 17 00:00:00 2001From: John Soo <jsoo1@asu.edu>Date: Sat, 21 Nov 2020 00:59:14 -0800Subject: [PATCH 3/3] gnu: Add gcceamcs-no-x.
* gnu/packages/emacs.scm (gccemacs-no-x): New variable.--- gnu/packages/emacs.scm | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
Toggle diff (33 lines)diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scmindex 6312fde3ad..721a13f429 100644--- a/gnu/packages/emacs.scm+++ b/gnu/packages/emacs.scm@@ -487,6 +487,26 @@ editor (from the native compilation branch)") ((#:configure-flags flags ''()) `(cons "--with-nativecomp" ,flags)))))) +(define-public gccemacs-no-x+ (package/inherit emacs-next-no-x+ (name "gccemacs-no-x")+ (version gccemacs-version)+ (source gccemacs-source)+ (synopsis "The extensible, customizable, self-documenting text+editor (console only, from the native compilation branch)")+ (build-system gnu-build-system)+ (inputs+ `(("libgccjit" ,(canonical-package libgccjit))+ ,@(package-inputs emacs-next-no-x)))+ (arguments+ (substitute-keyword-arguments (package-arguments emacs-next-no-x)+ ((#:phases p)+ `(modify-phases ,p+ (add-after 'bootstrap 'add-libgccjit-gcc-lib-to-library-path+ ,add-libgccjit-gcc-lib-to-library-path)))+ ((#:configure-flags flags ''())+ `(cons "--with-nativecomp" ,flags))))))+ (define-public emacs-no-x-toolkit (package/inherit emacs (name "emacs-no-x-toolkit")-- 2.29.1
Z
Z
zimoun wrote 4 days ago
86360zvhkw.fsf@gmail.com
Hi John,
On Sat, 21 Nov 2020 at 01:15, John Soo <jsoo1@asu.edu> wrote:
Toggle quote (3 lines)> I was curious how fast this gccemacs branch might be, so I got it to> compile.
Thanks! This motivates me to resume what had been discussed here [1]:be able to somehow run:
Toggle snippet (3 lines) guix build emacs-magit emacs-foo emacs-bar --with-input=emacs=gccemacs
At least, have a package transformation that allow to rebuild all theEmacs packages with the ’gccemacs’ VM instead of the current Emacs 27 one.

Toggle quote (3 lines)> It feels fast but there are bugs and the closure is huge. Also these> patches do not use any of the parameterization machinery.
What do you mean by “parameterization machinery”? The new’with-parameter’ introduced here [2] or the package transformation thatreplaces all the dependencies (explicit and implicit).

1: https://yhetil.org/guix-bugs/868scwtt34.fsf@gmail.com/2: https://yhetil.org/guix-devel/87eeku8trb.fsf@gnu.org

All the best,simon
J
J
John Soo wrote 3 days ago
(name . zimoun)(address . zimon.toutoune@gmail.com)(address . 44775@debbugs.gnu.org)
87tutex08p.fsf@asu.edu
Hi zimoun,
zimoun <zimon.toutoune@gmail.com> writes:
Toggle quote (20 lines)> Thanks! This motivates me to resume what had been discussed here [1]:> be able to somehow run:>> guix build emacs-magit emacs-foo emacs-bar --with-input=emacs=gccemacs>> At least, have a package transformation that allow to rebuild all the> Emacs packages with the ’gccemacs’ VM instead of the current Emacs 27 one.>>>> It feels fast but there are bugs and the closure is huge. Also these>> patches do not use any of the parameterization machinery.>> What do you mean by “parameterization machinery”? The new> ’with-parameter’ introduced here [2] or the package transformation that> replaces all the dependencies (explicit and implicit).>>> 1: <https://yhetil.org/guix-bugs/868scwtt34.fsf@gmail.com/>> 2: <https://yhetil.org/guix-devel/87eeku8trb.fsf@gnu.org>
I am referring to https://yhetil.org/guix-devel/87eeku8trb.fsf@gnu.org
--with-parameter=gccemacs or similar seem to be required since thenative-comp branch requires a different source, configure flags, andprobably native-search-paths at least.
There appears to be a separate compiled artifact directory under$out/lib/emacs/$version/native-lisp/$version-triple which has thecompiled native libraries (.eln files). That directory seems to not bein the search path. That appears to be causing the first errorI see. I am not sure which env variable would be tweaked to pick thosepaths up.
Hope that helps!
John
J
J
John Soo wrote 3 days ago
(name . zimoun)(address . zimon.toutoune@gmail.com)(address . 44775@debbugs.gnu.org)
87pn42wz8o.fsf@asu.edu
Hi Guix and zimoun,
I fixed a bug in the build process here. Still no big progress on theother bugs.
- John
From 03ab270db130b9991fcbfa87b9d1fcc009fba059 Mon Sep 17 00:00:00 2001From: John Soo <jsoo1@asu.edu>Date: Fri, 20 Nov 2020 22:06:52 -0800Subject: [PATCH] gnu: Add gccemacs.
--- gnu/packages/emacs.scm | 109 ++++++++++++++++++ gnu/packages/patches/gccemacs-exec-path.patch | 18 +++ 2 files changed, 127 insertions(+) create mode 100644 gnu/packages/patches/gccemacs-exec-path.patch
Toggle diff (153 lines)diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scmindex 7a5dd9010c..98a9aae69b 100644--- a/gnu/packages/emacs.scm+++ b/gnu/packages/emacs.scm@@ -53,6 +53,7 @@ #:use-module (gnu packages compression) #:use-module (gnu packages fontutils) #:use-module (gnu packages fribidi)+ #:use-module (gnu packages gcc) #:use-module (gnu packages gd) #:use-module (gnu packages gettext) #:use-module (gnu packages glib)@@ -426,6 +427,114 @@ editor (console only)") (delete 'strip-double-wrap))))) (inputs (package-inputs emacs-no-x)))) +;; feature/native-comp+(define-public gccemacs-commit+ "6781cd670d1487bbf0364d80de68ca9733342769")++(define-public gccemacs-version+ (git-version "28.0.50" "0" gccemacs-commit))++(define-public gccemacs-source+ (origin+ (method git-fetch)+ (uri (git-reference+ (url "git://git.sv.gnu.org/emacs.git")+ (commit gccemacs-commit)))+ (sha256+ (base32+ "13pmrak5jvk5qp4i5iccn0fqa6by8ig8l0n3qqirm67dxrqiz2ya"))+ (patches (search-patches "gccemacs-exec-path.patch"+ "emacs-fix-scheme-indent-function.patch"+ "emacs-ignore-empty-xim-styles.patch"+ "emacs-source-date-epoch.patch"))+ (modules '((guix build utils)))+ (snippet+ '(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$")+ (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+ ;; something bogus.+ (substitute* "net/tramp-sh.el"+ ;; Patch the line after "(defcustom tramp-remote-path".+ (("\\(tramp-default-remote-path")+ (format #f "(tramp-default-remote-path ~s ~s ~s ~s "+ "~/.guix-profile/bin" "~/.guix-profile/sbin"+ "/run/current-system/profile/bin"+ "/run/current-system/profile/sbin")))++ ;; Make sure Man looks for C header files in the right+ ;; places.+ (substitute* "man.el"+ (("\"/usr/local/include\"" line)+ (string-join+ (list line+ "\"~/.guix-profile/include\""+ "\"/var/guix/profiles/system/profile/include\"")+ " ")))+ #t))))++(define add-libgccjit-gcc-lib-to-library-path+ '(lambda* (#:key inputs #:allow-other-keys)+ (define (prepend-to-env val var)+ (let ((current (getenv var)))+ (setenv+ var (if (and current (not (string-null? current)))+ (string-append val ":" current)+ val))))+ (let* ((libgccjit (assoc-ref inputs "libgccjit"))+ (gcc-dirs (find-files+ libgccjit "^gcc$" #:directories? #t))+ (gcc-dirs-paths (string-join gcc-dirs ":")))+ (prepend-to-env gcc-dirs-paths "LIBRARY_PATH")+ (prepend-to-env gcc-dirs-paths "LD_LIBRARY_PATH")+ (prepend-to-env gcc-dirs-paths "PATH")+ #t)))++(define-public gccemacs+ (package+ (inherit emacs-next)+ (name "gccemacs")+ (version gccemacs-version)+ (source gccemacs-source)+ (synopsis "The extensible, customizeable, self-documenting text+editor (from the native compilation branch)")+ (inputs+ `(("libgccjit" ,(canonical-package libgccjit))+ ,@(package-inputs emacs-next)))+ (arguments+ (substitute-keyword-arguments (package-arguments emacs-next)+ ((#:phases p)+ `(modify-phases ,p+ (add-after 'bootstrap 'add-libgccjit-gcc-lib-to-library-path+ ,add-libgccjit-gcc-lib-to-library-path)))+ ((#:configure-flags flags ''())+ `(cons "--with-nativecomp" ,flags))))))++(define-public gccemacs-no-x+ (package/inherit emacs-next-no-x+ (name "gccemacs-no-x")+ (version gccemacs-version)+ (source gccemacs-source)+ (synopsis "The extensible, customizable, self-documenting text+editor (console only, from the native compilation branch)")+ (build-system gnu-build-system)+ (inputs+ `(("libgccjit" ,(canonical-package libgccjit))+ ,@(package-inputs emacs-next-no-x)))+ (arguments+ (substitute-keyword-arguments (package-arguments emacs-next-no-x)+ ((#:phases p)+ `(modify-phases ,p+ (add-after 'bootstrap 'add-libgccjit-gcc-lib-to-library-path+ ,add-libgccjit-gcc-lib-to-library-path)))+ ((#:configure-flags flags ''())+ `(cons "--with-nativecomp" ,flags)))))) (define-public emacs-no-x-toolkit (package/inherit emacsdiff --git a/gnu/packages/patches/gccemacs-exec-path.patch b/gnu/packages/patches/gccemacs-exec-path.patchnew file mode 100644index 0000000000..3c75f9465e--- /dev/null+++ b/gnu/packages/patches/gccemacs-exec-path.patch@@ -0,0 +1,18 @@+Do not capture the build-time value of $PATH in the 'emacs' executable+since this can noticeably increase the size of the closure of Emacs+with things like GCC being referenced.++diff --git a/lisp/loadup.el.old b/lisp/loadup.el+index 158a4bf..f853a48 100644+--- a/lisp/loadup.el++++ b/lisp/loadup.el+@@ -509,7 +509,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))+ (when (and (featurep 'nativecomp)+ (equal dump-mode "pdump"))+ ;; Don't enable this before bootstrap is completed the as the-- 2.29.2
?