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
** 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'.
(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.
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)
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)
(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
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)
;; 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'.
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.
return;
if (!native_comp_deferred_compilation
+ || !NILP (Vinhibit_native_compilation)
|| noninteractive
|| !NILP (Vpurify_flag)
|| !COMPILEDP (definition)
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.