本节记录控制本地编译行为的变量。
该变量指定本地编译的优化级别。
取值应为 −1 到 3 之间的数字。
0 到 3 之间的值对应编译器命令行选项 -O0、-O1 等的优化级别。
值为 −1 表示禁用本地编译:函数和文件仅进行字节编译;
但仍然会生成 *.eln 文件,只是其中只包含字节码形式的编译代码。
(可以在函数粒度通过 (declare (speed -1)) 形式实现,see declare 形式。)
默认值为 2。
该变量指定生成的本地代码所使用的安全级别。 取值应为数字 0 或 1,含义如下:
如果函数声明与实际功能或调用方式不匹配,且该函数被本地编译, 生成的代码可能行为异常(甚至导致 Emacs 崩溃)。
即使函数声明错误,生成的代码也必须以安全方式生成。
也可以在函数粒度通过 safety 的 declare 形式控制,see declare 形式。
该变量指定本地编译生成的调试信息级别。 取值应为 0~3 的数字,含义如下:
不生成调试输出。默认值。
为本地代码生成调试符号。便于使用 gdb 等调试器调试本地代码。
同 1,并额外输出伪 C 代码。
同 2,并额外输出 GCC 中间过程与 libgccjit 日志文件。
生成的伪 C 代码会存放在对应 .eln 文件所在的同一目录。
该变量通过屏蔽部分或全部日志信息控制本地编译的输出详略。 值为 0(默认)时屏蔽所有日志。 设为 1~3 时,会记录级别高于该值的信息。各值含义:
不记录日志。默认值。
记录代码的最终 LIMPLE 表示。
记录 LAP、最终 LIMPLE 及部分额外过程信息。
最详细模式:记录所有信息。
该变量决定同时启动的本地编译子进程最大数量。 应为非负数。默认值 0,表示使用 CPU 执行单元数量的一半; 若 CPU 只有一个执行单元,则使用 1。
若该变量非nil,异步本地编译子进程产生的警告与错误
会在主 Emacs 会话的 *Warnings* 缓冲区中报告。
默认值 t 表示显示该缓冲区。
若只需记录警告但不弹出 *Warnings*,可将此变量设为 silent。
异步本地编译产生警告的常见原因是:
被编译的文件缺少对某些必需特性的 require。
这些特性可能已加载到主 Emacs 中,
但由于本地编译总是从环境干净的子进程启动,子进程中并不一定存在。
若该变量非nil,退出 Emacs 时会询问是否退出并终止仍在运行的异步本地编译子进程,
避免对应的 .eln 文件写入失败。
若为 nil(默认),Emacs 会直接终止这些子进程而不询问。
变量 native-comp-eln-load-path 保存 Emacs 查找 *.eln 文件的目录列表(see 库搜索);
在这一作用上,它等价于查找 *.el 和 *.elc 文件的 load-path。
该列表中的目录也用于写入异步本地编译生成的 *.eln 文件;
具体来说,Emacs 会将这些文件写入列表中第一个可写目录。
因此,你可以通过修改该变量控制本地编译结果的存放位置。
若该变量非nil,则对 Emacs 加载的、但尚无对应 *.eln 文件的 *.elc 文件
启用异步(也称为即时编译(just-in-time),JIT)本地编译。
该 JIT 编译根据 native-comp-async-jobs-number 的值,
使用批处理模式运行的独立 Emacs 子进程。
当某个 Lisp 文件的 JIT 编译成功完成后,生成的 .eln 文件会被加载,
其代码会替换 .elc 文件提供的函数定义。
将 native-comp-jit-compilation 设为 nil 会禁用 JIT 本地编译。
但即使禁用 JIT 本地编译,Emacs 仍可能需要启动异步本地编译子进程来生成跳板函数(trampolines)。
控制这一行为请使用下面的独立变量。
该变量控制跳板函数的生成。
跳板函数是一小段本地代码,用于在 native-comp-speed 设为 2 或更高时,
让本地编译的 Lisp 代码能够调用被 advising 或重定义的 Lisp 原语。
Emacs 将生成的跳板函数存放在独立的 *.eln 文件中。
默认情况下,该变量值为 t,允许生成跳板文件;
设为 nil 则禁用生成。
注意:如果某个原语所需的跳板函数不存在且无法生成,
从本地编译 Lisp 代码对该原语的调用会忽略重定义与 advising,
行为如同直接从 C 调用原语。
因此,不建议禁用跳板函数生成,除非你确信所有 Lisp 程序所需的跳板函数
都已编译并对 Emacs 可访问。
该变量的值也可以是字符串,此时它指定一个目录名,
用于存放生成的跳板函数 *.eln 文件,
覆盖 native-comp-eln-load-path 中的目录。
这在你希望按需生成跳板函数、但又不想将其存放在用户 HOME
或其他公共 *.eln 目录时非常有用。
但与 native-comp-eln-load-path 中的目录不同,
跳板函数会直接存放在该变量指定的目录中,而非其版本子目录。
若该目录名不是绝对路径,则相对于 invocation-directory 解析(see Operating System Environment)。
若该变量非nil,且 Emacs 需要生成跳板函数但找不到可写目录,
则会将其存放在 temporary-file-directory 中(see Generating Unique File Names)。
在找不到可写目录或该变量为字符串时生成的跳板函数, 仅在当前 Emacs 会话期间有效,因为 Emacs 不会在这些位置搜索跳板函数。