emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/native-comp 1dc237f 2/3: Make build process robust against inter


From: Andrea Corallo
Subject: feature/native-comp 1dc237f 2/3: Make build process robust against interruptions
Date: Sun, 23 Feb 2020 13:37:33 -0500 (EST)

branch: feature/native-comp
commit 1dc237f280702d959216916b236cb9bf9bbcb22c
Author: Andrea Corallo <address@hidden>
Commit: Andrea Corallo <address@hidden>

    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.
---
 lisp/emacs-lisp/bytecomp.el | 21 +++++++++++++++------
 lisp/emacs-lisp/comp.el     | 16 ++++++++++------
 2 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 1f64626..b3bd687 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 edbc98f..c13844c 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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]