From 69c6e0b8fbecb20efe53891a761b6db228ca1b55 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 00:04:12 +0200 Subject: [PATCH] Add doom-get-package-alist New function returns a list of (NAME . DESC) cons cells in the order they were declared (in module packages.el files). Fixes a load-order issue where autoloads from one package would depend on the autoloads of another package, but was inserted into doom-package-autoload-file *before* the depended package, causing void-variable errors. Also allows for a big refactor of the :plugins byte-compile target. --- core/autoload/packages.el | 17 +++++++++++++++++ core/core-dispatcher.el | 20 +++++--------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c9ebfe14d..b2c798689 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -188,6 +188,23 @@ files." ((equal (plist-get plist :pin) pinned))))) collect (cons sym plist))) +;;;###autoload +(defun doom-get-package-alist () + "Returns a list of all desired packages, their dependencies and their desc +objects, in the order of their `package! blocks.'" + (doom-initialize-packages) + (cl-remove-duplicates + (let (packages) + (dolist (name (append (mapcar #'car doom-packages) doom-core-packages)) + (when-let* ((desc (cadr (assq name package-alist)))) + (push (cons name desc) packages) + (cl-loop for dep in (package--get-deps name) + if (assq dep package-alist) + do (push (cons dep (cadr it)) packages)))) + packages) + :key #'car + :from-end t)) + ;;;###autoload (defun doom-get-depending-on (name) "Return a list of packages that depend on the package named NAME." diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index a26baa996..52775e6aa 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -501,9 +501,9 @@ This should be run whenever your `doom!' block or update your packages." (current-buffer)) (print! (green "✓ Cached package state")) ;; insert package autoloads - (dolist (spec package-alist) - (if-let* ((pkg (car spec)) - (desc (cadr spec))) + (dolist (spec (doom-get-package-alist)) + (if-let* ((pkg (car spec)) + (desc (cdr spec))) (unless (memq pkg doom-autoload-excluded-packages) (let ((file (concat (package--autoloads-file-name desc) ".el"))) (when (file-exists-p file) @@ -561,18 +561,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (":core" (push doom-core-dir targets)) (":private" (push doom-private-dir targets)) (":plugins" - (doom-initialize-packages) - (let (visited) - (dolist (name (append doom-core-packages (mapcar #'car doom-packages))) - (unless (memq name visited) - (when-let* ((desc (cadr (assq name package-alist)))) - (cl-loop for dep in (package--get-deps name) - if (and (not (memq dep visited)) - (assq dep package-alist)) - do (package--compile (cadr it)) - and do (push dep visited)) - (package--compile desc) - (push name visited))))) + (cl-loop for (name . desc) in (doom-get-package-alist) + do (package--compile desc)) (setq compile-plugins-p t modules (delete ":plugins" modules))) ((pred file-directory-p)