about summary refs log tree commit diff
path: root/overlays/patches/emacs/overlay/overlays
diff options
context:
space:
mode:
Diffstat (limited to 'overlays/patches/emacs/overlay/overlays')
-rw-r--r--overlays/patches/emacs/overlay/overlays/bytecomp-revert.patch30
-rw-r--r--overlays/patches/emacs/overlay/overlays/default.nix9
-rw-r--r--overlays/patches/emacs/overlay/overlays/emacs.nix176
-rw-r--r--overlays/patches/emacs/overlay/overlays/package.nix36
4 files changed, 251 insertions, 0 deletions
diff --git a/overlays/patches/emacs/overlay/overlays/bytecomp-revert.patch b/overlays/patches/emacs/overlay/overlays/bytecomp-revert.patch
new file mode 100644
index 000000000000..eee74107a80d
--- /dev/null
+++ b/overlays/patches/emacs/overlay/overlays/bytecomp-revert.patch
@@ -0,0 +1,30 @@
+diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
+index ac040799a22..42b733b0830 100644
+--- a/lisp/emacs-lisp/bytecomp.el
++++ b/lisp/emacs-lisp/bytecomp.el
+@@ -3521,8 +3521,6 @@ byte-compile-form
+               (setq form (cons 'progn (cdr form)))
+               (setq handler #'byte-compile-progn))
+              ((and (or sef (function-get (car form) 'important-return-value))
+-                   ;; Don't warn for arguments to `ignore'.
+-                   (not (eq byte-compile--for-effect 'for-effect-no-warn))
+                    (byte-compile-warning-enabled-p
+                     'ignored-return-value (car form)))
+               (byte-compile-warn-x
+@@ -4464,8 +4462,11 @@ byte-compile-goto-if
+ 
+ (defun byte-compile-ignore (form)
+   (dolist (arg (cdr form))
+-    ;; Compile each argument for-effect but suppress unused-value warnings.
+-    (byte-compile-form arg 'for-effect-no-warn))
++    ;; Compile args for value (to avoid warnings about unused values),
++    ;; emit a discard after each, and trust the LAP peephole optimiser
++    ;; to annihilate useless ops.
++    (byte-compile-form arg)
++    (byte-compile-discard))
+   (byte-compile-form nil))
+ 
+ ;; Return the list of items in CONDITION-PARAM that match PRED-LIST.
+-- 
+2.40.1
+
diff --git a/overlays/patches/emacs/overlay/overlays/default.nix b/overlays/patches/emacs/overlay/overlays/default.nix
new file mode 100644
index 000000000000..4819573515a2
--- /dev/null
+++ b/overlays/patches/emacs/overlay/overlays/default.nix
@@ -0,0 +1,9 @@
+self: super:
+let
+  overlays = [
+    # package overlay must be applied before emacs overlay
+    (import ./package.nix)
+    (import ./emacs.nix)
+  ];
+in
+super.lib.composeManyExtensions overlays self super
diff --git a/overlays/patches/emacs/overlay/overlays/emacs.nix b/overlays/patches/emacs/overlay/overlays/emacs.nix
new file mode 100644
index 000000000000..231871677b89
--- /dev/null
+++ b/overlays/patches/emacs/overlay/overlays/emacs.nix
@@ -0,0 +1,176 @@
+self: super:
+let
+  mkGitEmacs = namePrefix: jsonFile: { ... }@args:
+    let
+      repoMeta = super.lib.importJSON jsonFile;
+      fetcher =
+        if repoMeta.type == "savannah" then
+          super.fetchFromSavannah
+        else if repoMeta.type == "github" then
+          super.fetchFromGitHub
+        else
+          throw "Unknown repository type ${repoMeta.type}!";
+    in
+    builtins.foldl'
+      (drv: fn: fn drv)
+      super.emacs
+      ([
+
+        (drv: drv.override ({ srcRepo = true; } // args))
+
+        (
+          drv: drv.overrideAttrs (
+            old: {
+              name = "${namePrefix}-${repoMeta.version}";
+              inherit (repoMeta) version;
+              src = fetcher (builtins.removeAttrs repoMeta [ "type" "version" ]);
+
+              patches = [ ];
+
+              # fixes segfaults that only occur on aarch64-linux (#264)
+              configureFlags = old.configureFlags ++
+                               super.lib.optionals (super.stdenv.isLinux && super.stdenv.isAarch64)
+                                 [ "--enable-check-lisp-object-type" ];
+
+              postPatch = old.postPatch + ''
+                substituteInPlace lisp/loadup.el \
+                --replace '(emacs-repository-get-version)' '"${repoMeta.rev}"' \
+                --replace '(emacs-repository-get-branch)' '"master"'
+              '' +
+              # XXX: Maybe remove when emacsLsp updates to use Emacs
+              # 29.  We already have logic in upstream Nixpkgs to use
+              # a different patch for earlier major versions of Emacs,
+              # but the major version for emacsLsp follows the format
+              # of version YYYYMMDD, as opposed to version (say) 29.
+              # Removing this here would also require that we don't
+              # overwrite the patches attribute in the overlay to an
+              # empty list since we would then expect the Nixpkgs
+              # patch to be used. Not sure if it's better to rely on
+              # upstream Nixpkgs since it's cumbersome to wait for
+              # things to get merged into master.
+                (super.lib.optionalString ((old ? NATIVE_FULL_AOT) || (old ? env.NATIVE_FULL_AOT))
+                    (let backendPath = (super.lib.concatStringsSep " "
+                      (builtins.map (x: ''\"-B${x}\"'') ([
+                        # Paths necessary so the JIT compiler finds its libraries:
+                        "${super.lib.getLib self.libgccjit}/lib"
+                        "${super.lib.getLib self.libgccjit}/lib/gcc"
+                        "${super.lib.getLib self.stdenv.cc.libc}/lib"
+		      ] ++ super.lib.optionals (self.stdenv.cc?cc.libgcc) [
+			"${super.lib.getLib self.stdenv.cc.cc.libgcc}/lib"
+		      ] ++ [
+
+                        # Executable paths necessary for compilation (ld, as):
+                        "${super.lib.getBin self.stdenv.cc.cc}/bin"
+                        "${super.lib.getBin self.stdenv.cc.bintools}/bin"
+                        "${super.lib.getBin self.stdenv.cc.bintools.bintools}/bin"
+                      ])));
+                     in ''
+                        substituteInPlace lisp/emacs-lisp/comp.el --replace \
+                            "(defcustom comp-libgccjit-reproducer nil" \
+                            "(setq native-comp-driver-options '(${backendPath}))
+(defcustom comp-libgccjit-reproducer nil"
+                    ''));
+            }
+          )
+        )
+
+        # reconnect pkgs to the built emacs
+        (
+          drv:
+          let
+            result = drv.overrideAttrs (old: {
+              passthru = old.passthru // {
+                pkgs = self.emacsPackagesFor result;
+              };
+            });
+          in
+          result
+        )
+      ]);
+
+  emacs-git = (super.lib.makeOverridable (mkGitEmacs "emacs-git" ../repos/emacs/emacs-master.json) { withSQLite3 = true; withWebP = true; withTreeSitter = true; }).overrideAttrs (
+    oa: {
+      patches = oa.patches ++ [
+        # XXX: #318
+        ./bytecomp-revert.patch
+      ];
+    }
+  );
+
+  emacs-pgtk = (super.lib.makeOverridable (mkGitEmacs "emacs-pgtk" ../repos/emacs/emacs-master.json) { withSQLite3 = true; withWebP = true; withTreeSitter = true; withPgtk = true; }).overrideAttrs (
+    oa: {
+      patches = oa.patches ++ [
+        # XXX: #318
+        ./bytecomp-revert.patch
+      ];
+    }
+  );
+
+  emacs-unstable = super.lib.makeOverridable (mkGitEmacs "emacs-unstable" ../repos/emacs/emacs-unstable.json) { withSQLite3 = true; withWebP = true; withTreeSitter = true; };
+
+  emacs-unstable-pgtk = super.lib.makeOverridable (mkGitEmacs "emacs-unstable-pgtk" ../repos/emacs/emacs-unstable.json) { withSQLite3 = true; withWebP = true; withTreeSitter = true; withPgtk = true; };
+
+  emacs-lsp = super.lib.makeOverridable (mkGitEmacs "emacs-lsp" ../repos/emacs/emacs-lsp.json) { withTreeSitter = false; };
+
+  emacs-git-nox = (
+    (
+      emacs-git.override {
+        withNS = false;
+        withX = false;
+        withGTK2 = false;
+        withGTK3 = false;
+        withWebP = false;
+      }
+    ).overrideAttrs (
+      oa: {
+        name = "${oa.name}-nox";
+      }
+    )
+  );
+
+  emacs-unstable-nox = (
+    (
+      emacs-unstable.override {
+        withNS = false;
+        withX = false;
+        withGTK2 = false;
+        withGTK3 = false;
+        withWebP = false;
+      }
+    ).overrideAttrs (
+      oa: {
+        name = "${oa.name}-nox";
+      }
+    )
+  );
+
+in
+{
+  inherit emacs-git emacs-unstable;
+
+  inherit emacs-pgtk emacs-unstable-pgtk;
+
+  inherit emacs-git-nox emacs-unstable-nox;
+
+  inherit emacs-lsp;
+
+  emacsWithPackagesFromUsePackage = import ../elisp.nix { pkgs = self; };
+
+  emacsWithPackagesFromPackageRequires = import ../packreq.nix { pkgs = self; };
+
+} // super.lib.optionalAttrs (super.config.allowAliases or true) {
+  emacsGcc = builtins.trace "emacsGcc has been renamed to emacs-git, please update your expression." emacs-git;
+  emacsGitNativeComp = builtins.trace "emacsGitNativeComp has been renamed to emacs-git, please update your expression." emacs-git;
+  emacsGitTreeSitter = builtins.trace "emacsGitTreeSitter has been renamed to emacs-git, please update your expression." emacs-git;
+  emacsNativeComp = builtins.trace "emacsNativeComp has been renamed to emacs-unstable, please update your expression." emacs-unstable;
+  emacsPgtkGcc = builtins.trace "emacsPgtkGcc has been renamed to emacs-pgtk, please update your expression." emacs-pgtk;
+  emacsPgtkNativeComp = builtins.trace "emacsPgtkNativeComp has been renamed to emacs-pgtk, please update your expression." emacs-pgtk;
+
+  emacsGit = builtins.trace "emacsGit has been renamed to emacs-git, please update your expression." emacs-git;
+  emacsUnstable = builtins.trace "emacsUnstable has been renamed to emacs-unstable, please update your expression." emacs-unstable;
+  emacsPgtk = builtins.trace "emacsPgtk has been renamed to emacs-pgtk, please update your expression." emacs-pgtk;
+  emacsUnstablePgtk = builtins.trace "emacsUnstablePgtk has been renamed to emacs-unstable-pgtk, please update your expression." emacs-unstable-pgtk;
+  emacsGitNox = builtins.trace "emacsGitNox has been renamed to emacs-git-nox, please update your expression." emacs-git-nox;
+  emacsUnstableNox = builtins.trace "emacsUnstableNox has been renamed to emacs-unstable-nox, please update your expression." emacs-unstable-nox;
+  emacsLsp = builtins.trace "emacsLsp has been renamed to emacs-lsp, please update your expression." emacs-lsp;
+}
diff --git a/overlays/patches/emacs/overlay/overlays/package.nix b/overlays/patches/emacs/overlay/overlays/package.nix
new file mode 100644
index 000000000000..bc2979926997
--- /dev/null
+++ b/overlays/patches/emacs/overlay/overlays/package.nix
@@ -0,0 +1,36 @@
+self: super:
+{
+  emacsPackagesFor = emacs: (
+    (super.emacsPackagesFor emacs).overrideScope' (
+      eself: esuper:
+        let
+          melpaStablePackages = esuper.melpaStablePackages.override {
+            archiveJson = ../repos/melpa/recipes-archive-melpa.json;
+          };
+
+          melpaPackages = esuper.melpaPackages.override {
+            archiveJson = ../repos/melpa/recipes-archive-melpa.json;
+          };
+
+          elpaDevelPackages = esuper.elpaDevelPackages.override {
+            generated = ../repos/elpa/elpa-devel-generated.nix;
+          };
+
+          elpaPackages = esuper.elpaPackages.override {
+            generated = ../repos/elpa/elpa-generated.nix;
+          };
+
+          nongnuPackages = esuper.nongnuPackages.override {
+            generated = ../repos/nongnu/nongnu-generated.nix;
+          };
+
+        in
+          esuper.override {
+            inherit melpaStablePackages melpaPackages elpaDevelPackages elpaPackages
+              nongnuPackages;
+          }
+
+    )
+  );
+
+}