/* # Updating To update the list of packages from MELPA, 1. Run ./update-melpa 2. Check for evaluation errors: env NIXPKGS_ALLOW_BROKEN=1 nix-instantiate --show-trace ../../../../ -A emacs.pkgs..melpaStablePackages env NIXPKGS_ALLOW_BROKEN=1 nix-instantiate --show-trace ../../../../ -A emacs.pkgs..melpaPackages 3. `git commit -m "melpa-packages: $(date -Idate)" recipes-archive-melpa.json` ## Update from overlay Alternatively, run the following command: ./update-from-overlay It will update both melpa and elpa packages using https://github.com/nix-community/emacs-overlay. It's almost instantenous and formats commits for you. */ { lib, external, pkgs }: variant: self: let dontConfigure = pkg: if pkg != null then pkg.override (args: { melpaBuild = drv: args.melpaBuild (drv // { dontConfigure = true; }); }) else null; markBroken = pkg: if pkg != null then pkg.override (args: { melpaBuild = drv: args.melpaBuild (drv // { meta = (drv.meta or { }) // { broken = true; }; }); }) else null; externalSrc = pkg: epkg: if pkg != null then pkg.override (args: { melpaBuild = drv: args.melpaBuild (drv // { inherit (epkg) src version; propagatedUserEnvPkgs = [ epkg ]; }); }) else null; buildWithGit = pkg: pkg.overrideAttrs (attrs: { nativeBuildInputs = (attrs.nativeBuildInputs or [ ]) ++ [ pkgs.git ]; }); fix-rtags = pkg: if pkg != null then dontConfigure (externalSrc pkg external.rtags) else null; generateMelpa = lib.makeOverridable ({ archiveJson ? ./recipes-archive-melpa.json }: let inherit (import ./libgenerated.nix lib self) melpaDerivation; super = ( lib.listToAttrs (builtins.filter (s: s != null) (map (melpaDerivation variant) (lib.importJSON archiveJson) ) ) ); overrides = { # Expects bash to be at /bin/bash ac-rtags = fix-rtags super.ac-rtags; airline-themes = super.airline-themes.override { inherit (self.melpaPackages) powerline; }; auto-complete-clang-async = super.auto-complete-clang-async.overrideAttrs (old: { buildInputs = old.buildInputs ++ [ external.llvmPackages.llvm ]; CFLAGS = "-I${external.llvmPackages.clang}/include"; LDFLAGS = "-L${external.llvmPackages.clang}/lib"; }); # part of a larger package caml = dontConfigure super.caml; # part of a larger package # upstream issue: missing package version cmake-mode = dontConfigure super.cmake-mode; company-rtags = fix-rtags super.company-rtags; easy-kill-extras = super.easy-kill-extras.override { inherit (self.melpaPackages) easy-kill; }; dune = dontConfigure super.dune; emacsql-sqlite = super.emacsql-sqlite.overrideAttrs (old: { buildInputs = old.buildInputs ++ [ pkgs.sqlite ]; postBuild = '' cd source/sqlite make cd - ''; postInstall = '' install -m=755 -D source/sqlite/emacsql-sqlite \ $out/share/emacs/site-lisp/elpa/emacsql-sqlite-${old.version}/sqlite/emacsql-sqlite ''; stripDebugList = [ "share" ]; }); # https://github.com/syl20bnr/evil-escape/pull/86 evil-escape = super.evil-escape.overrideAttrs (attrs: { postPatch = '' substituteInPlace evil-escape.el \ --replace ' ;;; evil' ';;; evil' ''; packageRequires = with self; [ evil ]; }); ess-R-data-view = super.ess-R-data-view.override { inherit (self.melpaPackages) ess ctable popup; }; flycheck-rtags = fix-rtags super.flycheck-rtags; pdf-tools = super.pdf-tools.overrideAttrs (old: { nativeBuildInputs = [ external.pkg-config ]; buildInputs = with external; old.buildInputs ++ [ autoconf automake libpng zlib poppler ]; preBuild = "make server/epdfinfo"; recipe = pkgs.writeText "recipe" '' (pdf-tools :repo "politza/pdf-tools" :fetcher github :files ("lisp/pdf-*.el" "server/epdfinfo")) ''; }); # Build same version as Haskell package hindent = (externalSrc super.hindent external.hindent).overrideAttrs (attrs: { packageRequires = [ self.haskell-mode ]; }); irony = super.irony.overrideAttrs (old: { cmakeFlags = old.cmakeFlags or [ ] ++ [ "-DCMAKE_INSTALL_BINDIR=bin" ]; NIX_CFLAGS_COMPILE = "-UCLANG_RESOURCE_DIR"; preConfigure = '' cd server ''; preBuild = '' make install -D bin/irony-server $out/bin/irony-server cd .. ''; checkPhase = '' cd source/server make check cd ../.. ''; preFixup = '' rm -rf $out/share/emacs/site-lisp/elpa/*/server ''; dontUseCmakeBuildDir = true; doCheck = true; packageRequires = [ self.emacs ]; nativeBuildInputs = [ external.cmake external.llvmPackages.llvm external.llvmPackages.clang ]; }); # tries to write a log file to $HOME insert-shebang = super.insert-shebang.overrideAttrs (attrs: { HOME = "/tmp"; }); ivy-rtags = fix-rtags super.ivy-rtags; libgit = super.libgit.overrideAttrs(attrs: { nativeBuildInputs = (attrs.nativeBuildInputs or []) ++ [ pkgs.cmake ]; buildInputs = attrs.buildInputs ++ [ pkgs.libgit2 ]; dontUseCmakeBuildDir = true; postPatch = '' sed -i s/'add_subdirectory(libgit2)'// CMakeLists.txt ''; postBuild = '' pushd working/libgit make popd ''; postInstall = '' outd=$(echo $out/share/emacs/site-lisp/elpa/libgit-**) mkdir $outd/build install -m444 -t $outd/build ./source/src/libegit2.so rm -r $outd/src $outd/Makefile $outd/CMakeLists.txt ''; }); evil-magit = buildWithGit super.evil-magit; eopengrok = buildWithGit super.eopengrok; forge = buildWithGit super.forge; magit = buildWithGit super.magit; magit-find-file = buildWithGit super.magit-find-file; magit-gh-pulls = buildWithGit super.magit-gh-pulls; magit-imerge = buildWithGit super.magit-imerge; magit-lfs = buildWithGit super.magit-lfs; magit-org-todos = buildWithGit super.magit-org-todos; magit-tbdiff = buildWithGit super.magit-tbdiff; magit-topgit = buildWithGit super.magit-topgit; magit-vcsh = buildWithGit super.magit-vcsh; magit-gerrit = buildWithGit super.magit-gerrit; magit-annex = buildWithGit super.magit-annex; magit-todos = buildWithGit super.magit-todos; magit-filenotify = buildWithGit super.magit-filenotify; magit-gitflow = buildWithGit super.magit-gitflow; magithub = buildWithGit super.magithub; magit-svn = buildWithGit super.magit-svn; kubernetes = buildWithGit super.kubernetes; kubernetes-evil = buildWithGit super.kubernetes-evil; egg = buildWithGit super.egg; kapacitor = buildWithGit super.kapacitor; gerrit = buildWithGit super.gerrit; gerrit-download = buildWithGit super.gerrit-download; github-pullrequest = buildWithGit super.github-pullrequest; jist = buildWithGit super.jist; mandoku = buildWithGit super.mandoku; mandoku-tls = buildWithGit super.mandoku-tls; magit-p4 = buildWithGit super.magit-p4; magit-rbr = buildWithGit super.magit-rbr; magit-diff-flycheck = buildWithGit super.magit-diff-flycheck; magit-reviewboard = buildWithGit super.magit-reviewboard; magit-patch-changelog = buildWithGit super.magit-patch-changelog; magit-circleci = buildWithGit super.magit-circleci; magit-delta = buildWithGit super.magit-delta; orgit = buildWithGit super.orgit; orgit-forge = buildWithGit super.orgit-forge; # upstream issue: missing file header mhc = super.mhc.override { inherit (self.melpaPackages) calfw; }; # missing .NET nemerle = markBroken super.nemerle; # part of a larger package notmuch = dontConfigure super.notmuch; rtags = dontConfigure (externalSrc super.rtags external.rtags); rtags-xref = dontConfigure super.rtags; shm = super.shm.overrideAttrs (attrs: { propagatedUserEnvPkgs = [ external.structured-haskell-mode ]; }); # Telega has a server portion for it's network protocol telega = super.telega.overrideAttrs (old: { buildInputs = old.buildInputs ++ [ pkgs.tdlib ]; nativeBuildInputs = [ external.pkg-config ]; postBuild = '' cd source/server make cd - ''; postInstall = '' mkdir -p $out/bin install -m755 -Dt $out/bin ./source/server/telega-server ''; }); treemacs-magit = super.treemacs-magit.overrideAttrs (attrs: { # searches for Git at build time nativeBuildInputs = (attrs.nativeBuildInputs or [ ]) ++ [ external.git ]; }); vdiff-magit = super.vdiff-magit.overrideAttrs (attrs: { nativeBuildInputs = (attrs.nativeBuildInputs or [ ]) ++ [ external.git ]; }); zmq = super.zmq.overrideAttrs (old: { stripDebugList = [ "share" ]; preBuild = '' make ''; nativeBuildInputs = [ external.autoconf external.automake external.pkg-config external.libtool (external.zeromq.override { enableDrafts = true; }) ]; postInstall = '' mv $out/share/emacs/site-lisp/elpa/zmq-*/src/.libs/emacs-zmq.so $out/share/emacs/site-lisp/elpa/zmq-* rm -r $out/share/emacs/site-lisp/elpa/zmq-*/src rm $out/share/emacs/site-lisp/elpa/zmq-*/Makefile ''; }); # Map legacy renames from emacs2nix since code generation was ported to emacs lisp _0blayout = super."0blayout"; desktop-plus = super."desktop+"; ghub-plus = super."ghub+"; git-gutter-plus = super."git-gutter+"; git-gutter-fringe-plus = super."git-gutter-fringe+"; ido-completing-read-plus = super."ido-completing-read+"; image-plus = super."image+"; image-dired-plus = super."image-dired+"; markdown-mode-plus = super."markdown-mode+"; package-plus = super."package+"; rect-plus = super."rect+"; # upstream issue: missing file header bufshow = markBroken super.bufshow; # upstream issue: missing file header connection = markBroken super.connection; # upstream issue: missing file header dictionary = markBroken super.dictionary; # upstream issue: missing file header elmine = markBroken super.elmine; # upstream issue: missing file header ido-complete-space-or-hyphen = markBroken super.ido-complete-space-or-hyphen; # upstream issue: missing file header initsplit = markBroken super.initsplit; # upstream issue: missing file header instapaper = markBroken super.instapaper; # upstream issue: missing file header jsfmt = markBroken super.jsfmt; # upstream issue: missing file header maxframe = markBroken super.maxframe; # upstream issue: doesn't build magit-stgit = markBroken super.magit-stgit; # upstream issue: missing file header melancholy-theme = markBroken super.melancholy-theme; # upstream issue: doesn't build eterm-256color = markBroken super.eterm-256color; # upstream issue: doesn't build per-buffer-theme = markBroken super.per-buffer-theme; # upstream issue: missing file header qiita = markBroken super.qiita; # upstream issue: missing file header speech-tagger = markBroken super.speech-tagger; # upstream issue: missing file header sql-presto = markBroken super.sql-presto; # upstream issue: missing file header textmate = markBroken super.textmate; # upstream issue: missing file header link = markBroken super.link; # upstream issue: missing file header voca-builder = markBroken super.voca-builder; # upstream issue: missing file header window-numbering = markBroken super.window-numbering; editorconfig = super.editorconfig.overrideAttrs (attrs: { propagatedUserEnvPkgs = [ external.editorconfig-core-c ]; }); # missing dependencies evil-search-highlight-persist = super.evil-search-highlight-persist.overrideAttrs (attrs: { packageRequires = with self; [ evil highlight ]; }); helm-rtags = fix-rtags super.helm-rtags; # tries to write to $HOME php-auto-yasnippets = super.php-auto-yasnippets.overrideAttrs (attrs: { HOME = "/tmp"; }); racer = super.racer.overrideAttrs (attrs: { postPatch = attrs.postPatch or "" + '' substituteInPlace racer.el \ --replace /usr/local/src/rust/src ${external.rustPlatform.rustcSrc} ''; }); spaceline = super.spaceline.override { inherit (self.melpaPackages) powerline; }; vterm = super.vterm.overrideAttrs (old: { nativeBuildInputs = [ pkgs.cmake ]; buildInputs = old.buildInputs ++ [ self.emacs pkgs.libvterm-neovim ]; cmakeFlags = [ "-DEMACS_SOURCE=${self.emacs.src}" "-DUSE_SYSTEM_LIBVTERM=ON" ]; # we need the proper out directory to exist, so we do this in the # postInstall instead of postBuild postInstall = '' pushd source/build >/dev/null make install -m444 -t $out/share/emacs/site-lisp/elpa/vterm-** ../*.so popd > /dev/null rm -rf $out/share/emacs/site-lisp/elpa/vterm-**/{CMake*,build,*.c,*.h} ''; }); w3m = super.w3m.override (args: { melpaBuild = drv: args.melpaBuild (drv // { prePatch = let w3m = "${lib.getBin external.w3m}/bin/w3m"; in '' substituteInPlace w3m.el \ --replace 'defcustom w3m-command nil' \ 'defcustom w3m-command "${w3m}"' ''; }); }); }; # Deprecated legacy aliases for backwards compat aliases = lib.listToAttrs (lib.attrValues (lib.mapAttrs (n: v: { name = v; value = builtins.trace "Melpa attribute '${v}' is a legacy alias that will be removed in 21.05, use '${n}' instead" melpaPackages.${n}; }) (lib.filterAttrs (n: v: lib.hasAttr n melpaPackages) { "auto-complete-clang-async" = "emacsClangCompleteAsync"; "vterm" = "emacs-libvterm"; "0xc" = "_0xc"; "2048-game" = "_2048-game"; "4clojure" = "_4clojure"; "@" = "at"; "term+" = "term-plus"; "term+key-intercept" = "term-plus-key-intercept"; "term+mux" = "term-plus-mux"; "xml+" = "xml-plus"; }))); melpaPackages = lib.mapAttrs (n: v: if lib.hasAttr n overrides then overrides.${n} else v) super; in melpaPackages // aliases); in generateMelpa { }