Table of Contents
1. 在Linux上编译emacs-feature-igc分支的个人方法
1.1. 基本介绍
1.1.1. 什么是 igc?什么是 mps?
首先在 真-lisp
的编程语言,都是自带了一个 GC 垃圾回收机制
比如 scheme、common lisp、elisp 这些 lisp 方言,都自带了 GC 垃圾回收机制
然而在 mock-lisp(伪-lisp)
的编程语言下就 没有GC垃圾回收机制
比如Rust写的一个eww桌面组件,就是用的 [yuck] 这门伪lisp编程语言去编写结构的
那么这样一来,我们的GNU Emacs用的是elisp,所以我们的GNU Emacs就天生就有了GC机制?
对啊!GNU Emacs它天生就有GC机制
然后有些佬,嫌这个GNU Emacs的GC机制控制得不够自由,于是就硬是用Cpp重新造了一个 新的GC机制 的 The (M)emory (P)ool (S)ystem
出来
于是这个 新的GC机制 就称呼为 (I)ncremental GC
语义为 增量GC,Delta GC
的意思,简称I-G-C,所以最后简称igc
它用到的库文件,叫做 The (M)emory (P)ool (S)ystem 的 mps 所以一会要安装 libmps 就是这么来的
1.2. 安装方法
BYD,检测 libmps.h 的 ./configure checking 折磨了我贼久
1.2.1. libmps库文件的安装
libmps大致信息 .a 静态文件部分 🔧 libmps.a 🔧 libmps-debug.a .h 头文件部分 🔧 mpsacl.h 🔧 mpsavm.h 🔧 mpscamc.h 🔧 mpscams.h 🔧 mpscawl.h 🔧 mpsclo.h 🔧 mpscmfs.h 🔧 mpscmv2.h 🔧 mpscmvff.h 🔧 mpscmvt.h 🔧 mpscsnc.h 🔧 mps.h 🔧 mpsio.h 🔧 mpslib.h 🔧 mpstd.h 🔧 mpswin.h
需要安装homebrew来安装libmps,如果不想安装homebrew的话,此仓库 里也有 2023年7月11日发布的1.118.0版的Release版本
# 首先在 Linux 上安装 homebrew # 安装2023年版的1.118.0版的mps brew install libmps # 安装最新版的mps brew install libmps --HEAD
随后可以在 /home/linuxbrew/.linuxbrew/Cellar 的 /libmps/1.118.0/
下得到libmps的文件
然后再将 libmps 放到linux系统级的目录下,就完成了libmps的安装
# 很抱歉我说得这么绝对,但必须要复制到系统级的/usr/lib与/usr/include # 这是我碰壁无数次后得出的 [唯一] 最终解决做法 # 因为编译emacs时添加关于libmps文件的CFLAGS与LDFLAGS选项在我这里是没有任何效果的! sudo cp *.h /usr/include sudo cp *.a /usr/lib
1.2.2. emacs-feature-igc的编译选项
点击直达: emacs-feature-igc
而且推荐: 6654ac61342a0a2ffef50435d026cae09314ad5c
这个提交点的emacs 点击直达,因为运行十分稳定,在 [我个人的配置上] 在非配置情况下一次也没有崩溃过
先运行 autogen.sh
从而得到 configure
然后再直接运行,来让 ./configure
获得相关的 编译选项: option
CFLAGS="-fmax-errors=1000" ./configure --sysconfdir=/etc --prefix=/usr --libexecdir=/usr/lib --with-tree-sitter=ifavailable --localstatedir=/var --disable-build-details --with-harfbuzz --with-libsystemd --with-modules --with-x-toolkit=no --with-mps=yes 'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -g -ffile-prefix-map=/build/emacs/src=/usr/src/debug/emacs -flto=auto' 'LDFLAGS=-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-z,pack-relative-relocs -flto=auto'
然后等待配置完成就行了
- 期间一定要注意: 必须是 mps.h…..yes,不能是The libmps is missing!才算识别到mps库文件!!
- 期间一定要注意: 必须是 mps.h…..yes,不能是The libmps is missing!才算识别到mps库文件!!
- 期间一定要注意: 必须是 mps.h…..yes,不能是The libmps is missing!才算识别到mps库文件!!
1.2.3. 检验是否安装成功
进入GNU Emacs后,执行 M-x igc-stats
并在打开的新buffer上,按 wasd
的 s
如果能出现
IGC_OBJ_BLV 854 40992 48 48 IGC_OBJ_BUILTIN_SUBR 0 0 0 0 IGC_OBJ_BUILTIN_SYMBOL 0 0 0 0 IGC_OBJ_BUILTIN_THREAD 0 0 0 0 IGC_OBJ_BYTES 0 0 0 0 IGC_OBJ_CONS 1876951 45046824 24 24 .......................................................................................
这样的提示文字,就能说明 mps 起效果了!
如果是 The Symbol igc-stats is void
的话,那么 一定是你自己在 emacs-feature-igc 分支源码包下的 ./configure 内,没有让它识别到libmps库文件!请你自己重新查看文档安装!