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)