emacsWrapper: preload autoloads

This commits changes the Emacs wrapper, in order to preload all autoload
definitions when built with additional packages. The list of all
definitions is generated at build-time. Packages do not need to
be (require)d for them to work.

Before this change, a code like

```sh
nix-shell -I "nixpkgs=$PWD" -p "emacs.pkgs.withPackages(e:[e.magit])" \
          --run "emacs -Q -nw -f magit"
```

will fail with the message `Symbol’s function definition is void: magit`

After the change, the same code above will open Emacs with magit
enabled.

A slightly longer startup time of ~10ms was detected in local, informal
experiments.

More information on autoloading:
https://www.gnu.org/software/emacs/manual/html_node/eintr/Autoload.html
This commit is contained in:
Daniel Nagy 2022-04-03 19:28:23 +02:00
parent 671960c878
commit 4489718d8f
No known key found for this signature in database
GPG key ID: 1B8E8DCB576FB671
2 changed files with 8 additions and 3 deletions

View file

@ -135,9 +135,14 @@ runCommand
''}
}
siteAutoloads="$out/share/emacs/site-lisp/nix-generated-autoload.el"
touch $siteAutoloads
# Iterate over the array of inputs (avoiding nix's own interpolation)
for pkg in "''${requires[@]}"; do
linkEmacsPackage $pkg
find $pkg -name "*-autoloads.el" \
-exec echo \(load \"{}\" \'noerror \'nomessage\) \; >> $siteAutoloads
done
siteStart="$out/share/emacs/site-lisp/site-start.el"
@ -174,12 +179,12 @@ runCommand
> "$subdirs"
# Byte-compiling improves start-up time only slightly, but costs nothing.
$emacs/bin/emacs --batch -f batch-byte-compile "$siteStart" "$subdirs"
$emacs/bin/emacs --batch -f batch-byte-compile "$siteStart" "$subdirs" "$siteAutoloads"
${optionalString nativeComp ''
$emacs/bin/emacs --batch \
--eval "(add-to-list 'native-comp-eln-load-path \"$out/share/emacs/native-lisp/\")" \
-f batch-native-compile "$siteStart" "$subdirs"
-f batch-native-compile "$siteStart" "$subdirs" "$siteAutoloads"
''}
'';

View file

@ -44,4 +44,4 @@ export emacsWithPackages_siteLisp=@wrapperSiteLisp@
export EMACSNATIVELOADPATH="${newNativeLoadPath[*]}"
export emacsWithPackages_siteLispNative=@wrapperSiteLispNative@
exec @prog@ "$@"
exec @prog@ -l cl-loaddefs -l nix-generated-autoload "$@"