分享一下MacOS下编译Emacs 28 native-comp分支

最近看大家都说native-comp很快,决定装一个试试。然而在论坛和网上只找到了linux和windows下的编译方法,虽然macOS与linux下编译挺类似,但还是有很多地方有各种各样的问题。。自己摸索了半天终于编译成功,确实能感觉到速度有明显提升。下面分享下编译过程和踩的坑:

  1. 从github镜像下载gcc releases/gcc-9分支,如果下载速度太慢,可以在码云上从github拉取后再从码云下载,速度极快。我是下载到~/jit/src目录。然后编译gcc with libgccjit.so,并install到usr/local中
cd jit                                                                                                                                         
mkdir build                                                                                                                                    
cd build                                                                                                                                       
../src/configure --enable-host-shared --enable-languages=jit,c,c++,objc,obj-c++ --enable-checking=release --disable-bootstrap          
make -j2
make install
  1. git clone Emacs native-comp 分支代码,比如到~/emacs,然后编译。注意:configure这一步要加上CC=‘clang’,如果不加它会默认用gcc,这会导致错误:appkit/AppKit.h: present but cannot be compiled. 这是我当时遇到的问题,加上CC='clang’就解决了
cd ~/emacs                                                                                                                                       
./autogen                                                                                                                                      
./configure --with-nativecomp CC='clang'                                                                                                       
make            

native-comp默认的编译优化级别是O2,这样在第二步时编译ELC+ELN时会花很久(我当时不知道,然后编了9个小时…当然也是因为我只开了一个进程,在make时加上-jn可以开n个进程同时编译),可以在lisp/emacs-lisp/comp.el中改comp-speed这个变量,改成0或1

Emacs编译成功后,就可以进去执行(native-comp-async “~/.config/emacs/elpa” n t) (n同上,指开几个进程)把自己安装的包也编译一下。编译完后速度快到飞起,lsp-mode无丝毫卡顿

12 个赞

录个视频、gif 让我们羡慕一下速度 :blush:

1 个赞

gcc 用brew 安装的不可以吗?

就说company吧,我现在把company-idle-delay设为了0,可以看到company list更新和字母键入几乎是同时的,没有卡顿,原来我用emacs 27还是有卡顿的 out

Homebrew-core现在不让加options了,安装的gcc是没有jit的。native-comp需要jit,也就是libgccjit.so这个库的支持,所以得自己编译

看这个 gif 的效果和我用 emacs-git 没啥区别。。

company

还能用 debug-on-entry 调试 elisp 函数吗?descrbe-function 能否跳至源代码?

可以试试 Nix,官方已有编译 emacs 的例子:nixpkgs/nixos/modules/services/editors/emacs.nix at master · NixOS/nixpkgs · GitHub @purcell 也提供了一个:nix-emacs-ci/emacs.nix at master · purcell/nix-emacs-ci · GitHub

  1. 你这不是关公战秦琼嘛,同一台电脑上的比较才有意义。
  2. 录屏画面不能完全反应真实情况,它的精确度取决于画面采样帧率。

刚测试了,debug-on-entry可以用,describe-function能跳至源代码

1 个赞

不错,不错,native-comp很爽。

1 个赞

你的macos是什么版本。 gcc那步编译不过(卡在make

bconfig.h is unchanged
g++ -c   -g  -DIN_GCC -fPIC   -fno-strict-aliasing -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-string
s -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings   -DHAVE_CON
FIG_H  -DGENERATOR_FILE -fno-PIE -I. -Ibuild -I../.. -I../../build -I../../../include  -I../../../libcpp/include  \
                -o build/genmodes.o ../../genmodes.c
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
make: *** No rule to make target `../build-x86_64-apple-darwin18.7.0/libiberty/pic/libiberty.a', needed by `build/genmodes'.  Stop.

另外确认一下 是只需要在

../src/configure --enable-host-shared --enable-languages=jit,c,c++,objc,obj-c++ --enable-checking=release --disable-bootstrap          

这个configure 是执行的根目录下的configure ,还是子目录gcc下的

惭愧,一直没时间折腾 native-comp。一直对它很感兴趣,也报有极大期望。

明天试一下,你一说lsp速度会更快,我就觉得有必要一试

我以为只有windows上编译libgccjit时报这个错,macos上也报错。除了linux,只要加上编译libgccjit的选项就报。

报错说少的 pic/libiberty.a ,那就建目录,copy一个已经编译好的libiberty.a过去,find 一下能找到的。貌似gcc的configure的脚本写得有问题。

可以 brew edit gcc, 在 languages 里加上 jit, args 里添加 --enable-host-shared, 然后再 brew install gcc

3 个赞

赞,这个好。不过安装的时候要用 brew install -s gcc

1 个赞

我好像没遇到这个问题,我是mojave

configure是根目录下的configure,抱歉原帖中有误,是将gcc clone到~/jit/src目录,现在已经改过来了

这个输入Exp就有个提示 是用的哪个package?还是?

company-mode, 把 company-minimum-prefix-length设成2的效果

看起来 native-comp 挺折腾/费时的,我这破电脑(当大家都在讨论如何把启动时间优化到1秒以内,我只要不破百就没啥抱怨了)没几天怕是编不完,还是耐心等二进制包吧。

但是 homebrew 不太指望了,估计那时它已抛弃 macOS 10.12 。

看到 native-comp 补丁作者最近的留言,希望他对 Nix 感兴趣,然后再贡献一个 emacs-nativecomp.nix: Package request: libgccjit (for trying gccemacs) · Issue #75288 · NixOS/nixpkgs · GitHub

我给 emacs-plus 提过一个 request,作者好像有兴趣加。

1 个赞