Add 'inhibit-native-compilation'
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 3 Oct 2022 13:26:04 +0000 (15:26 +0200)
committerRob Browning <rlb@defaultvalue.org>
Sun, 24 Mar 2024 21:10:16 +0000 (16:10 -0500)
The following upstream patch has been backported:

  Add new variable 'inhibit-native-compilation'

  * lisp/startup.el (normal-top-level): Set
  inhibit-native-compilation from environment variable.

  * lisp/emacs-lisp/comp.el (comp-trampoline-compile): Don't write
  trampolines to disk.

  * lisp/progmodes/elisp-mode.el
  (emacs-lisp-native-compile-and-load): Adjust.

  * src/comp.c (syms_of_comp): New variable
  inhibit-native-compilation.
  (maybe_defer_native_compilation): Use it.

Origin: upstream, commit: 5fec9182dbeffa88cef6651d8c798ef9665d6681
Forwarded: not-needed

lisp/emacs-lisp/comp.el
lisp/startup.el
src/comp.c

index 6b65a375ea02312f7c1b358464de5e792f039ff2..5d688a12d8b6e68e4b888ce3425384ef59c15c19 100644 (file)
@@ -3809,28 +3809,31 @@ Return the trampoline if found or nil otherwise."
 
 (defun comp--trampoline-abs-filename (subr-name)
   "Return the absolute filename for a trampoline for SUBR-NAME."
-  (cl-loop
-   with dirs = (if (stringp native-comp-enable-subr-trampolines)
-                   (list (expand-file-name native-comp-enable-subr-trampolines
-                                           invocation-directory))
-                 (if native-compile-target-directory
-                     (list (expand-file-name comp-native-version-dir
-                                             native-compile-target-directory))
-                   (comp-eln-load-path-eff)))
-   with rel-filename = (comp-trampoline-filename subr-name)
-   for dir in dirs
-   for abs-filename = (expand-file-name rel-filename dir)
-   unless (file-exists-p dir)
-     do (ignore-errors
-          (make-directory dir t)
-          (cl-return abs-filename))
-   when (file-writable-p abs-filename)
-     do (cl-return abs-filename)
-   ;; Default to some temporary directory if no better option was
-   ;; found.
-   finally (cl-return
-            (make-temp-file (file-name-sans-extension rel-filename) nil ".eln"
-                            nil))))
+  ;; If we've disabled nativecomp, don't write the trampolines to
+  ;; the eln cache (but create them).
+  (and (not inhibit-native-compilation)
+       (cl-loop
+       with dirs = (if (stringp native-comp-enable-subr-trampolines)
+                       (list (expand-file-name native-comp-enable-subr-trampolines
+                                               invocation-directory))
+                      (if native-compile-target-directory
+                         (list (expand-file-name comp-native-version-dir
+                                                 native-compile-target-directory))
+                       (comp-eln-load-path-eff)))
+       with rel-filename = (comp-trampoline-filename subr-name)
+       for dir in dirs
+       for abs-filename = (expand-file-name rel-filename dir)
+       unless (file-exists-p dir)
+       do (ignore-errors
+             (make-directory dir t)
+             (cl-return abs-filename))
+       when (file-writable-p abs-filename)
+       do (cl-return abs-filename)
+       ;; Default to some temporary directory if no better option was
+       ;; found.
+       finally (cl-return
+                (make-temp-file (file-name-sans-extension rel-filename) nil ".eln"
+                                nil)))))
 
 (defun comp-trampoline-compile (subr-name)
   "Synthesize compile and return a trampoline for SUBR-NAME."
index ccfcfee8f0e4d45697066f01b68c0e618e47f6fc..45e41a7c9519407f570a48da05f93ccd3c45c964 100644 (file)
@@ -546,7 +546,7 @@ DIRS are relative."
   (setq comp--compilable t))
 
 (defvar native-comp-eln-load-path)
-(defvar native-comp-jit-compilation)
+(defvar inhibit-native-compilation)
 (defvar native-comp-enable-subr-trampolines)
 
 (defvar startup--original-eln-load-path nil
@@ -583,6 +583,9 @@ the updated value."
 It sets `command-line-processed', processes the command-line,
 reads the initialization files, etc.
 It is the default value of the variable `top-level'."
+  ;; Allow disabling automatic .elc->.eln processing.
+  (setq inhibit-native-compilation (getenv "EMACS_INHIBIT_NATIVE_COMPILATION"))
+
   (if command-line-processed
       (message internal--top-level-message)
     (setq command-line-processed t)
@@ -601,7 +604,7 @@ It is the default value of the variable `top-level'."
         ;; in this session.  This is necessary if libgccjit is not
         ;; available on MS-Windows, but Emacs was built with
         ;; native-compilation support.
-        (setq native-comp-jit-compilation nil
+        (setq inhibit-native-compilation t
               native-comp-enable-subr-trampolines nil))
 
       ;; Form `native-comp-eln-load-path'.
index 8428cf9020e1c5c2086ae72ad30fb66c76f34e45..46b81cb1aae5a72d6a03009c35447ee9508f4445 100644 (file)
@@ -5179,6 +5179,7 @@ maybe_defer_native_compilation (Lisp_Object function_name,
     return;
 
   if (!native_comp_jit_compilation
+      || !NILP (Vinhibit_native_compilation)
       || noninteractive
       || !NILP (Vpurify_flag)
       || !COMPILEDP (definition)
@@ -5681,6 +5682,13 @@ For internal use.  */);
     doc: /* Non-nil when comp.el can be native compiled.
 For internal use. */);
   /* Compiler control customizes.  */
+  DEFVAR_LISP ("inhibit-native-compilation", Vinhibit_native_compilation,
+              doc: /* If non-nil, inhibit automatic native compilation of loaded .elc files.
+
+After compilation, each function definition is updated to the native
+compiled one.  */);
+  Vinhibit_native_compilation = Qnil;
+
   DEFVAR_BOOL ("native-comp-jit-compilation", native_comp_jit_compilation,
     doc: /* If non-nil, compile loaded .elc files asynchronously.