summaryrefslogtreecommitdiffstats
path: root/pkgs/build-support/emacs
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/build-support/emacs')
-rw-r--r--pkgs/build-support/emacs/generic.nix7
-rw-r--r--pkgs/build-support/emacs/setup-hook.sh11
-rw-r--r--pkgs/build-support/emacs/wrapper.nix42
-rw-r--r--pkgs/build-support/emacs/wrapper.sh20
4 files changed, 74 insertions, 6 deletions
diff --git a/pkgs/build-support/emacs/generic.nix b/pkgs/build-support/emacs/generic.nix
index 956787ad59e4..588699517baf 100644
--- a/pkgs/build-support/emacs/generic.nix
+++ b/pkgs/build-support/emacs/generic.nix
@@ -60,10 +60,13 @@ stdenv.mkDerivation ({
LIBRARY_PATH = "${lib.getLib stdenv.cc.libc}/lib";
+ 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 -f batch-native-compile {} || true"
+ 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"
diff --git a/pkgs/build-support/emacs/setup-hook.sh b/pkgs/build-support/emacs/setup-hook.sh
index 83e995631b3e..f6f2331b8e02 100644
--- a/pkgs/build-support/emacs/setup-hook.sh
+++ b/pkgs/build-support/emacs/setup-hook.sh
@@ -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.
diff --git a/pkgs/build-support/emacs/wrapper.nix b/pkgs/build-support/emacs/wrapper.nix
index a3ab30afc632..eca80ecf0afb 100644
--- a/pkgs/build-support/emacs/wrapper.nix
+++ b/pkgs/build-support/emacs/wrapper.nix
@@ -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 "$emacs/Applications/Emacs.app/Contents/MacOS/Emacs" \
- --subst-var prog
- chmod +x $out/bin/$progname
+ --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
diff --git a/pkgs/build-support/emacs/wrapper.sh b/pkgs/build-support/emacs/wrapper.sh
index 96c9a8a60ea4..e8eecb8c8696 100644
--- a/pkgs/build-support/emacs/wrapper.sh
+++ b/pkgs/build-support/emacs/wrapper.sh
@@ -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@ "$@"