emacsWithPackages: mutate EMACSLOADPATH correctly

An empty entry in EMACSLOADPATH gets filled with the default value.
This is presumably why the wrapper inserted a colon after the entry it
added for the dependencies.  But this naive approach wasn't always
correct.

For example, if the user ran emacs with EMACSLOADPATH=foo, the wrapper
would insert the default value (by adding the trailing `:') even
though the user was trying to expressly opt out of it.

To do this correctly, here I've replaced makeWrapper with a bespoke
script that will actually parse the EMACSLOADPATH provided in the
environment (if given), and insert the wrapper's load path just before
the default value.  If EMACSLOADPATH is given but contains no default
value, we respect that and don't add the wrapped dependencies at all.
If no EMACSLOADPATH is given, we insert the wrapped dependencies
before the default value, just like before.  In this way, the wrapped
Emacs should now behave as if the wrapped dependencies were part of
Emacs's default load-path value.
This commit is contained in:
Alyssa Ross 2020-12-09 15:53:10 +00:00
parent fa09aa8efd
commit 0127013b0f
No known key found for this signature in database
GPG key ID: F9DBED4859B271C0
2 changed files with 38 additions and 4 deletions

View file

@ -155,8 +155,12 @@ runCommand
for prog in $emacs/bin/*; do # */
local progname=$(basename "$prog")
rm -f "$out/bin/$progname"
makeWrapper "$prog" "$out/bin/$progname" \
--suffix EMACSLOADPATH ":" "$deps/share/emacs/site-lisp:"
substitute ${./wrapper.sh} $out/bin/$progname \
--subst-var-by bash ${emacs.stdenv.shell} \
--subst-var-by wrapperSiteLisp "$deps/share/emacs/site-lisp" \
--subst-var prog
chmod +x $out/bin/$progname
done
# Wrap MacOS app
@ -168,8 +172,12 @@ runCommand
$emacs/Applications/Emacs.app/Contents/PkgInfo \
$emacs/Applications/Emacs.app/Contents/Resources \
$out/Applications/Emacs.app/Contents
makeWrapper $emacs/Applications/Emacs.app/Contents/MacOS/Emacs $out/Applications/Emacs.app/Contents/MacOS/Emacs \
--suffix EMACSLOADPATH ":" "$deps/share/emacs/site-lisp:"
substitute ${./wrapper.sh} $out/Applications/Emacs.app/Contents/MacOS/Emacs \
--subst-var-by bash ${emacs.stdenv.shell} \
--subst-var-by wrapperSiteLisp "$emacs/Applications/Emacs.app/Contents/MacOS/Emacs" \
--subst-var prog
chmod +x $out/bin/$progname
fi
mkdir -p $out/share

View file

@ -0,0 +1,26 @@
#!@bash@
IFS=:
newLoadPath=()
added=
if [[ -n $EMACSLOADPATH ]]
then
while read -rd: entry
do
if [[ -z $entry && -z $added ]]
then
newLoadPath+=(@wrapperSiteLisp@)
added=1
fi
newLoadPath+=("$entry")
done <<< "$EMACSLOADPATH:"
else
newLoadPath+=(@wrapperSiteLisp@)
newLoadPath+=("")
fi
export EMACSLOADPATH="${newLoadPath[*]}"
exec @prog@ "$@"