On 2024-12-08 18:30, Liliana Marie Prikler wrote: > * gnu/packages/patches/emacs-native-comp-pin-packages.patch: New patch. > * gnu/local.mk (dist_patch_DATA): Register it here. > * gnu/packages/emacs.scm (emacs)[source]: Use it here. > [#:phases]: Remove ‘disable-native-compilation’. > > Fixes: Emacs native-comp collisions > --- > Hi Guix > > I finally got around to fixing this issue. The fix is actually quite simple: > it checks that the candidate eln file resides under the same prefix as the elc > file it was generated from. With this change applied > > * `guix shell emacs` will allow emacs to load its own natively-compiled > transient, assuming a previously clean environment > * `guix shell emacs emacs-transient` will instead load the byte-compiled > transient from emacs-transient > * `guix shell emacs emacs-transient --with-input=emacs-minimal=emacs` will > load the native-compiled emacs > > We still have to find a better way to enable native compilation for everything, > but this will give us the best performance possible while avoiding similar > issues in the future (side-eyeing org-mode, cc-mode et al. for possible > breakages). > > Cheers > > gnu/local.mk | 1 + > gnu/packages/emacs.scm | 11 +----- > .../emacs-native-comp-pin-packages.patch | 39 +++++++++++++++++++ > 3 files changed, 41 insertions(+), 10 deletions(-) > create mode 100644 gnu/packages/patches/emacs-native-comp-pin-packages.patch > > diff --git a/gnu/local.mk b/gnu/local.mk > index a02745d59c..652a6c1748 100644 > --- a/gnu/local.mk > +++ b/gnu/local.mk > @@ -1195,6 +1195,7 @@ dist_patch_DATA = \ > %D%/packages/patches/emacs-lispy-fix-thread-last-test.patch \ > %D%/packages/patches/emacs-native-comp-driver-options.patch \ > %D%/packages/patches/emacs-native-comp-fix-filenames.patch \ > + %D%/packages/patches/emacs-native-comp-pin-packages.patch \ > %D%/packages/patches/emacs-next-exec-path.patch \ > %D%/packages/patches/emacs-next-native-comp-driver-options.patch \ > %D%/packages/patches/emacs-pasp-mode-quote-file-names.patch \ > diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm > index 8140f61882..b0690fc4fb 100644 > --- a/gnu/packages/emacs.scm > +++ b/gnu/packages/emacs.scm > @@ -117,6 +117,7 @@ (define-public emacs-minimal > "emacs-fix-scheme-indent-function.patch" > "emacs-native-comp-driver-options.patch" > "emacs-native-comp-fix-filenames.patch" > + "emacs-native-comp-pin-packages.patch" > "emacs-pgtk-super-key-fix.patch")) > (modules '((guix build utils))) > (snippet > @@ -233,16 +234,6 @@ (define-public emacs-minimal > (("\\(tramp-compat-process-running-p \"(.*)\"\\)" all process) > (format #f "(or ~a (tramp-compat-process-running-p ~s))" > all (string-append "." process "-real")))))) > - (add-after 'unpack 'disable-native-compilation > - (lambda _ > - ;; Temporary workaround to prevent the behaviour discussed in > - ;; . > - ;; Please remove once the native-compilation for Emacs packages > - ;; is fully supported. > - (substitute* "lisp/transient.el" > - ((";; End:") > - ";; no-native-compile: t > -;; End:")))) > (add-before 'configure 'fix-/bin/pwd > (lambda _ > ;; Use `pwd', not `/bin/pwd'. > diff --git a/gnu/packages/patches/emacs-native-comp-pin-packages.patch b/gnu/packages/patches/emacs-native-comp-pin-packages.patch > new file mode 100644 > index 0000000000..dc328f03a8 > --- /dev/null > +++ b/gnu/packages/patches/emacs-native-comp-pin-packages.patch > @@ -0,0 +1,39 @@ > +Index: emacs-29.4/src/lread.c > +=================================================================== > +--- emacs-29.4.orig/src/lread.c > ++++ emacs-29.4/src/lread.c > +@@ -1668,9 +1668,34 @@ directories, make sure the PREDICATE fun > + > + #ifdef HAVE_NATIVE_COMP > + static bool > ++permit_swap_for_eln (Lisp_Object src_name, Lisp_Object eln_name) > ++{ > ++ char *src = SSDATA (src_name), *eln = SSDATA (eln_name); > ++ size_t eln_ln = strlen (eln); > ++ > ++ while (*src && *eln && *src == *eln) > ++ { > ++ ++src; ++eln; --eln_ln; > ++ } > ++ > ++ /* After stripping common prefixes, the first directory should be > ++ * "lib/" (inside the Guix store) or "native-lisp" (inside Emacs build). > ++ * Alternatively, if eln contains "eln-cache", it's likely the user's > ++ * cache, which we will also permit. */ > ++ > ++ return > ++ (eln_ln > 4 && !strncmp (eln, "lib/", 4)) || > ++ (eln_ln > 12 && !strncmp (eln, "native-lisp/", 12)) || > ++ strstr (eln, "eln-cache") != NULL; > ++} > ++ > ++static bool > + maybe_swap_for_eln1 (Lisp_Object src_name, Lisp_Object eln_name, > + Lisp_Object *filename, int *fd, struct timespec mtime) > + { > ++ if (!permit_swap_for_eln (src_name, eln_name)) > ++ return false; > ++ > + struct stat eln_st; > + int eln_fd = emacs_open (SSDATA (ENCODE_FILE (eln_name)), O_RDONLY, 0); > + > > base-commit: 17d86ac9df841deca4f2f5e173f50bd2461fe680 Hi Liliana! I didn't try this patch, but the approach looks reasonable. -- Best regards, Andrew Tropin