From: Andrea Corallo Date: Sun, 23 Feb 2020 14:06:59 +0000 (+0000) Subject: Make build process robust against interruptions X-Git-Tag: emacs-28.0.90~2727^2~818 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1dc237f280702d959216916b236cb9bf9bbcb22c;p=emacs.git Make build process robust against interruptions During boo-strap we produce both the .eln and the .elc together. Because the make target is the later this has to be produced as last to be resilient to build interruptions. --- diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 1f64626a993..b3bd6879b69 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -571,13 +571,19 @@ Each element is (INDEX . VALUE)") form) (defvar byte-native-compiling nil "Non nil while native compiling.") -(defvar byte-native-always-write-elc nil - "Always write the elc file also while native compiling.") +(defvar byte-native-for-bootstrap nil + "Non nil while compiling for bootstrap." + ;; During boostrap we produce both the .eln and the .elc together. + ;; Because the make target is the later this has to be produced as + ;; last to be resilient against build interruptions. +) (defvar byte-to-native-lap nil "A-list to accumulate LAP. Each pair is (NAME . LAP)") (defvar byte-to-native-top-level-forms nil "List of top level forms.") +(defvar byte-to-native-output-file nil + "Temporary file containing the byte-compilation output.") ;;; The byte codes; this information is duplicated in bytecomp.c @@ -2035,10 +2041,13 @@ The value is non-nil if there were no errors, nil if errors." ;; emacs-lisp files in the build tree are ;; recompiled). Previously this was accomplished by ;; deleting target-file before writing it. - (if (and byte-native-compiling - (null byte-native-always-write-elc)) - (delete-file tempfile) - (rename-file tempfile target-file t))) + (if byte-native-compiling + (if byte-native-for-bootstrap + ;; Defer elc final renaming. + (setf byte-to-native-output-file + (cons tempfile target-file)) + (delete-file tempfile)) + (rename-file tempfile target-file t))) (or noninteractive byte-native-compiling (message "Wrote %s" target-file))) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index edbc98f190b..c13844c70b7 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -2071,12 +2071,16 @@ Return the compilation unit file name." (defun batch-byte-native-compile-for-bootstrap () "As `batch-byte-compile' but used for booststrap. Always generate elc files too and handle native compiler expected errors." - ;; FIXME remove when dynamic scope support is implemented. - (let ((byte-native-always-write-elc t)) - (condition-case _ - (batch-native-compile) - (native-compiler-error-dyn-func) - (native-compiler-error-empty-byte)))) + (let ((byte-native-for-bootstrap t) + (byte-to-native-output-file nil)) + (unwind-protect + (condition-case _ + (batch-native-compile) + (native-compiler-error-dyn-func) + (native-compiler-error-empty-byte)) + (pcase byte-to-native-output-file + (`(,tempfile . ,target-file) + (rename-file tempfile target-file t)))))) ;;;###autoload (defun native-compile-async (input &optional jobs recursively)