Re: Deferring native compilation finalization until idle

Stéphane Marks <[email protected]> Sat, 25 Jul 2026 19:37:42 +0200
Newsgroups gmane.emacs.devel
Message-ID <CAN+1Hbrqvn5OXokLXpWy+SVazYXeYvG0qJWR9ELC=MtAvotLDw@mail.gmail.com>
On Sat, Jul 25, 2026 at 1:11 PM Stéphane Marks <[email protected]> wrote:

> On Sat, Jul 25, 2026 at 12:29 PM Stéphane Marks <[email protected]>
> wrote:
>
>> On Sat, Jul 25, 2026 at 12:22 PM Aaron Jensen <[email protected]>
>> wrote:
>>
>>> On Sat, Jul 25, 2026 at 9:18 AM, Stéphane Marks <[email protected]>
>>> wrote:
>>>
>>>> On Sat, Jul 25, 2026 at 12:14 PM Aaron Jensen <[email protected]>
>>>> wrote:
>>>>
>>>>> On Sat, Jul 25, 2026 at 9:04 AM, Stéphane Marks <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> FWIW, my eln-cache this morning, starting fresh from Thursday, has
>>>>>> 146 files with seldom used packages uncompiled, of course.  Rebuilding that
>>>>>> cache was entirely asynchronous, perhaps except for the trampolines.  I
>>>>>> have not tried setting native-comp-enable-subr-trampolines to nil in
>>>>>> early-init.el to see if this bypasses the delays that you're seeing.  Have
>>>>>> you tried that?
>>>>>>
>>>>>>>
>>>>>>>
>>>>> Setting native-comp-enable-subr-trampolines to nil does not noticeably
>>>>> reduce the stutter for me.
>>>>>
>>>>> Ending up with only 146 files likely means that even if you were to
>>>>> not have one of the workarounds in place, you would not notice as much
>>>>> stutter as one who had more.
>>>>>
>>>>> My guess is that if you were to try my config, or someone else's that
>>>>> notices the issue and not disable macOS's security checks, you too would
>>>>> notice the stutter.
>>>>>
>>>>> I work with others that use macOS. I can survey them to see how many
>>>>> of them have issues if that would be convincing to anyone. However, I think
>>>>> the facts are pretty well established and ultimately it's a decision as to
>>>>> whether or not the maintainers want to account for the particularities of
>>>>> macOS's bundle validation process by loading the bundle within the async
>>>>> worker (and take on the additional maintenance burden).
>>>>>
>>>>> Personally, I have my workaround, so I'm "fine". But I'm not a fan of
>>>>> macOS users that have have sufficient packages having an experience that
>>>>> leaves them with the opinion that Emacs has poor startup performance, or
>>>>> native compilation makes things worse, etc. Yes, those are
>>>>> narrowly-informed opinions, but I'm sure many users would not take the time
>>>>> to compare their startup performance to other OS's and/or to find this
>>>>> thread to better understand the depths of the problem. Instead, they'll
>>>>> just have a bad taste and deal with it every time they install a new
>>>>> version of Emacs.
>>>>>
>>>>
>>>> From first principles, what package is waiting to be built in the
>>>> eln-cache that Emacs is waiting for that prevents input?  AFAIK, the byte
>>>> code is first loaded and available to run and only then replaced on-the-fly
>>>> when native code is produced without error to replace it in the symbol's
>>>> function cell.
>>>>
>>>
>>> No, this is not what the problem is. That's the thing that I'm saying
>>> has been pretty well established in this thread, though it seems not well
>>> enough.
>>>
>>> The problem is that macOS, upon first *loading* the bundle in the main
>>> Emacs process will undergo a security check (the one disabled by the
>>> entitlements call you posted). This is a synchronous, blocking operation.
>>> MacOS does not allow the process to load the bundle until it has verified
>>> it, so the load is blocking. During this time, Emacs cannot receive input
>>> because the main thread is completely blocked by the operating system. As
>>> soon as you chain together hundreds of these macOS-initiated blocking
>>> operations (every single bundle being loaded) you have a very poor,
>>> stuttery, slow experience.
>>>
>>
>> Okay so it is just the macOS binary scanner then and like any virus
>> scanner interferes at the OS level.  A binary has to either opt out (as
>> PROBLEMS document a method to do and the jimeh build does), or has to
>> otherwise be whitelisted.  Every binary on macOS undergoes the same thing
>> without being opted out so this isn't an Emacs issue.  I agree that Emacs
>> loads "DLLs" and those can amplify the OS-imposed delay.  But only when
>> they're loaded into memory.  Someone with a jillion packages surely doesn't
>> need them all at once and can benefit from a carefully-crafted init.el with
>> deferred package loading.
>>
>
> FWIW, I did investigate whether we could enable DYLD environment variable
> (a different codesign entitlement) to see if we could allow the Emacs
> loader to temporarily disable library validation when loading a file from
> the eln cache.  I also took a casual look at the source code here
> https://github.com/apple-oss-distributions/dyld I failed to find a way to
> create a finer-grained approach.  Perhaps an enterprising person will dig
> something up.  For now, it seems it's all or nothing.
>

One thing I did not look at that someone may want to look into is whether
it is possible to codesign the files in the eln cache using the same
credentials/opt outs as the Emacs bundle (or ad-hoc signing) to avoid
library validation.  If that works, perhaps a hook could be added to the
native compiler to allow some post processing of each file to codesign it
as a one-time cost.