站内关于windows下编译native-comp分支的帖子已经不少了,开这个帖子是因为我在实际使用过程中发现windows下编译和使用native-comp分支还做不到开箱即用,有一些坑需要额外注意,所以贴出来分享一下。
坑:
-
2021年2月26的commit 42fc752a14b23be95f02b598930f13a96883d3a0 将
--with-nativecomp
重命名为--with-native-compilation
-
build依赖
我google了一下,关于mingw64编译emacs需要的依赖的说法五花八门,可能是因为emacs有很多可选的依赖吧,这里我分享一下我自己编译用的(建议在这之前先pacman -Syu):
pacman -S --needed base-devel gcc git\
mingw-w64-x86_64-toolchain \
mingw-w64-x86_64-xpm-nox \
mingw-w64-x86_64-libtiff \
mingw-w64-x86_64-giflib \
mingw-w64-x86_64-libpng \
mingw-w64-x86_64-libjpeg-turbo \
mingw-w64-x86_64-librsvg \
mingw-w64-x86_64-lcms2 \
mingw-w64-x86_64-jansson \
mingw-w64-x86_64-libxml2 \
mingw-w64-x86_64-gnutls \
mingw-w64-x86_64-zlib \
mingw-w64-x86_64-harfbuzz
- clone源码的时候建议用github上的镜像,或者码云的镜像(感谢@SpadedotS提醒)官方那个源速度不稳定。。
#github mirror
git clone -b feature/native-comp --depth=1 https://github.com/emacs-mirror/emacs.git
#码云gitee mirror
git clone -b feature/native-comp --depth=1 https://gitee.com/mirrors/emacs.git
#official git repo
#git clone -b feature/native-comp --depth=1 https://git.savannah.gnu.org/git/emacs.git
-
configure的时候建议加上–without-dbus,没有这个最后编译成的emacs没有w32-notification-notify
-
当用快捷方式启动的时候,emacs似乎不会完整的继承msys2的环境,有些运行所必须的dll和exe文件即使跟emacs.exe放在同一文件夹下面也可能不被emacs识别,解决方法是把相关文件夹放到PATH里面或者加入到exec-path,例如
;;put msys2 bin folder in $PATH
;;msys2安装的根目录,请根据实际情况修改
(let ((msys2root "C:\\scoop\\apps\\msys2\\current\\"))
(setenv "PATH" (concat
msys2root "mingw64\\libexec\\emacs\\28.0.50\\x86_64-w64-mingw32" ";"
msys2root "mingw64\\bin" ";"
msys2root "usr\\bin" ";"
(getenv "PATH")))
;;without this the new added $PATH value won't be inherite by exec-path
(setq exec-path (split-string (getenv "PATH") path-separator)))
Tips
- 国内有TUNA和USTC的源,把
/etc/pacman.d/
里面3个mirrorlist文件中除这两个之外的行删掉下载速度就上去了 -
make NATIVE_FULL_AOT=1
强制把所有el文件提前编译成eln,用了这个编译时间会大幅增加 -
make install
的时候如果不指定prefix的话是会直接安装到msys2目录下,不讲究的话可以这样用 - 如果需要卸载的话在源码目录里面
make uninstall
就可以了,安装新版本的时候建议先卸载(?)
Build Procedure
最后贴一下完整的编译过程吧,亲测用msys2.org提供的exe安装程序或者scoop安装的msys2都适用。
- 首先启动Msys2 MinGW64 Shell(蓝色图标那个)
$: pacman -Syu #第一次更新pacman可能会让你关掉terminal再重启
$: pacman -S --needed base-devel gcc git\
mingw-w64-x86_64-toolchain \ #libgccjit应该是包含在toolchain里,安装完后pacman -Qs libgccjit 确认下
mingw-w64-x86_64-xpm-nox \
mingw-w64-x86_64-libtiff \
mingw-w64-x86_64-giflib \
mingw-w64-x86_64-libpng \
mingw-w64-x86_64-libjpeg-turbo \
mingw-w64-x86_64-librsvg \
mingw-w64-x86_64-lcms2 \
mingw-w64-x86_64-jansson \
mingw-w64-x86_64-libxml2 \
mingw-w64-x86_64-gnutls \
mingw-w64-x86_64-zlib \
mingw-w64-x86_64-harfbuzz
$: git clone -b feature/native-comp --depth=1 https://github.com/emacs-mirror/emacs.git
$: cd emacs
$: git checkout feature/native-comp
$: ./autogen.sh
$: ./configure --with-native-compilation --without-dbus --with-modules
$: make -jN #N是你的CPU线程数
$: make install prefix=/path/to/your/emacs/installaion/
如果哪里出错了记得make clean
之后重新configure再make
Misc
- 建议在windows上添加一个$HOME变量来设置一个home文件夹,方便自定义配置文件的位置,很多*nix常用软件的windows port包括msys2都会把这个文件夹当home用。
- msys2环境的默认home在
<msys2安装目录>/home/<你的windows用户名>/
,msys2的有些程序例如openssh只认这个home,暂时不清楚为什么。 - native-comp 分支编译eln文件依赖于一些可执行文件,例如as.exe,ld.exe,理论上把这些文件和运行必须的dll文件跟emacs一起打包应该就不用依赖于msys2的环境运行了,这个问题emacs-devel上正在讨论
-
Warning: arch-dependent data dir '%emacs_dir%/libexec/emacs/28.0.50/x86_64-w64-mingw32/': No such file or directory
这个错误不影响使用,原因未知。