[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#66864: emacs-build-system builds .eln-files with mismatching path-ha
From: |
Mekeor Melire |
Subject: |
bug#66864: emacs-build-system builds .eln-files with mismatching path-hashes |
Date: |
Wed, 01 Nov 2023 13:03:48 +0000 |
2023-11-01 12:52 liliana.prikler@gmail.com:
Am Dienstag, dem 31.10.2023 um 23:49 +0000 schrieb Mekeor
Melire:
> To reproduce this bug follow the following steps. Please note
> that
> guix-shell seems to leak .eln-files. (This should be reported
> as
> another bug.)
What do you mean by "leaks .eln-files"?
To be honest, I can't reproduce the leakage right now. I'll create another bug
report if I can.
> That why the reproduction steps avoid guix-shell. Instead,
> we'll
> work with the current user profile.
>
> Delete Emacs' eln-cache (so that we can later see if new
> .eln-files have been generated):
>
> rm -rf ~/.emacs.d/eln-cache
>
> Remove all Emacs- and Emacs-related packages from Guix
> profile:
>
> guix package -I | cut -f 4 | grep emacs | xargs guix
> remove
>
> Install Emacs and emacs-unfill, as exemplary package, while
> replacing input "emacs-minimal" with "emacs", so that
> .eln-files
> are generated during the build:
>
> guix install emacs emacs-unfill
> --with-input=emacs-minimal=emacs
Just deleting the eln-cache should be enough for a MWE. When
doing an
MWE, make sure that its actually minimal :)
I wanted to make sure that an Emacs-related package is installed, and
specifically with the --with-input=emacs-minimal=emacs transformation because
otherwise .eln-files won't be built. The MRE is minimal in that sense that it
ensures what's needed; only one Emacs-related package is installed; and
commands are kept simple.
> Launch the freshly installed Emacs and load the "unfill"
> package.
> If the .eln-files that the emacs-unfill package provides match
> Emacs' expectations (path- and content-hash), it'll use it;
> otherwise, Emacs will compile a new .eln-file and save it into
> ~/.emacs.d/eln-cache/*/unfill-{path-hash}-{content-hash}.eln.
>
> emacs -q --eval "(require 'unfill)"
>
> Close Emacs after some seconds. Now determine the path-hash
> from
> Guix' build:
>
> basename
> ~/.guix-profile/lib/emacs/native-site-lisp/*/unfill-*.eln
> \
> | cut -d - -f 2
>
> Determine the path-hash from Emacs' native-compilation, which
> apparently has happened:
>
> basename ~/.emacs.d/eln-cache/*/unfill*.eln \
> | cut -d - -f 2
This is already the bug. There should not be a file written to
the
eln-cache (save for the trampolines that we still write there,
which is
also a known bug among those who care).
Yes, this is already the bug. The reason for the eln-cache to be created is
that the two path-hashes do not equal.
> The path-hashes from the last two steps are not equal.
>
> BUG SOLUTION HINTS
>
> In the #guix:libera.chat IRC channel, jpoiret pointed out:
> "the .eln
> file hash problem is due to grafts, grafts change the
> final output name, but they can't also update the file
> hashes...
> we'd need to modify emacs' behavior for this to work".
As jpoiret points out, this has to do with the file naming
choices of
Emacs, not with emacs-build-system per se. We would need to get
rid of
a lot of hashes if we wanted interoperable native-compiled Emacs
libraries. I wonder what upstream has to say about this.
The problem is that the .el-file-path that is passed to the Emacs function comp-el-to-eln-filename during build [1] does not equal to the
.el-file-path when Emacs is invoked. Personally, I do not
understand how grafting causes this. But I can confirm that when
--no-grafts is passed to "guix install emacs emacs-unfill
--with-input=emacs-minimal=emacs", then no eln-cache is created.
[1]: See these lines of code:
https://git.savannah.gnu.org/cgit/guix.git/tree/guix/build/emacs-build-system.scm?h=92913703448c8e1a488ab066f60741262cdbf923#n133
https://git.savannah.gnu.org/cgit/guix.git/tree/guix/build/emacs-utils.scm?h=92913703448c8e1a488ab066f60741262cdbf923#n149