uboot: (firmwareOdroidC2/C4) don't invoke patch tool, use patches = [] instead
https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh#L948 this can do it nicely. Signed-off-by: Anton Arapov <anton@deadbeef.mx>
This commit is contained in:
commit
56de2bcd43
30691 changed files with 3076956 additions and 0 deletions
79
pkgs/build-support/emacs/buffer.nix
Normal file
79
pkgs/build-support/emacs/buffer.nix
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
# Functions to build elisp files to locally configure emcas buffers.
|
||||
# See https://github.com/shlevy/nix-buffer
|
||||
|
||||
{ lib, writeText, inherit-local }:
|
||||
|
||||
rec {
|
||||
withPackages = pkgs': let
|
||||
pkgs = builtins.filter (x: x != null) pkgs';
|
||||
extras = map (x: x.emacsBufferSetup pkgs) (builtins.filter (builtins.hasAttr "emacsBufferSetup") pkgs);
|
||||
in writeText "dir-locals.el" ''
|
||||
(require 'inherit-local "${inherit-local}/share/emacs/site-lisp/elpa/inherit-local-${inherit-local.version}/inherit-local.elc")
|
||||
|
||||
; Only set up nixpkgs buffer handling when we have some buffers active
|
||||
(defvar nixpkgs--buffer-count 0)
|
||||
(when (eq nixpkgs--buffer-count 0)
|
||||
(make-variable-buffer-local 'nixpkgs--is-nixpkgs-buffer)
|
||||
; When generating a new temporary buffer (one whose name starts with a space), do inherit-local inheritance and make it a nixpkgs buffer
|
||||
(defun nixpkgs--around-generate (orig name)
|
||||
(if (and nixpkgs--is-nixpkgs-buffer (eq (aref name 0) ?\s))
|
||||
(let ((buf (funcall orig name)))
|
||||
(progn
|
||||
(inherit-local-inherit-child buf)
|
||||
(with-current-buffer buf
|
||||
(setq nixpkgs--buffer-count (1+ nixpkgs--buffer-count))
|
||||
(add-hook 'kill-buffer-hook 'nixpkgs--decrement-buffer-count nil t)))
|
||||
buf)
|
||||
(funcall orig name)))
|
||||
(advice-add 'generate-new-buffer :around #'nixpkgs--around-generate)
|
||||
; When we have no more nixpkgs buffers, tear down the buffer handling
|
||||
(defun nixpkgs--decrement-buffer-count ()
|
||||
(setq nixpkgs--buffer-count (1- nixpkgs--buffer-count))
|
||||
(when (eq nixpkgs--buffer-count 0)
|
||||
(advice-remove 'generate-new-buffer #'nixpkgs--around-generate)
|
||||
(fmakunbound 'nixpkgs--around-generate)
|
||||
(fmakunbound 'nixpkgs--decrement-buffer-count))))
|
||||
(setq nixpkgs--buffer-count (1+ nixpkgs--buffer-count))
|
||||
(add-hook 'kill-buffer-hook 'nixpkgs--decrement-buffer-count nil t)
|
||||
|
||||
; Add packages to PATH and exec-path
|
||||
(make-local-variable 'process-environment)
|
||||
(put 'process-environment 'permanent-local t)
|
||||
(inherit-local 'process-environment)
|
||||
; setenv modifies in place, so copy the environment first
|
||||
(setq process-environment (copy-tree process-environment))
|
||||
(setenv "PATH" (concat "${lib.makeSearchPath "bin" pkgs}:" (getenv "PATH")))
|
||||
(inherit-local-permanent exec-path (append '(${builtins.concatStringsSep " " (map (p: "\"${p}/bin\"") pkgs)}) exec-path))
|
||||
|
||||
(inherit-local-permanent eshell-path-env (concat "${lib.makeSearchPath "bin" pkgs}:" eshell-path-env))
|
||||
|
||||
(setq nixpkgs--is-nixpkgs-buffer t)
|
||||
(inherit-local 'nixpkgs--is-nixpkgs-buffer)
|
||||
|
||||
${lib.concatStringsSep "\n" extras}
|
||||
'';
|
||||
# nix-buffer function for a project with a bunch of haskell packages
|
||||
# in one directory
|
||||
haskellMonoRepo = { project-root # The monorepo root
|
||||
, haskellPackages # The composed haskell packages set that contains all of the packages
|
||||
}: { root }:
|
||||
let # The haskell paths.
|
||||
haskell-paths = lib.filesystem.haskellPathsInDir project-root;
|
||||
# Find the haskell package that the 'root' is in, if any.
|
||||
haskell-path-parent =
|
||||
let filtered = builtins.filter (name:
|
||||
lib.hasPrefix (toString (project-root + "/${name}")) (toString root)
|
||||
) (builtins.attrNames haskell-paths);
|
||||
in
|
||||
if filtered == [] then null else builtins.head filtered;
|
||||
# We're in the directory of a haskell package
|
||||
is-haskell-package = haskell-path-parent != null;
|
||||
haskell-package = haskellPackages.${haskell-path-parent};
|
||||
# GHC environment with all needed deps for the haskell package
|
||||
haskell-package-env =
|
||||
builtins.head haskell-package.env.nativeBuildInputs;
|
||||
in
|
||||
if is-haskell-package
|
||||
then withPackages [ haskell-package-env ]
|
||||
else {};
|
||||
}
|
||||
41
pkgs/build-support/emacs/elpa.nix
Normal file
41
pkgs/build-support/emacs/elpa.nix
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
# builder for Emacs packages built for packages.el
|
||||
|
||||
{ lib, stdenv, emacs, texinfo, writeText, gcc }:
|
||||
|
||||
with lib;
|
||||
|
||||
{ pname
|
||||
, version
|
||||
, src
|
||||
, meta ? {}
|
||||
, ...
|
||||
}@args:
|
||||
|
||||
let
|
||||
|
||||
defaultMeta = {
|
||||
homepage = args.src.meta.homepage or "https://elpa.gnu.org/packages/${pname}.html";
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
import ./generic.nix { inherit lib stdenv emacs texinfo writeText gcc; } ({
|
||||
|
||||
dontUnpack = true;
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
emacs --batch -Q -l ${./elpa2nix.el} \
|
||||
-f elpa2nix-install-package \
|
||||
"$src" "$out/share/emacs/site-lisp/elpa"
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
meta = defaultMeta // meta;
|
||||
}
|
||||
|
||||
// removeAttrs args [ "files" "fileSpecs"
|
||||
"meta"
|
||||
])
|
||||
33
pkgs/build-support/emacs/elpa2nix.el
Normal file
33
pkgs/build-support/emacs/elpa2nix.el
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
(require 'package)
|
||||
(package-initialize)
|
||||
|
||||
(defun elpa2nix-install-package ()
|
||||
(if (not noninteractive)
|
||||
(error "`elpa2nix-install-package' is to be used only with -batch"))
|
||||
(pcase command-line-args-left
|
||||
(`(,archive ,elpa)
|
||||
(progn (setq package-user-dir elpa)
|
||||
(elpa2nix-install-file archive)))))
|
||||
|
||||
(defun elpa2nix-install-from-buffer ()
|
||||
"Install a package from the current buffer."
|
||||
(let ((pkg-desc (if (derived-mode-p 'tar-mode)
|
||||
(package-tar-file-info)
|
||||
(package-buffer-info))))
|
||||
;; Install the package itself.
|
||||
(package-unpack pkg-desc)
|
||||
pkg-desc))
|
||||
|
||||
(defun elpa2nix-install-file (file)
|
||||
"Install a package from a file.
|
||||
The file can either be a tar file or an Emacs Lisp file."
|
||||
(let ((is-tar (string-match "\\.tar\\'" file)))
|
||||
(with-temp-buffer
|
||||
(if is-tar
|
||||
(insert-file-contents-literally file)
|
||||
(insert-file-contents file))
|
||||
(when is-tar (tar-mode))
|
||||
(elpa2nix-install-from-buffer))))
|
||||
|
||||
;; Allow installing package tarfiles larger than 10MB
|
||||
(setq large-file-warning-threshold nil)
|
||||
34
pkgs/build-support/emacs/emacs-funcs.sh
Normal file
34
pkgs/build-support/emacs/emacs-funcs.sh
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
addToEmacsLoadPath() {
|
||||
local lispDir="$1"
|
||||
if [[ -d $lispDir && ${EMACSLOADPATH-} != *"$lispDir":* ]] ; then
|
||||
# It turns out, that the trailing : is actually required
|
||||
# see https://www.gnu.org/software/emacs/manual/html_node/elisp/Library-Search.html
|
||||
export EMACSLOADPATH="$lispDir:${EMACSLOADPATH-}"
|
||||
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.
|
||||
for lispDir in \
|
||||
"$1/share/emacs/site-lisp/"* \
|
||||
"$1/share/emacs/site-lisp/elpa/"*; do
|
||||
if [[ -d $lispDir && "$(echo "$lispDir"/*.el)" ]] ; then
|
||||
addToEmacsLoadPath "$lispDir"
|
||||
fi
|
||||
done
|
||||
}
|
||||
95
pkgs/build-support/emacs/generic.nix
Normal file
95
pkgs/build-support/emacs/generic.nix
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
# generic builder for Emacs packages
|
||||
|
||||
{ lib, stdenv, emacs, texinfo, writeText, gcc, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
{ pname
|
||||
, version ? null
|
||||
|
||||
, buildInputs ? []
|
||||
, packageRequires ? []
|
||||
|
||||
, meta ? {}
|
||||
|
||||
, ...
|
||||
}@args:
|
||||
|
||||
let
|
||||
|
||||
defaultMeta = {
|
||||
broken = false;
|
||||
platforms = emacs.meta.platforms;
|
||||
} // optionalAttrs ((args.src.meta.homepage or "") != "") {
|
||||
homepage = args.src.meta.homepage;
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
stdenv.mkDerivation ({
|
||||
name = "emacs-${pname}${optionalString (version != null) "-${version}"}";
|
||||
|
||||
unpackCmd = ''
|
||||
case "$curSrc" in
|
||||
*.el)
|
||||
# keep original source filename without the hash
|
||||
local filename=$(basename "$curSrc")
|
||||
filename="''${filename:33}"
|
||||
cp $curSrc $filename
|
||||
chmod +w $filename
|
||||
sourceRoot="."
|
||||
;;
|
||||
*)
|
||||
_defaultUnpack "$curSrc"
|
||||
;;
|
||||
esac
|
||||
'';
|
||||
|
||||
buildInputs = [emacs texinfo] ++ packageRequires ++ buildInputs;
|
||||
propagatedBuildInputs = packageRequires;
|
||||
propagatedUserEnvPkgs = packageRequires;
|
||||
|
||||
setupHook = writeText "setup-hook.sh" ''
|
||||
source ${./emacs-funcs.sh}
|
||||
|
||||
if [[ ! -v emacsHookDone ]]; then
|
||||
emacsHookDone=1
|
||||
|
||||
# If this is for a wrapper derivation, emacs and the dependencies are all
|
||||
# run-time dependencies. If this is for precompiling packages into bytecode,
|
||||
# emacs is a compile-time dependency of the package.
|
||||
addEnvHooks "$hostOffset" addEmacsVars
|
||||
addEnvHooks "$targetOffset" addEmacsVars
|
||||
fi
|
||||
'';
|
||||
|
||||
doCheck = false;
|
||||
|
||||
meta = defaultMeta // meta;
|
||||
}
|
||||
|
||||
// lib.optionalAttrs (emacs.nativeComp or false) {
|
||||
|
||||
LIBRARY_PATH = "${lib.getLib stdenv.cc.libc}/lib";
|
||||
|
||||
nativeBuildInputs = [ gcc ];
|
||||
|
||||
addEmacsNativeLoadPath = true;
|
||||
|
||||
postInstall = ''
|
||||
# Besides adding the output directory to the native load path, make sure
|
||||
# the current package's elisp files are in the load path, otherwise
|
||||
# (require 'file-b) from file-a.el in the same package will fail.
|
||||
mkdir -p $out/share/emacs/native-lisp
|
||||
source ${./emacs-funcs.sh}
|
||||
addEmacsVars "$out"
|
||||
|
||||
find $out/share/emacs -type f -name '*.el' -print0 \
|
||||
| xargs -0 -n 1 -I {} -P $NIX_BUILD_CORES sh -c \
|
||||
"emacs --batch --eval '(setq large-file-warning-threshold nil)' -f batch-native-compile {} || true"
|
||||
'';
|
||||
}
|
||||
|
||||
// removeAttrs args [ "buildInputs" "packageRequires"
|
||||
"meta"
|
||||
])
|
||||
97
pkgs/build-support/emacs/melpa.nix
Normal file
97
pkgs/build-support/emacs/melpa.nix
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
# builder for Emacs packages built for packages.el
|
||||
# using MELPA package-build.el
|
||||
|
||||
{ lib, stdenv, fetchFromGitHub, emacs, texinfo, writeText, gcc }:
|
||||
|
||||
with lib;
|
||||
|
||||
{ /*
|
||||
pname: Nix package name without special symbols and without version or
|
||||
"emacs-" prefix.
|
||||
*/
|
||||
pname
|
||||
/*
|
||||
ename: Original Emacs package name, possibly containing special symbols.
|
||||
*/
|
||||
, ename ? null
|
||||
, version
|
||||
, recipe
|
||||
, meta ? {}
|
||||
, ...
|
||||
}@args:
|
||||
|
||||
let
|
||||
|
||||
defaultMeta = {
|
||||
homepage = args.src.meta.homepage or "https://melpa.org/#/${pname}";
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
import ./generic.nix { inherit lib stdenv emacs texinfo writeText gcc; } ({
|
||||
|
||||
ename =
|
||||
if ename == null
|
||||
then pname
|
||||
else ename;
|
||||
|
||||
packageBuild = fetchFromGitHub {
|
||||
owner = "melpa";
|
||||
repo = "package-build";
|
||||
rev = "35017a2d87376c70c3239f48bdbac7efca85aa10";
|
||||
sha256 = "07hdmam85452v4r2vaabj1qfyami1hgbh0jgj9dcwbkpr0y1gvqj";
|
||||
};
|
||||
|
||||
elpa2nix = ./elpa2nix.el;
|
||||
melpa2nix = ./melpa2nix.el;
|
||||
|
||||
preUnpack = ''
|
||||
mkdir -p "$NIX_BUILD_TOP/recipes"
|
||||
if [ -n "$recipe" ]; then
|
||||
cp "$recipe" "$NIX_BUILD_TOP/recipes/$ename"
|
||||
fi
|
||||
|
||||
ln -s "$packageBuild" "$NIX_BUILD_TOP/package-build"
|
||||
|
||||
mkdir -p "$NIX_BUILD_TOP/packages"
|
||||
'';
|
||||
|
||||
postUnpack = ''
|
||||
mkdir -p "$NIX_BUILD_TOP/working"
|
||||
ln -s "$NIX_BUILD_TOP/$sourceRoot" "$NIX_BUILD_TOP/working/$ename"
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
cd "$NIX_BUILD_TOP"
|
||||
|
||||
emacs --batch -Q \
|
||||
-L "$NIX_BUILD_TOP/package-build" \
|
||||
-l "$melpa2nix" \
|
||||
-f melpa2nix-build-package \
|
||||
$ename $version $commit
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
archive="$NIX_BUILD_TOP/packages/$ename-$version.el"
|
||||
if [ ! -f "$archive" ]; then
|
||||
archive="$NIX_BUILD_TOP/packages/$ename-$version.tar"
|
||||
fi
|
||||
|
||||
emacs --batch -Q \
|
||||
-l "$elpa2nix" \
|
||||
-f elpa2nix-install-package \
|
||||
"$archive" "$out/share/emacs/site-lisp/elpa"
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
meta = defaultMeta // meta;
|
||||
}
|
||||
|
||||
// removeAttrs args [ "meta" ])
|
||||
32
pkgs/build-support/emacs/melpa2nix.el
Normal file
32
pkgs/build-support/emacs/melpa2nix.el
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
(require 'package)
|
||||
(package-initialize)
|
||||
|
||||
(require 'package-recipe)
|
||||
(require 'package-build)
|
||||
|
||||
(setq package-build-working-dir (expand-file-name "working/"))
|
||||
(setq package-build-archive-dir (expand-file-name "packages/"))
|
||||
(setq package-build-recipes-dir (expand-file-name "recipes/"))
|
||||
|
||||
;; Allow installing package tarfiles larger than 10MB
|
||||
(setq large-file-warning-threshold nil)
|
||||
|
||||
(defun melpa2nix-build-package-1 (rcp version commit)
|
||||
(let ((source-dir (package-recipe--working-tree rcp)))
|
||||
(unwind-protect
|
||||
(let ((files (package-build-expand-files-spec rcp t)))
|
||||
(cond
|
||||
((= (length files) 1)
|
||||
(package-build--build-single-file-package
|
||||
rcp version commit files source-dir))
|
||||
((> (length files) 1)
|
||||
(package-build--build-multi-file-package
|
||||
rcp version commit files source-dir))
|
||||
(t (error "Unable to find files matching recipe patterns")))))))
|
||||
|
||||
(defun melpa2nix-build-package ()
|
||||
(if (not noninteractive)
|
||||
(error "`melpa2nix-build-package' is to be used only with -batch"))
|
||||
(pcase command-line-args-left
|
||||
(`(,package ,version ,commit)
|
||||
(melpa2nix-build-package-1 (package-recipe-lookup package) version commit))))
|
||||
6
pkgs/build-support/emacs/mk-wrapper-subdirs.el
Normal file
6
pkgs/build-support/emacs/mk-wrapper-subdirs.el
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
(defmacro mk-subdirs-expr (path)
|
||||
`(setq load-path
|
||||
(delete-dups (append '(,path)
|
||||
',(let ((default-directory path))
|
||||
(normal-top-level-add-subdirs-to-load-path))
|
||||
load-path))))
|
||||
29
pkgs/build-support/emacs/trivial.nix
Normal file
29
pkgs/build-support/emacs/trivial.nix
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# trivial builder for Emacs packages
|
||||
|
||||
{ callPackage, lib, ... }@envargs:
|
||||
|
||||
with lib;
|
||||
|
||||
args:
|
||||
|
||||
callPackage ./generic.nix envargs ({
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
emacs -L . --batch -f batch-byte-compile *.el
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
LISPDIR=$out/share/emacs/site-lisp
|
||||
install -d $LISPDIR
|
||||
install *.el *.elc $LISPDIR
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
}
|
||||
|
||||
// args)
|
||||
241
pkgs/build-support/emacs/wrapper.nix
Normal file
241
pkgs/build-support/emacs/wrapper.nix
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
/*
|
||||
|
||||
# Usage
|
||||
|
||||
`emacs.pkgs.withPackages` takes a single argument: a function from a package
|
||||
set to a list of packages (the packages that will be available in
|
||||
Emacs). For example,
|
||||
```
|
||||
emacs.pkgs.withPackages (epkgs: [ epkgs.evil epkgs.magit ])
|
||||
```
|
||||
All the packages in the list should come from the provided package
|
||||
set. It is possible to add any package to the list, but the provided
|
||||
set is guaranteed to have consistent dependencies and be built with
|
||||
the correct version of Emacs.
|
||||
|
||||
# Overriding
|
||||
|
||||
`emacs.pkgs.withPackages` inherits the package set which contains it, so the
|
||||
correct way to override the provided package set is to override the
|
||||
set which contains `emacs.pkgs.withPackages`. For example, to override
|
||||
`emacs.pkgs.emacs.pkgs.withPackages`,
|
||||
```
|
||||
let customEmacsPackages =
|
||||
emacs.pkgs.overrideScope' (self: super: {
|
||||
# use a custom version of emacs
|
||||
emacs = ...;
|
||||
# use the unstable MELPA version of magit
|
||||
magit = self.melpaPackages.magit;
|
||||
});
|
||||
in customEmacsPackages.withPackages (epkgs: [ epkgs.evil epkgs.magit ])
|
||||
```
|
||||
|
||||
*/
|
||||
|
||||
{ lib, lndir, makeWrapper, runCommand, gcc }: self:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
|
||||
inherit (self) emacs;
|
||||
|
||||
nativeComp = emacs.nativeComp or false;
|
||||
|
||||
in
|
||||
|
||||
packagesFun: # packages explicitly requested by the user
|
||||
|
||||
let
|
||||
explicitRequires =
|
||||
if lib.isFunction packagesFun
|
||||
then packagesFun self
|
||||
else packagesFun;
|
||||
in
|
||||
|
||||
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;
|
||||
nativeBuildInputs = lib.optional nativeComp gcc;
|
||||
}
|
||||
''
|
||||
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
|
||||
${optionalString nativeComp ''
|
||||
mkdir -p $out/share/emacs/native-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"
|
||||
${optionalString nativeComp ''
|
||||
linkPath "$1" "share/emacs/native-lisp" "share/emacs/native-lisp"
|
||||
''}
|
||||
}
|
||||
|
||||
siteAutoloads="$out/share/emacs/site-lisp/nix-generated-autoload.el"
|
||||
touch $siteAutoloads
|
||||
|
||||
# Iterate over the array of inputs (avoiding nix's own interpolation)
|
||||
for pkg in "''${requires[@]}"; do
|
||||
linkEmacsPackage $pkg
|
||||
find $pkg -name "*-autoloads.el" \
|
||||
-exec echo \(load \"{}\" \'noerror \'nomessage\) \; >> $siteAutoloads
|
||||
done
|
||||
echo "(provide 'nix-generated-autoload)" >> $siteAutoloads
|
||||
|
||||
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.
|
||||
#
|
||||
# NOTE: Avoid displaying messages early at startup by binding
|
||||
# inhibit-message to t. This would prevent the Emacs GUI from showing up
|
||||
# prematurely. The messages would still be logged to the *Messages*
|
||||
# buffer.
|
||||
rm -f $siteStart $siteStartByteCompiled $subdirs $subdirsByteCompiled
|
||||
cat >"$siteStart" <<EOF
|
||||
(let ((inhibit-message t))
|
||||
(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 'native-comp-eln-load-path "$out/share/emacs/native-lisp/")
|
||||
''}
|
||||
EOF
|
||||
|
||||
# Generate a subdirs.el that statically adds all subdirectories to load-path.
|
||||
$emacs/bin/emacs \
|
||||
--batch \
|
||||
--load ${./mk-wrapper-subdirs.el} \
|
||||
--eval "(prin1 (macroexpand-1 '(mk-subdirs-expr \"$out/share/emacs/site-lisp\")))" \
|
||||
> "$subdirs"
|
||||
|
||||
# Byte-compiling improves start-up time only slightly, but costs nothing.
|
||||
$emacs/bin/emacs --batch -f batch-byte-compile "$siteStart" "$subdirs" "$siteAutoloads"
|
||||
|
||||
${optionalString nativeComp ''
|
||||
$emacs/bin/emacs --batch \
|
||||
--eval "(add-to-list 'native-comp-eln-load-path \"$out/share/emacs/native-lisp/\")" \
|
||||
-f batch-native-compile "$siteStart" "$subdirs" "$siteAutoloads"
|
||||
''}
|
||||
'';
|
||||
|
||||
inherit (emacs) meta;
|
||||
}
|
||||
''
|
||||
mkdir -p "$out/bin"
|
||||
|
||||
# Wrap emacs and friends so they find our site-start.el before the original.
|
||||
for prog in $emacs/bin/*; do # */
|
||||
local progname=$(basename "$prog")
|
||||
local autoloadExpression=""
|
||||
rm -f "$out/bin/$progname"
|
||||
if [[ $progname == emacs ]]; then
|
||||
# progs other than "emacs" do not understand the `-l` switches
|
||||
autoloadExpression="-l cl-loaddefs -l nix-generated-autoload"
|
||||
fi
|
||||
|
||||
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 autoloadExpression \
|
||||
--subst-var prog
|
||||
chmod +x $out/bin/$progname
|
||||
done
|
||||
|
||||
# Wrap MacOS app
|
||||
# this has to pick up resources and metadata
|
||||
# to recognize it as an "app"
|
||||
if [ -d "$emacs/Applications/Emacs.app" ]; then
|
||||
mkdir -p $out/Applications/Emacs.app/Contents/MacOS
|
||||
cp -r $emacs/Applications/Emacs.app/Contents/Info.plist \
|
||||
$emacs/Applications/Emacs.app/Contents/PkgInfo \
|
||||
$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 wrapperSiteLispNative "$deps/share/emacs/native-lisp:" \
|
||||
--subst-var-by autoloadExpression "-l cl-loaddefs -l nix-generated-autoload" \
|
||||
--subst-var-by prog "$emacs/Applications/Emacs.app/Contents/MacOS/Emacs"
|
||||
chmod +x $out/Applications/Emacs.app/Contents/MacOS/Emacs
|
||||
fi
|
||||
|
||||
mkdir -p $out/share
|
||||
# Link icons and desktop files into place
|
||||
for dir in applications icons info man emacs; do
|
||||
ln -s $emacs/share/$dir $out/share/$dir
|
||||
done
|
||||
''
|
||||
47
pkgs/build-support/emacs/wrapper.sh
Normal file
47
pkgs/build-support/emacs/wrapper.sh
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
#!@bash@
|
||||
|
||||
IFS=:
|
||||
|
||||
newLoadPath=()
|
||||
newNativeLoadPath=()
|
||||
added=
|
||||
|
||||
if [[ -n $EMACSLOADPATH ]]
|
||||
then
|
||||
while read -rd: entry
|
||||
do
|
||||
if [[ -z $entry && -z $added ]]
|
||||
then
|
||||
newLoadPath+=(@wrapperSiteLisp@)
|
||||
added=1
|
||||
fi
|
||||
newLoadPath+=("$entry")
|
||||
done <<< "$EMACSLOADPATH:"
|
||||
else
|
||||
newLoadPath+=(@wrapperSiteLisp@)
|
||||
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@ @autoloadExpression@ "$@"
|
||||
Loading…
Add table
Add a link
Reference in a new issue