请问 native comp 可以一次性编译所有的包吗? 不是用到哪个突然编译一下?

经常被突然出现的编译打断,尤其是更新过插件后,想问一下有什么不会被打断的方案吗? 哪怕初始编译的时间久一点。

尝试搜索过几个选项,例如 native-comp-always-compile t 好像并没有起到效果。

感谢🙏

可以使用 native-compile-async 编译

1 个赞

编译的时候加上 NATIVE_FULL_AOT=1

1 个赞

package 更新之后总得编译一次的. 不过 package.el 应该有个 package-native-comp 变量, 打开之后会在 install 的时候就编译, 可能有点帮助吧.

3 个赞

感谢大家回复,目前重新用 NATIVE_FULL_AOT=1 编译了 emacs28,正在重新编译所有的 packages, 还没结束。

看了下 package-native-comp 确实有帮助。

:pray:

看到这篇文章 EmacsWiki: Gcc Emacs 一次性搞清楚了 Ahead-of-time compilation,正是楼上各位老师提供的三种方法 :+1:

现在三种方法都用上了

写个攻略?让大家学习下,哈哈哈哈哈

可不敢在各位大佬面前班门弄斧,只能分享下折腾的经历,说错的地方还请指正!

通过 NATIVE_FULL_AOT=1 重新编译 Emacs 后再启动会进入一个比较漫长的 native comp 阶段,可能是编译之前没用过的依赖。 按照 EmacsWiki 的解释,这个是 ahead-of-time compile Emacs distribution.

package-native-comp 是一直在寻找的配置选项,之前搜索 ^native-comp 完全忽略了这个选项。启用后,当某个包(例如 magit)更新完毕后直接开始编译,下次就不会在使用 git 时被突然冒出来的 magit 编译过程打断了。

按照 EmacsWiki 的提示,估计是 use-package 没有处理这个方面,而 straight.el 会默认在包更新完毕后开始编译。以后时间充裕了再去尝试 straight.el。

最后,写了个方法以备不时之需:

(defun my/aot-compile-all ()
  (interactive)
  (native-compile-async "~/.emacs.d/elpa" 'recursively))

目前半天用下来,还没有遇到突然编译的情况,好像个别几个依赖会在后台编译,但不会提示,突然卡手一下然后很快又恢复流畅。

2 个赞

用 gccemacs 还有一个问题,升级包之后eln文件不会删除,导致缓存中有一大堆eln文件。删除包再重新安装就会删除老的eln文件。

1 个赞

是不是跟这个变量package-native-compile有关系?

可以用 native-compile-prune-cache 删除不需要的 eln 目录。

不是目录,是想删除不需要的eln文件。这条命令行吗?

为什么要自动编译? gccemacs 再快都不应该自动编译, 是否编译要交给用户自己去控制, 自动编译的设计真的是非常干扰第一次安装和日常使用。

1 个赞

应该不行。看了下 comp.el,没有找到相关的函数。

其实,我认为这是bug。。。

straight.el 应该是自己实现了这个功能,没有直接配置这个变量

日常使用确实被影响到了,等到月底就有时间去折腾下 straight.el

刚才试了下,在 emacs master 里编译新的文件时会替换掉旧的。不知道什么时候修复的这个 bug