emacs: Add comp-eln-load-path infrastructure
This commit is contained in:
@@ -60,10 +60,13 @@ stdenv.mkDerivation ({
|
||||
|
||||
LIBRARY_PATH = "${lib.getLib stdenv.cc.libc}/lib";
|
||||
|
||||
postInstall = ''
|
||||
find $out/share/emacs -type f -name '*.el' -print0 | xargs -0 -n 1 -I {} -P $NIX_BUILD_CORES sh -c "emacs --batch -f batch-native-compile {} || true"
|
||||
'';
|
||||
addEmacsNativeLoadPath = true;
|
||||
|
||||
postInstall = ''
|
||||
find $out/share/emacs -type f -name '*.el' -print0 \
|
||||
| xargs -0 -n 1 -I {} -P $NIX_BUILD_CORES sh -c \
|
||||
"emacs --batch --eval=\"(add-to-list 'comp-eln-load-path \\\"$out/share/emacs/native-lisp/\\\")\" -f batch-native-compile {} || true"
|
||||
'';
|
||||
}
|
||||
|
||||
// removeAttrs args [ "buildInputs" "packageRequires"
|
||||
|
||||
@@ -7,9 +7,20 @@ addToEmacsLoadPath() {
|
||||
fi
|
||||
}
|
||||
|
||||
addToEmacsNativeLoadPath() {
|
||||
local nativeDir="$1"
|
||||
if [[ -d $nativeDir && ${EMACSNATIVELOADPATH-} != *"$nativeDir":* ]]; then
|
||||
export EMACSNATIVELOADPATH="$nativeDir:${EMACSNATIVELOADPATH-}"
|
||||
fi
|
||||
}
|
||||
|
||||
addEmacsVars () {
|
||||
addToEmacsLoadPath "$1/share/emacs/site-lisp"
|
||||
|
||||
if [ -n "${addEmacsNativeLoadPath:-}" ]; then
|
||||
addToEmacsNativeLoadPath "$1/share/emacs/native-lisp"
|
||||
fi
|
||||
|
||||
# Add sub paths to the Emacs load path if it is a directory
|
||||
# containing .el files. This is necessary to build some packages,
|
||||
# e.g., using trivialBuild.
|
||||
|
||||
@@ -34,7 +34,15 @@ in customEmacsPackages.emacsWithPackages (epkgs: [ epkgs.evil epkgs.magit ])
|
||||
|
||||
{ lib, lndir, makeWrapper, runCommand }: self:
|
||||
|
||||
with lib; let inherit (self) emacs; in
|
||||
with lib;
|
||||
|
||||
let
|
||||
|
||||
inherit (self) emacs;
|
||||
|
||||
nativeComp = emacs.nativeComp or false;
|
||||
|
||||
in
|
||||
|
||||
packagesFun: # packages explicitly requested by the user
|
||||
|
||||
@@ -95,6 +103,9 @@ runCommand
|
||||
}
|
||||
mkdir -p $out/bin
|
||||
mkdir -p $out/share/emacs/site-lisp
|
||||
${optionalString emacs.nativeComp ''
|
||||
mkdir -p $out/share/emacs/native-lisp
|
||||
''}
|
||||
|
||||
local requires
|
||||
for pkg in $explicitRequires; do
|
||||
@@ -116,6 +127,9 @@ runCommand
|
||||
linkEmacsPackage() {
|
||||
linkPath "$1" "bin" "bin"
|
||||
linkPath "$1" "share/emacs/site-lisp" "share/emacs/site-lisp"
|
||||
${optionalString nativeComp ''
|
||||
linkPath "$1" "share/emacs/native-lisp" "share/emacs/native-lisp"
|
||||
''}
|
||||
}
|
||||
|
||||
# Iterate over the array of inputs (avoiding nix's own interpolation)
|
||||
@@ -138,12 +152,21 @@ runCommand
|
||||
(load-file "$emacs/share/emacs/site-lisp/site-start.el")
|
||||
(add-to-list 'load-path "$out/share/emacs/site-lisp")
|
||||
(add-to-list 'exec-path "$out/bin")
|
||||
${optionalString nativeComp ''
|
||||
(add-to-list 'comp-eln-load-path "$out/share/emacs/native-lisp/")
|
||||
''}
|
||||
EOF
|
||||
# Link subdirs.el from the emacs distribution
|
||||
ln -s $emacs/share/emacs/site-lisp/subdirs.el -T $subdirs
|
||||
|
||||
# Byte-compiling improves start-up time only slightly, but costs nothing.
|
||||
$emacs/bin/emacs --batch -f batch-byte-compile "$siteStart" "$subdirs"
|
||||
|
||||
${optionalString nativeComp ''
|
||||
$emacs/bin/emacs --batch \
|
||||
--eval "(add-to-list 'comp-eln-load-path \"$out/share/emacs/native-lisp/\")" \
|
||||
-f batch-native-compile "$siteStart" "$subdirs"
|
||||
''}
|
||||
'';
|
||||
|
||||
inherit (emacs) meta;
|
||||
@@ -159,8 +182,14 @@ runCommand
|
||||
substitute ${./wrapper.sh} $out/bin/$progname \
|
||||
--subst-var-by bash ${emacs.stdenv.shell} \
|
||||
--subst-var-by wrapperSiteLisp "$deps/share/emacs/site-lisp" \
|
||||
--subst-var-by wrapperSiteLispNative "$deps/share/emacs/native-lisp:" \
|
||||
--subst-var prog
|
||||
chmod +x $out/bin/$progname
|
||||
|
||||
makeWrapper "$prog" "$out/bin/$progname" \
|
||||
--suffix EMACSLOADPATH ":" "$deps/share/emacs/site-lisp:" \
|
||||
--suffix EMACSNATIVELOADPATH ":" "$deps/share/emacs/native-lisp:"
|
||||
|
||||
done
|
||||
|
||||
# Wrap MacOS app
|
||||
@@ -173,11 +202,16 @@ runCommand
|
||||
$emacs/Applications/Emacs.app/Contents/Resources \
|
||||
$out/Applications/Emacs.app/Contents
|
||||
|
||||
|
||||
substitute ${./wrapper.sh} $out/Applications/Emacs.app/Contents/MacOS/Emacs \
|
||||
--subst-var-by bash ${emacs.stdenv.shell} \
|
||||
--subst-var-by wrapperSiteLisp "$deps/share/emacs/site-lisp" \
|
||||
--subst-var-by prog "$emacs/Applications/Emacs.app/Contents/MacOS/Emacs"
|
||||
chmod +x $out/Applications/Emacs.app/Contents/MacOS/Emacs
|
||||
|
||||
makeWrapper $emacs/Applications/Emacs.app/Contents/MacOS/Emacs $out/Applications/Emacs.app/Contents/MacOS/Emacs \
|
||||
--suffix EMACSLOADPATH ":" "$deps/share/emacs/site-lisp:" \
|
||||
--suffix EMACSNATIVELOADPATH ":" "$deps/share/emacs/native-lisp:"
|
||||
fi
|
||||
|
||||
mkdir -p $out/share
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
IFS=:
|
||||
|
||||
newLoadPath=()
|
||||
newNativeLoadPath=()
|
||||
added=
|
||||
|
||||
if [[ -n $EMACSLOADPATH ]]
|
||||
@@ -21,7 +22,26 @@ else
|
||||
newLoadPath+=("")
|
||||
fi
|
||||
|
||||
if [[ -n $EMACSNATIVELOADPATH ]]
|
||||
then
|
||||
while read -rd: entry
|
||||
do
|
||||
if [[ -z $entry && -z $added ]]
|
||||
then
|
||||
newNativeLoadPath+=(@wrapperSiteLispNative@)
|
||||
added=1
|
||||
fi
|
||||
newNativeLoadPath+=("$entry")
|
||||
done <<< "$EMACSNATIVELOADPATH:"
|
||||
else
|
||||
newNativeLoadPath+=(@wrapperSiteLispNative@)
|
||||
newNativeLoadPath+=("")
|
||||
fi
|
||||
|
||||
export EMACSLOADPATH="${newLoadPath[*]}"
|
||||
export emacsWithPackages_siteLisp=@wrapperSiteLisp@
|
||||
|
||||
export EMACSNATIVELOADPATH="${newNativeLoadPath[*]}"
|
||||
export emacsWithPackages_siteLispNative=@wrapperSiteLispNative@
|
||||
|
||||
exec @prog@ "$@"
|
||||
|
||||
Reference in New Issue
Block a user