]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new variable 'inhibit-native-compilation'
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 3 Oct 2022 13:26:04 +0000 (15:26 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 3 Oct 2022 13:26:13 +0000 (15:26 +0200)
* doc/lispref/compile.texi (Native-Compilation Variables):
Document it.

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

* lisp/subr.el (native-comp-deferred-compilation): Make obsolete.

* 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.

doc/lispref/compile.texi
etc/NEWS
lisp/emacs-lisp/comp.el
lisp/progmodes/elisp-mode.el
lisp/startup.el
lisp/subr.el
src/comp.c

index 60fc11a22ed4baf4eb0fc66dff413b244405dc9d..e6e9fd1be841fdc59dc44ff4d30e976340ad98e9 100644 (file)
@@ -973,6 +973,24 @@ whether native-compilation is available should use this predicate.
   This section documents the variables that control
 native-compilation.
 
+@defvar inhibit-native-compilation
+If your Emacs has support for native compilation, Emacs will (by
+default) compile the Lisp files you're loading in the background, and
+then install the native-compiled versions of the functions.  If you
+wish to disable this, you can set this variable to non-@code{nil}.  If
+you want to set it permanently, this should probably be done from the
+early init file, since setting it in the normal init file is probably
+too late.
+
+While setting this variable disables automatic compilation of Lisp
+files, the compiler may still be invoked to install @dfn{trampolines}
+if any built-in functions are redefined.  However, these trampolines
+will not get written to disk.
+
+You can also use the @samp{EMACS_INHIBIT_NATIVE_COMPILATION}
+environment variable to disable native compilation.
+@end defvar
+
 @defopt native-comp-speed
 This variable specifies the optimization level for native compilation.
 Its value should be a number between @minus{}1 and 3.  Values between
index d7bc4b0e0c24bf84333092940b573b01b0ef4d77..6e7836e3c097c703b697a8bf401d9b174d427b3b 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -170,10 +170,17 @@ time.
 
 ** Native Compilation
 
----
-*** New command 'native-compile-prune-cache'.
-This command deletes older ".eln" cache entries (but not the ones for
-the current Emacs version).
++++
+*** New variable 'inhibit-native-compilation'.
+If set, Emacs will inhibit native compilation (and won't write
+anything to the eln cache automatically).  The variable is initialised
+from the EMACS_INHIBIT_NATIVE_COMPILATION environment variable on
+Emacs startup.
+
+
+--- *** New command 'native-compile-prune-cache'.  This command
+deletes older ".eln" cache entries (but not the ones for the current
+Emacs version).
 
 ---
 *** New function 'startup-redirect-eln-cache'.
index abab9107ae12a5092e149c3e4f16e1dd10ed1e6e..759cedddefebfe6e39ea338428311b75ffd562da 100644 (file)
@@ -3801,22 +3801,25 @@ Return the trampoline if found or nil otherwise."
          (lexical-binding t))
     (comp--native-compile
      form nil
-     (cl-loop
-      for dir in (if native-compile-target-directory
-                     (list (expand-file-name comp-native-version-dir
-                                             native-compile-target-directory))
-                   (comp-eln-load-path-eff))
-      for f = (expand-file-name
-               (comp-trampoline-filename subr-name)
-               dir)
-      unless (file-exists-p dir)
-        do (ignore-errors
-             (make-directory dir t)
-             (cl-return f))
-      when (file-writable-p f)
-        do (cl-return f)
-      finally (error "Cannot find suitable directory for output in \
-`native-comp-eln-load-path'")))))
+     ;; If we've disabled nativecomp, don't write the trampolines to
+     ;; the eln cache (but create them).
+     (and (not inhibit-native-compilation)
+          (cl-loop
+           for dir in (if native-compile-target-directory
+                          (list (expand-file-name comp-native-version-dir
+                                                  native-compile-target-directory))
+                        (comp-eln-load-path-eff))
+           for f = (expand-file-name
+                    (comp-trampoline-filename subr-name)
+                    dir)
+           unless (file-exists-p dir)
+           do (ignore-errors
+                (make-directory dir t)
+                (cl-return f))
+           when (file-writable-p f)
+           do (cl-return f)
+           finally (error "Cannot find suitable directory for output in \
+`native-comp-eln-load-path'"))))))
 
 \f
 ;; Some entry point support code.
@@ -4107,6 +4110,7 @@ the deferred compilation mechanism."
                    comp-ctxt
                    (comp-ctxt-output comp-ctxt)
                    (file-exists-p (comp-ctxt-output comp-ctxt)))
+          (message "Deleting %s" (comp-ctxt-output comp-ctxt))
           (delete-file (comp-ctxt-output comp-ctxt)))))))
 
 (defun native-compile-async-skip-p (file load selector)
index 4ada27a1acae2952f7b0d98d8cce052df2e24e36..c12453e88370583dcb1e9ab1bff30c005540d128 100644 (file)
@@ -220,7 +220,7 @@ All commands in `lisp-mode-shared-map' are inherited by this map."
 Load the compiled code when finished.
 
 Use `emacs-lisp-byte-compile-and-load' in combination with
-`native-comp-deferred-compilation' set to t to achieve asynchronous
+`inhibit-native-compilation' set to nil to achieve asynchronous
 native compilation."
   (interactive nil emacs-lisp-mode)
   (emacs-lisp--before-compile-buffer)
index 50a8f491d8eb8391c30ac9b9efa34bb137617524..03a67cdc0e8301760d91c93381ec1ac1a6d2b0fb 100644 (file)
@@ -541,7 +541,7 @@ DIRS are relative."
   (setq comp--compilable t))
 
 (defvar native-comp-eln-load-path)
-(defvar native-comp-deferred-compilation)
+(defvar inhibit-native-compilation)
 (defvar comp-enable-subr-trampolines)
 
 (defvar startup--original-eln-load-path nil
@@ -578,6 +578,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)
@@ -596,7 +599,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-deferred-compilation nil
+        (setq inhibit-native-compilation t
               comp-enable-subr-trampolines nil))
 
       ;; Form `native-comp-eln-load-path'.
index 4f8273d56fba985df99e517b4b8b9b834d9efc1e..0c9d94db1cc33beca569777559cdadf0dc90bb9c 100644 (file)
@@ -1876,6 +1876,9 @@ activations.  To prevent runaway recursion, use `max-lisp-eval-depth'
 instead; it will indirectly limit the specpdl stack size as well.")
 (make-obsolete-variable 'max-specpdl-size nil "29.1")
 
+(make-obsolete-variable 'native-comp-deferred-compilation
+                        'inhibit-native-compilation "29.1")
+
 \f
 ;;;; Alternate names for functions - these are not being phased out.
 
index 4813ca04a90547c5d1c2e6403c84a39f7e6e2c4e..ed64a850721a0c3f947f12f77cf2cee2bf13bab4 100644 (file)
@@ -5107,6 +5107,7 @@ maybe_defer_native_compilation (Lisp_Object function_name,
     return;
 
   if (!native_comp_deferred_compilation
+      || !NILP (Vinhibit_native_compilation)
       || noninteractive
       || !NILP (Vpurify_flag)
       || !COMPILEDP (definition)
@@ -5610,6 +5611,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-deferred-compilation",
               native_comp_deferred_compilation,
               doc: /* If non-nil compile loaded .elc files asynchronously.