Subject: Re: bug#75812: 29.2.50; Support native-compiling package-install from batch Emacs

From: Eli Zaretskii <[email-masked]>
Date: Thu, 24 Apr 2025 08:28:43 +0300

> From: Spencer Baugh <[email-masked]>
> Cc: Andrea Corallo <[email-masked]>,  Eli Zaretskii <[email-masked]>,
>    [email-masked],  [email-masked],
>    [email-masked]
> Date: Wed, 23 Apr 2025 12:26:44 -0400
> 
> 
> Conveniently there's already a hook, native-comp-async-all-done-hook,
> which gets called when the async native compilation is done.  I just
> need to synchronously wait for that hook to be called.
> 
> So what about something like this?
> 
> (defun native-comp-async-wait-for-all-done ()
>   (unless (zerop (comp--async-runnings))
>     (let* ((native-comp-finished-pipe (make-pipe-process :name "native-comp-finished"))
>            (native-comp-async-all-done-hook (list (lambda () (delete-process native-comp-finished-pipe)))))
>       (accept-process-output native-comp-finished-pipe))))
> 
> The use of a pipe process is weird, but I don't know of a better way to
> wait for a hook to be called.

That will not work on Windows, so let's not.

I don't understand why you need all that complexity.  Why not loop
calling comp--async-runnings as long as it returns non-nil, each time
sleeping for, say, 0.5 sec?  Or why not install a
native-comp-async-all-done-hook that will notice when compilations are
done and allow the batch job to exit?  All you need is a means to wait
until all the async compilations are finished, no?

Or what am I missing?

> There's another related issue for the packaging use case I mentioned in
> my original email: The .eln files are placed in ~/.emacs.d/eln-cache/ by
> default when doing this native compilation.  That complicates building
> and installing these packages independently.  Is there a way to put the
> .eln files for a package in that individual package directory instead?

You need to tweak native-comp-eln-load-path, e.g. prepend to the
default-value list the directory where you want the *.eln files to be
written.  But you are well advised to leave the other directories in
the list alone.