emacsWithPackages: move bin and site-lisp to private share directory

This is to avoid unwanted side effects when installing a wrapped emacs in the environment:

  * All executables in the dependencies become available in the user environment
  * All site-lisp binaries in the dependencies become accessible to unwrapped emacs

Also, both bin and site-lisp would generate conflicts so installing a wrapped emacs becomes really cumbersome
This commit is contained in:
Samuel Rivas 2016-04-03 21:11:38 +02:00
parent c68c0a3c7c
commit 2b199537b7

View File

@ -52,7 +52,8 @@ stdenv.mkDerivation {
phases = [ "installPhase" ]; phases = [ "installPhase" ];
installPhase = '' installPhase = ''
mkdir -p $out/bin mkdir -p $out/bin
mkdir -p $out/share/emacs/site-lisp mkdir -p $out/share/emacs-with-packages/bin
mkdir -p $out/share/emacs-with-packages/site-lisp
local requires local requires
for pkg in $explicitRequires; do for pkg in $explicitRequires; do
@ -60,29 +61,32 @@ stdenv.mkDerivation {
done done
# requires now holds all requested packages and their transitive dependencies # requires now holds all requested packages and their transitive dependencies
siteStart="$out/share/emacs/site-lisp/site-start.el" siteStart="$out/share/emacs-with-packages/site-lisp/site-start.el"
# Begin the new site-start.el by loading the original, which sets some # 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 # 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. # they are specified in, so user and system profile paths are searched last.
cat >"$siteStart" <<EOF cat >"$siteStart" <<EOF
(load-file "$emacs/share/emacs/site-lisp/site-start.el") (load-file "$emacs/share/emacs/site-lisp/site-start.el")
(add-to-list 'load-path "$out/share/emacs/site-lisp") (add-to-list 'load-path "$out/share/emacs-with-packages/site-lisp")
(add-to-list 'exec-path "$out/share/emacs-with-packages/bin")
EOF EOF
linkPath() { linkPath() {
local pkg=$1 local pkg=$1
local path=$2 local origin_path=$2
local dest_path=$3
# Add the path to the search path list, but only if it exists # Add the path to the search path list, but only if it exists
if [[ -d "$pkg/$path" ]]; then if [[ -d "$pkg/$origin_path" ]]; then
lndir -silent "$pkg/$path" "$out/$path" lndir -silent "$pkg/$origin_path" "$out/$dest_path"
fi fi
} }
# Add a package's paths to site-start.el # Add a package's paths to site-start.el
linkEmacsPackage() { linkEmacsPackage() {
linkPath "$1" "bin" linkPath "$1" "bin" "share/emacs-with-packages/bin"
linkPath "$1" "share/emacs/site-lisp" linkPath "$1" "share/emacs/site-lisp" "share/emacs-with-packages/site-lisp"
} }
# First, link all the explicitly-required packages. # First, link all the explicitly-required packages.
@ -103,7 +107,7 @@ EOF
local progname=$(basename "$prog") local progname=$(basename "$prog")
rm -f "$out/bin/$progname" rm -f "$out/bin/$progname"
makeWrapper "$prog" "$out/bin/$progname" \ makeWrapper "$prog" "$out/bin/$progname" \
--suffix EMACSLOADPATH ":" "$out/share/emacs/site-lisp:" --suffix EMACSLOADPATH ":" "$out/share/emacs-with-packages/site-lisp:"
done done
mkdir -p $out/share mkdir -p $out/share