18.2 本地编译变量

本节记录控制本地编译行为的变量。

User Option: native-comp-speed

该变量指定本地编译的优化级别。 取值应为 −1 到 3 之间的数字。 0 到 3 之间的值对应编译器命令行选项 -O0-O1 等的优化级别。 值为 −1 表示禁用本地编译:函数和文件仅进行字节编译; 但仍然会生成 *.eln 文件,只是其中只包含字节码形式的编译代码。 (可以在函数粒度通过 (declare (speed -1)) 形式实现,see declare 形式。) 默认值为 2。

User Option: compilation-safety

该变量指定生成的本地代码所使用的安全级别。 取值应为数字 0 或 1,含义如下:

0

如果函数声明与实际功能或调用方式不匹配,且该函数被本地编译, 生成的代码可能行为异常(甚至导致 Emacs 崩溃)。

1

即使函数声明错误,生成的代码也必须以安全方式生成。

也可以在函数粒度通过 safetydeclare 形式控制,see declare 形式

User Option: native-comp-debug

该变量指定本地编译生成的调试信息级别。 取值应为 0~3 的数字,含义如下:

0

不生成调试输出。默认值。

1

为本地代码生成调试符号。便于使用 gdb 等调试器调试本地代码。

2

同 1,并额外输出伪 C 代码。

3

同 2,并额外输出 GCC 中间过程与 libgccjit 日志文件。

生成的伪 C 代码会存放在对应 .eln 文件所在的同一目录。

User Option: native-comp-verbose

该变量通过屏蔽部分或全部日志信息控制本地编译的输出详略。 值为 0(默认)时屏蔽所有日志。 设为 1~3 时,会记录级别高于该值的信息。各值含义:

0

不记录日志。默认值。

1

记录代码的最终 LIMPLE 表示。

2

记录 LAP、最终 LIMPLE 及部分额外过程信息。

3

最详细模式:记录所有信息。

User Option: native-comp-async-jobs-number

该变量决定同时启动的本地编译子进程最大数量。 应为非负数。默认值 0,表示使用 CPU 执行单元数量的一半; 若 CPU 只有一个执行单元,则使用 1。

User Option: native-comp-async-report-warnings-errors

若该变量非nil,异步本地编译子进程产生的警告与错误 会在主 Emacs 会话的 *Warnings* 缓冲区中报告。 默认值 t 表示显示该缓冲区。 若只需记录警告但不弹出 *Warnings*,可将此变量设为 silent

异步本地编译产生警告的常见原因是: 被编译的文件缺少对某些必需特性的 require。 这些特性可能已加载到主 Emacs 中, 但由于本地编译总是从环境干净的子进程启动,子进程中并不一定存在。

User Option: native-comp-async-query-on-exit

若该变量非nil,退出 Emacs 时会询问是否退出并终止仍在运行的异步本地编译子进程, 避免对应的 .eln 文件写入失败。 若为 nil(默认),Emacs 会直接终止这些子进程而不询问。

变量 native-comp-eln-load-path 保存 Emacs 查找 *.eln 文件的目录列表(see 库搜索); 在这一作用上,它等价于查找 *.el*.elc 文件的 load-path。 该列表中的目录也用于写入异步本地编译生成的 *.eln 文件; 具体来说,Emacs 会将这些文件写入列表中第一个可写目录。 因此,你可以通过修改该变量控制本地编译结果的存放位置。

Variable: native-comp-jit-compilation

若该变量非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)。 控制这一行为请使用下面的独立变量。

Variable: native-comp-enable-subr-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 不会在这些位置搜索跳板函数。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike