summary refs log tree commit diff
path: root/pkgs/build-support/emacs
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@gmail.com>2016-01-20 12:53:11 -0600
committerThomas Tuegel <ttuegel@gmail.com>2016-01-20 12:53:11 -0600
commit32c30411cfbb6e26512a299fe4830bed05b67b3e (patch)
tree5e8fb724228665001c71447aa78a9f46febd61df /pkgs/build-support/emacs
parent2b1024646b42958a874446ec7155cc6c6b247d78 (diff)
downloadnixpkgs-32c30411cfbb6e26512a299fe4830bed05b67b3e.tar
nixpkgs-32c30411cfbb6e26512a299fe4830bed05b67b3e.tar.gz
nixpkgs-32c30411cfbb6e26512a299fe4830bed05b67b3e.tar.bz2
nixpkgs-32c30411cfbb6e26512a299fe4830bed05b67b3e.tar.lz
nixpkgs-32c30411cfbb6e26512a299fe4830bed05b67b3e.tar.xz
nixpkgs-32c30411cfbb6e26512a299fe4830bed05b67b3e.tar.zst
nixpkgs-32c30411cfbb6e26512a299fe4830bed05b67b3e.zip
emacsWithPackages: link packages into single load-path
This should provide a small speed improvement by avoiding having to set
hundreds of load-paths.
Diffstat (limited to 'pkgs/build-support/emacs')
-rw-r--r--pkgs/build-support/emacs/wrapper.nix58
1 files changed, 29 insertions, 29 deletions
diff --git a/pkgs/build-support/emacs/wrapper.nix b/pkgs/build-support/emacs/wrapper.nix
index ad1a54886a6..efee43d852e 100644
--- a/pkgs/build-support/emacs/wrapper.nix
+++ b/pkgs/build-support/emacs/wrapper.nix
@@ -32,7 +32,7 @@ in customEmacsPackages.emacsWithPackages (epkgs: [ epkgs.evil epkgs.magit ])
 
 */
 
-{ lib, makeWrapper, stdenv }: self:
+{ lib, lndir, makeWrapper, stdenv }: self:
 
 with lib; let inherit (self) emacs; in
 
@@ -47,10 +47,13 @@ in
 
 stdenv.mkDerivation {
   name = (appendToName "with-packages" emacs).name;
-  nativeBuildInputs = [ emacs makeWrapper ];
+  nativeBuildInputs = [ emacs lndir makeWrapper ];
   inherit emacs explicitRequires;
   phases = [ "installPhase" ];
   installPhase = ''
+    mkdir -p $out/bin
+    mkdir -p $out/share/emacs/site-lisp
+
     local requires
     for pkg in $explicitRequires; do
       findInputs $pkg requires propagated-user-env-packages
@@ -59,50 +62,47 @@ stdenv.mkDerivation {
 
     siteStart="$out/share/emacs/site-lisp/site-start.el"
 
-    addEmacsPath() {
-      local list=$1
+    # Begin the new site-start.el by loading the original, which sets some
+    # NixOS-specific paths. Paths are searched in the reverse of the order
+    # they are specified in, so user and system profile paths are searched last.
+    cat >"$siteStart" <<EOF
+(load-file "$emacs/share/emacs/site-lisp/site-start.el")
+(add-to-list 'load-path "$out/share/emacs/site-lisp")
+EOF
+
+    linkPath() {
+      local pkg=$1
       local path=$2
       # Add the path to the search path list, but only if it exists
-      if [[ -d "$path" ]]; then
-        echo "(add-to-list '$list \"$path\")" >>"$siteStart"
+      if [[ -d "$pkg/$path" ]]; then
+        lndir -silent "$pkg/$path" "$out/$path"
       fi
     }
 
     # Add a package's paths to site-start.el
-    addEmacsPackage() {
-      addEmacsPath "exec-path" "$1/bin"
-      addEmacsPath "load-path" "$1/share/emacs/site-lisp"
+    linkEmacsPackage() {
+      linkPath "$1" "bin"
+      linkPath "$1" "share/emacs/site-lisp"
     }
 
-    mkdir -p $out/share/emacs/site-lisp
-    # Begin the new site-start.el by loading the original, which sets some
-    # NixOS-specific paths. Paths are searched in the reverse of the order
-    # they are specified in, so user and system profile paths are searched last.
-    echo "(load-file \"$emacs/share/emacs/site-lisp/site-start.el\")" >"$siteStart"
-
-    # Set paths for the dependencies of the requested packages. These paths are
-    # searched before the profile paths, but after the explicitly-required paths.
-    for pkg in $requires; do
-      # The explicitly-required packages are also in the list, but we will add
-      # those paths last.
-      if ! ( echo "$explicitRequires" | grep "$pkg" >/dev/null ) ; then
-        addEmacsPackage $pkg
-      fi
+    # First, link all the explicitly-required packages.
+    for pkg in $explicitRequires; do
+      linkEmacsPackage $pkg
     done
 
-    # Finally, add paths for all the explicitly-required packages. These paths
-    # will be searched first.
-    for pkg in $explicitRequires; do
-      addEmacsPackage $pkg
+    # Next, link all the dependencies.
+    for pkg in $requires; do
+      linkEmacsPackage $pkg
     done
 
     # Byte-compiling improves start-up time only slightly, but costs nothing.
     emacs --batch -f batch-byte-compile "$siteStart"
 
-    mkdir -p $out/bin
     # Wrap emacs and friends so they find our site-start.el before the original.
     for prog in $emacs/bin/*; do # */
-      makeWrapper "$prog" $out/bin/$(basename "$prog") \
+      local progname=$(basename "$prog")
+      rm -f "$out/bin/$progname"
+      makeWrapper "$prog" "$out/bin/$progname" \
         --suffix EMACSLOADPATH ":" "$out/share/emacs/site-lisp:"
     done