diff --git a/Makefile b/Makefile index 88b59de14..fcfba1e1e 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,9 @@ autoremove: init.el autoloads: init.el @$(EMACS) -f 'doom/reload-autoloads' +recompile: init.el + @$(EMACS) -f 'doom/recompile' + compile: init.el clean @$(EMACS) -f 'doom/compile' diff --git a/core/core-packages.el b/core/core-packages.el index c5cd968df..ce1d84d32 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -381,9 +381,10 @@ server, if necessary) by `doom/packages-install', `doom/packages-update' and (if noninteractive (ignore-errors (require 'server) - (server-eval-at "server" '(let (noninteractive) (doom/reload)))) + (unless (server-eval-at "server" '(doom/reload)) + (message "No active emacs session running to reload"))) (doom-initialize t) - (doom/compile t) + (doom/recompile) (message "Reloaded %d packages" (length doom--package-load-path)))) (defun doom/reload-autoloads () @@ -452,6 +453,9 @@ take a while." (reverse (file-expand-wildcards (expand-file-name "*/*.el" path))))))) (dolist (file targets) (push (cons (file-relative-name file doom-emacs-dir) + ;; Use `byte-recompile-file' instead of `byte-compile-file' + ;; because the former distinguishes between no-byte-compile, + ;; failure (nil) and success (non-nil). (byte-recompile-file file t 0)) results)) (let* ((n-fail (cl-count-if (lambda (x) (null (cdr x))) results)) @@ -466,6 +470,27 @@ take a while." (message "Compiled %s file(s)" (format (if (= total 0) "%s" "%s/%s") total-success total))))) +(defun doom/recompile () + "Recompile any compiled *.el files in your Emacs configuration." + (interactive) + ;; Ensure all relevant config files are loaded. This way we don't need + ;; eval-when-compile and require blocks scattered all over. + (doom-initialize-packages (not noninteractive) noninteractive) + (let ((n 0) + (targets + (cl-remove-if-not + (lambda (file) (file-exists-p (concat file "c"))) + (append (list (expand-file-name "init.el" doom-emacs-dir)) + (reverse (directory-files-recursively doom-core-dir "\\.el$")) + (reverse (directory-files-recursively doom-modules-dir "\\.el$")))))) + (dolist (file targets) + (when (byte-compile-file file) + (message "+ Recompiling %s" file) + (cl-incf n))) + (if (= (length targets) 0) + (message "Nothing to recompile") + (message "Recompiled %s/%s files" n (length targets))))) + (defun doom/compile-lite () "A light-weight version of `doom/compile' which only compiles core files in your emacs configuration (init.el and core/**/*.el)."