emacs: resolve wrapper load-path at build time

Since the included package set is determined at build time we can also
generate the `subdirs.el` file at build time. This improves startup
time somewhat since we don't have to traverse the directory to add to
`load-path`.

For example,

``` sh-session
$ bench './emacs-old -Q --batch --kill' './emacs-new -Q --batch --kill'
benchmarking bench/./emacs-old -Q --batch --kill
time 72.77 ms (71.66 ms .. 73.65 ms)
1.000 R² (0.999 R² .. 1.000 R²)
mean 72.49 ms (72.06 ms .. 72.92 ms)
std dev 746.5 μs (582.4 μs .. 1.008 ms)

benchmarking bench/./emacs-new -Q --batch --kill
time 40.56 ms (40.24 ms .. 40.86 ms)
1.000 R² (0.999 R² .. 1.000 R²)
mean 40.30 ms (40.12 ms .. 40.51 ms)
std dev 401.9 μs (311.1 μs .. 555.8 μs)
```

The change does not actually affect the content of `load-path`:

``` sh-session
$ diff -s <(./emacs-old --batch --eval '(prin1 load-path)' | sed -E 's!/nix/store/[[:alnum:]]{32}-!!g') \
<(./emacs-new --batch --eval '(prin1 load-path)' | sed -E 's!/nix/store/[[:alnum:]]{32}-!!g')
Files /dev/fd/63 and /dev/fd/62 are identical
```

So in principle the only observable effect should be the improved
startup time.

+13 -2
+6
pkgs/build-support/emacs/mk-wrapper-subdirs.el
··· 1 + (defmacro mk-subdirs-expr (path) 2 + `(setq load-path 3 + (delete-dups (append '(,path) 4 + ',(let ((default-directory path)) 5 + (normal-top-level-add-subdirs-to-load-path)) 6 + load-path))))
+7 -2
pkgs/build-support/emacs/wrapper.nix
··· 165 165 (add-to-list 'native-comp-eln-load-path "$out/share/emacs/native-lisp/") 166 166 ''} 167 167 EOF 168 - # Link subdirs.el from the emacs distribution 169 - ln -s $emacs/share/emacs/site-lisp/subdirs.el -T $subdirs 168 + 169 + # Generate a subdirs.el that statically adds all subdirectories to load-path. 170 + $emacs/bin/emacs \ 171 + --batch \ 172 + --load ${./mk-wrapper-subdirs.el} \ 173 + --eval "(prin1 (macroexpand-1 '(mk-subdirs-expr \"$out/share/emacs/site-lisp\")))" \ 174 + > "$subdirs" 170 175 171 176 # Byte-compiling improves start-up time only slightly, but costs nothing. 172 177 $emacs/bin/emacs --batch -f batch-byte-compile "$siteStart" "$subdirs"