]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/bytecomp.el: Allow a nil destination file
authorStefan Monnier <monnier@iro.umontreal.ca>
Sun, 13 Dec 2020 00:19:03 +0000 (19:19 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 13 Dec 2020 00:19:03 +0000 (19:19 -0500)
(byte-compile--default-dest-file): New function, extracted from
byte-compile-dest-file.
(byte-compile-dest-file): Use it.
(byte-compile-dest-file-function): Give it a non-nil default value.
(byte-recompile-file, byte-compile-file): Handle a nil return value
from `byte-compile-dest-file`.

* lisp/progmodes/elisp-mode.el (elisp-flymake--batch-compile-for-flymake):
Tell the compiler not to write the result, instead of writing it to
a dummy temp file.

lisp/emacs-lisp/bytecomp.el
lisp/progmodes/elisp-mode.el

index 0acd52769771d2b30ab0b2af830ee90f2082eb8a..51accc0865413161aa8c257e7d99c534d867e1ff 100644 (file)
@@ -144,7 +144,7 @@ is hard-coded in various places in Emacs.)"
   ;; Eg is_elc in Fload.
   :type 'regexp)
 
-(defcustom byte-compile-dest-file-function nil
+(defcustom byte-compile-dest-file-function #'byte-compile--default-dest-file
   "Function for the function `byte-compile-dest-file' to call.
 It should take one argument, the name of an Emacs Lisp source
 file name, and return the name of the compiled file.
@@ -177,14 +177,16 @@ function to do the work.  Otherwise, if FILENAME matches
 `emacs-lisp-file-regexp' (by default, files with the extension \".el\"),
 replaces the matching part (and anything after it) with \".elc\";
 otherwise adds \".elc\"."
-  (if byte-compile-dest-file-function
-      (funcall byte-compile-dest-file-function filename)
-    (setq filename (file-name-sans-versions
-                   (byte-compiler-base-file-name filename)))
-    (cond ((string-match emacs-lisp-file-regexp filename)
-          (concat (substring filename 0 (match-beginning 0)) ".elc"))
-         (t (concat filename ".elc")))))
-)
+  (funcall (or byte-compile-dest-file-function
+               #'byte-compile--default-dest-file)
+           filename)))
+
+(defun byte-compile--default-dest-file (filename)
+  (setq filename (file-name-sans-versions
+                 (byte-compiler-base-file-name filename)))
+  (cond ((string-match emacs-lisp-file-regexp filename)
+        (concat (substring filename 0 (match-beginning 0)) ".elc"))
+       (t (concat filename ".elc"))))
 
 ;; This can be the 'byte-compile property of any symbol.
 (autoload 'byte-compile-inline-expand "byte-opt")
@@ -1809,24 +1811,23 @@ If compilation is needed, this functions returns the result of
   (let ((dest (byte-compile-dest-file filename))
         ;; Expand now so we get the current buffer's defaults
         (filename (expand-file-name filename)))
-    (if (if (file-exists-p dest)
-            ;; File was already compiled
-            ;; Compile if forced to, or filename newer
-            (or force
-                (file-newer-than-file-p filename dest))
-          (and arg
-               (or (eq 0 arg)
-                   (y-or-n-p (concat "Compile "
-                                     filename "? ")))))
-        (progn
-          (if (and noninteractive (not byte-compile-verbose))
-              (message "Compiling %s..." filename))
-          (byte-compile-file filename)
-          (when load
-            (load (if (file-exists-p dest) dest filename))))
+    (prog1
+        (if (if (and dest (file-exists-p dest))
+                ;; File was already compiled
+                ;; Compile if forced to, or filename newer
+                (or force
+                    (file-newer-than-file-p filename dest))
+              (and arg
+                   (or (eq 0 arg)
+                       (y-or-n-p (concat "Compile "
+                                         filename "? ")))))
+            (progn
+              (if (and noninteractive (not byte-compile-verbose))
+                  (message "Compiling %s..." filename))
+              (byte-compile-file filename))
+         'no-byte-compile)
       (when load
-       (load (if (file-exists-p dest) dest filename)))
-      'no-byte-compile)))
+        (load (if (and dest (file-exists-p dest)) dest filename))))))
 
 (defun byte-compile--load-dynvars (file)
   (and file (not (equal file ""))
@@ -1936,7 +1937,7 @@ See also `emacs-lisp-byte-compile-and-load'."
          ;; (message "%s not compiled because of `no-byte-compile: %s'"
          ;;       (byte-compile-abbreviate-file filename)
          ;;       (with-current-buffer input-buffer no-byte-compile))
-         (when (file-exists-p target-file)
+         (when (and target-file (file-exists-p target-file))
            (message "%s deleted because of `no-byte-compile: %s'"
                     (byte-compile-abbreviate-file target-file)
                     (buffer-local-value 'no-byte-compile input-buffer))
@@ -1960,36 +1961,38 @@ See also `emacs-lisp-byte-compile-and-load'."
        (with-current-buffer output-buffer
          (goto-char (point-max))
          (insert "\n")                 ; aaah, unix.
-         (if (file-writable-p target-file)
-             ;; We must disable any code conversion here.
-             (progn
-               (let* ((coding-system-for-write 'no-conversion)
-                      ;; Write to a tempfile so that if another Emacs
-                      ;; process is trying to load target-file (eg in a
-                      ;; parallel bootstrap), it does not risk getting a
-                      ;; half-finished file.  (Bug#4196)
-                      (tempfile
-                       (make-temp-file (expand-file-name target-file)))
-                      (default-modes (default-file-modes))
-                      (temp-modes (logand default-modes #o600))
-                      (desired-modes (logand default-modes #o666))
-                      (kill-emacs-hook
-                       (cons (lambda () (ignore-errors
-                                          (delete-file tempfile)))
-                             kill-emacs-hook)))
-                 (unless (= temp-modes desired-modes)
-                   (set-file-modes tempfile desired-modes 'nofollow))
-                 (write-region (point-min) (point-max) tempfile nil 1)
-                 ;; This has the intentional side effect that any
-                 ;; hard-links to target-file continue to
-                 ;; point to the old file (this makes it possible
-                 ;; for installed files to share disk space with
-                 ;; the build tree, without causing problems when
-                 ;; emacs-lisp files in the build tree are
-                 ;; recompiled).  Previously this was accomplished by
-                 ;; deleting target-file before writing it.
-                 (rename-file tempfile target-file t))
-               (or noninteractive (message "Wrote %s" target-file)))
+         (cond
+          ((null target-file) nil)     ;We only wanted the warnings!
+          ((file-writable-p target-file)
+           ;; We must disable any code conversion here.
+           (let* ((coding-system-for-write 'no-conversion)
+                  ;; Write to a tempfile so that if another Emacs
+                  ;; process is trying to load target-file (eg in a
+                  ;; parallel bootstrap), it does not risk getting a
+                  ;; half-finished file.  (Bug#4196)
+                  (tempfile
+                   (make-temp-file (expand-file-name target-file)))
+                  (default-modes (default-file-modes))
+                  (temp-modes (logand default-modes #o600))
+                  (desired-modes (logand default-modes #o666))
+                  (kill-emacs-hook
+                   (cons (lambda () (ignore-errors
+                                 (delete-file tempfile)))
+                         kill-emacs-hook)))
+             (unless (= temp-modes desired-modes)
+               (set-file-modes tempfile desired-modes 'nofollow))
+             (write-region (point-min) (point-max) tempfile nil 1)
+             ;; This has the intentional side effect that any
+             ;; hard-links to target-file continue to
+             ;; point to the old file (this makes it possible
+             ;; for installed files to share disk space with
+             ;; the build tree, without causing problems when
+             ;; emacs-lisp files in the build tree are
+             ;; recompiled).  Previously this was accomplished by
+             ;; deleting target-file before writing it.
+             (rename-file tempfile target-file t))
+           (or noninteractive (message "Wrote %s" target-file)))
+          (t
            ;; This is just to give a better error message than write-region
            (let ((exists (file-exists-p target-file)))
              (signal (if exists 'file-error 'file-missing)
@@ -1997,7 +2000,7 @@ See also `emacs-lisp-byte-compile-and-load'."
                            (if exists
                                "Cannot overwrite file"
                              "Directory not writable or nonexistent")
-                           target-file))))
+                           target-file)))))
          (kill-buffer (current-buffer)))
        (if (and byte-compile-generate-call-tree
                 (or (eq t byte-compile-generate-call-tree)
index fa360a8f3f82ac260e751c8524cb33cf162a49c7..b7e0c4522885946dab597ab85fa907cc179b5fdc 100644 (file)
@@ -1827,12 +1827,9 @@ Runs in a batch-mode Emacs.  Interactively use variable
   (interactive (list buffer-file-name))
   (let* ((file (or file
                    (car command-line-args-left)))
-         (dummy-elc-file)
          (byte-compile-log-buffer
           (generate-new-buffer " *dummy-byte-compile-log-buffer*"))
-         (byte-compile-dest-file-function
-          (lambda (source)
-            (setq dummy-elc-file (make-temp-file (file-name-nondirectory source)))))
+         (byte-compile-dest-file-function #'ignore)
          (collected)
          (byte-compile-log-warning-function
           (lambda (string &optional position fill level)
@@ -1842,7 +1839,6 @@ Runs in a batch-mode Emacs.  Interactively use variable
     (unwind-protect
         (byte-compile-file file)
       (ignore-errors
-        (delete-file dummy-elc-file)
         (kill-buffer byte-compile-log-buffer)))
     (prin1 :elisp-flymake-output-start)
     (terpri)