mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-13 09:32:47 +00:00
* lisp/emacs-lisp/bytecomp.el: Allow a nil destination file
(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.
This commit is contained in:
parent
c6f21e2420
commit
185b0820b8
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user