diff options
Diffstat (limited to 'pkgs/build-support/emacs/wrapper.nix')
-rw-r--r-- | pkgs/build-support/emacs/wrapper.nix | 209 |
1 files changed, 106 insertions, 103 deletions
diff --git a/pkgs/build-support/emacs/wrapper.nix b/pkgs/build-support/emacs/wrapper.nix index b242672df10..25f068cd3fa 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, lndir, makeWrapper, runCommand, stdenv }: self: +{ lib, lndir, makeWrapper, runCommand }: self: with lib; let inherit (self) emacs; in @@ -45,105 +45,110 @@ let else packagesFun; in -stdenv.mkDerivation { - name = (appendToName "with-packages" emacs).name; - nativeBuildInputs = [ emacs lndir makeWrapper ]; - inherit emacs explicitRequires; - - # Store all paths we want to add to emacs here, so that we only need to add - # one path to the load lists - deps = runCommand "emacs-packages-deps" - { inherit explicitRequires lndir emacs; } - '' - findInputsOld() { - local pkg="$1"; shift - local var="$1"; shift - local propagatedBuildInputsFiles=("$@") - - # TODO(@Ericson2314): Restore using associative array once Darwin - # nix-shell doesn't use impure bash. This should replace the O(n) - # case with an O(1) hash map lookup, assuming bash is implemented - # well :D. - local varSlice="$var[*]" - # ''${..-} to hack around old bash empty array problem - case "''${!varSlice-}" in - *" $pkg "*) return 0 ;; - esac - unset -v varSlice - - eval "$var"'+=("$pkg")' - - if ! [ -e "$pkg" ]; then - echo "build input $pkg does not exist" >&2 - exit 1 - fi - - local file - for file in "''${propagatedBuildInputsFiles[@]}"; do - file="$pkg/nix-support/$file" - [[ -f "$file" ]] || continue - - local pkgNext - for pkgNext in $(< "$file"); do - findInputsOld "$pkgNext" "$var" "''${propagatedBuildInputsFiles[@]}" - done - done - } - mkdir -p $out/bin - mkdir -p $out/share/emacs/site-lisp - - local requires - for pkg in $explicitRequires; do - findInputsOld $pkg requires propagated-user-env-packages - done - # requires now holds all requested packages and their transitive dependencies - - linkPath() { - local pkg=$1 - local origin_path=$2 - local dest_path=$3 - - # Add the path to the search path list, but only if it exists - if [[ -d "$pkg/$origin_path" ]]; then - $lndir/bin/lndir -silent "$pkg/$origin_path" "$out/$dest_path" - fi - } - - linkEmacsPackage() { - linkPath "$1" "bin" "bin" - linkPath "$1" "share/emacs/site-lisp" "share/emacs/site-lisp" - } - - # Iterate over the array of inputs (avoiding nix's own interpolation) - for pkg in "''${requires[@]}"; do - linkEmacsPackage $pkg - done - - siteStart="$out/share/emacs/site-lisp/site-start.el" - siteStartByteCompiled="$siteStart"c - subdirs="$out/share/emacs/site-lisp/subdirs.el" - subdirsByteCompiled="$subdirs"c - - # A dependency may have brought the original siteStart or subdirs, delete - # it and create our own - # 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. - rm -f $siteStart $siteStartByteCompiled $subdirs $subdirsByteCompiled - cat >"$siteStart" <<EOF -(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") -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" - ''; - - phases = [ "installPhase" ]; - installPhase = '' +runCommand + (appendToName "with-packages" emacs).name + { + nativeBuildInputs = [ emacs lndir makeWrapper ]; + inherit emacs explicitRequires; + + preferLocalBuild = true; + allowSubstitutes = false; + + # Store all paths we want to add to emacs here, so that we only need to add + # one path to the load lists + deps = runCommand "emacs-packages-deps" + { inherit explicitRequires lndir emacs; } + '' + findInputsOld() { + local pkg="$1"; shift + local var="$1"; shift + local propagatedBuildInputsFiles=("$@") + + # TODO(@Ericson2314): Restore using associative array once Darwin + # nix-shell doesn't use impure bash. This should replace the O(n) + # case with an O(1) hash map lookup, assuming bash is implemented + # well :D. + local varSlice="$var[*]" + # ''${..-} to hack around old bash empty array problem + case "''${!varSlice-}" in + *" $pkg "*) return 0 ;; + esac + unset -v varSlice + + eval "$var"'+=("$pkg")' + + if ! [ -e "$pkg" ]; then + echo "build input $pkg does not exist" >&2 + exit 1 + fi + + local file + for file in "''${propagatedBuildInputsFiles[@]}"; do + file="$pkg/nix-support/$file" + [[ -f "$file" ]] || continue + + local pkgNext + for pkgNext in $(< "$file"); do + findInputsOld "$pkgNext" "$var" "''${propagatedBuildInputsFiles[@]}" + done + done + } + mkdir -p $out/bin + mkdir -p $out/share/emacs/site-lisp + + local requires + for pkg in $explicitRequires; do + findInputsOld $pkg requires propagated-user-env-packages + done + # requires now holds all requested packages and their transitive dependencies + + linkPath() { + local pkg=$1 + local origin_path=$2 + local dest_path=$3 + + # Add the path to the search path list, but only if it exists + if [[ -d "$pkg/$origin_path" ]]; then + $lndir/bin/lndir -silent "$pkg/$origin_path" "$out/$dest_path" + fi + } + + linkEmacsPackage() { + linkPath "$1" "bin" "bin" + linkPath "$1" "share/emacs/site-lisp" "share/emacs/site-lisp" + } + + # Iterate over the array of inputs (avoiding nix's own interpolation) + for pkg in "''${requires[@]}"; do + linkEmacsPackage $pkg + done + + siteStart="$out/share/emacs/site-lisp/site-start.el" + siteStartByteCompiled="$siteStart"c + subdirs="$out/share/emacs/site-lisp/subdirs.el" + subdirsByteCompiled="$subdirs"c + + # A dependency may have brought the original siteStart or subdirs, delete + # it and create our own + # 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. + rm -f $siteStart $siteStartByteCompiled $subdirs $subdirsByteCompiled + cat >"$siteStart" <<EOF + (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") + 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" + ''; + + inherit (emacs) meta; + } + '' mkdir -p "$out/bin" # Wrap emacs and friends so they find our site-start.el before the original. @@ -172,6 +177,4 @@ EOF for dir in applications icons info man; do ln -s $emacs/share/$dir $out/share/$dir done - ''; - inherit (emacs) meta; -} + '' |