From 3d1948d2512a5fc09ed36de752fb36178517cab2 Mon Sep 17 00:00:00 2001 From: John Soo Date: Sat, 21 Nov 2020 00:57:27 -0800 Subject: [PATCH 2/3] gnu: Add gccemacs. * gnu/packages/emacs.scm (gccemacs): New variable. Add supporting definitions for gccemacs-{version,commit,source} for other gccemacsen. --- 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 diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm index 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.patch new file mode 100644 index 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