native-comp分支的bootstrap时间实在是太长了,而且大部分时间都消耗在native-comp阶 段 (ELC+ELN) 导致 make -jN 的多线程执行基本没有什么优化的空间. 趁电脑编译emacs的时 候, 分享一下如何在 Archlinux 上编译 native-comp 分支.
- 克隆 GCC 仓库
Archlinux 官方源里使用的 GCC 版本可以在这 里 找到.
我们用如下命令克隆对应版本的 GCC 源码
git clone -b releases/gcc-9 --depth=1000 https://github.com/gcc-mirror/gcc
为什么要用 Github 镜像? 因为 GNU 家的小水管速度只有每秒几 KB, 用 Github 镜像加上 代理后我速度达到了每秒 3M, 血与泪的教训.
- 获取 libgccjit PKGBUILD
git clone https://aur.archlinux.org/libgccjit.git
我们不能直接用这个 PKGBUILD, 因为已经很久没有人维护了, GCC 的版本都与 Arch repo 使用的版本脱节了, 在这里稍做修改, 指定 PKGBUILD 使用我们本地的 repo. 之所以不直 接改这个 PKGBUILD 的源, 是因为 makepkg 对于 gitrepo 只会傻乎乎的做全量克隆, 全量 克隆一个 GCC 仓库是要吐的.
diff --git a/PKGBUILD b/PKGBUILD
index 06510e7..dc35e5d 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -14,10 +14,10 @@ license=(
'GPL3'
)
source=(
- "ftp://gcc.gnu.org/pub/gcc/releases/gcc-$_gccmajor/$_gccsrc.tar.xz"
+ "libgccjit::git+file:///path/to/gcc#commit=6957d3e4eef1f4243eb23ff62aea06139ef4415a"
)
# "https://sources.archlinux.org/other/gcc/gcc-8.2.1-20180831.tar.xz"
-sha512sums=('a12dff52af876aee0fd89a8d09cdc455f35ec46845e154023202392adc164848faf8ee881b59b681b696e27c69fd143a214014db4214db62f9891a1c8365c040')
+sha512sums=('SKIP')
arch=(
'i686'
'x86_64'
修改完成后, 安装
makepkg -si
- 编译 emacs
git clone https://github.com/emacs-mirror/emacs
git checkout feature/native-comp
./autogen.sh
./configure --with-nativecomp # 重要
make
- 遇到的问题
- 第一次编译时在编译完 C 代码, 开始执行 ELC+ELN 时 ld 报错找不到
crtbeginS.so然后编译失败. 解决方案为编译前设置环境变量export LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.1