windows上用msys2编译native-comp分支踩坑

站内关于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 这个错误不影响使用,原因未知。
11 个赞

感谢楼主分享,我更换一台电脑可以正常编译并且安装成功了。原来的make 报错估计是系统少了某个path,还没找到原因。

兄弟,编译好的版本能共享出来吗

前几天楼主分享过一份,你试试看。 https://pan.baidu.com/s/1JJfJtr3Rv1lWsEefz11Nbw 提取码: zpct

跟着做一遍,总算成功了,感谢。 大佬用的是doom吗?

我发现这个版本的Emacs 在 C-x,b 的时候 只能显示一个预选。比如下图中明明有三个,但是minibuffer不会自动变高,需要C-n 才能向下浏览。 image

同样配置在非native-comp下是正常的。

PS: 估计还是配置问题,另外一台电脑又是好的。

也可以拷贝国内码云上的镜像码云地址,速度更快

感谢分享踩坑经验 :+1:

1 个赞

能问下你们看的官方该当是在哪里看的?doom的命令都没办法使用了

没试过doom,虽然从doom抄了很多配置 :joy:, msys2并不是一个完整的linux环境,有可能有些包或者lib不全,还有就是路径和linux也不完全一样,比如home文件夹实际是在<msys2根目录>/home/<windows用户名>/等等,这些问题你要自己debug了。。。

编译文档源码目录里面那些README,INSTALL就是,也能在网上搜到

嗷这个我当时打包的时候没打包native-comp需要的可执行文件 ,启动是能启动的,但是应该没法编译eln文件 :rofl:,建议装一个msys2自己编译下或者把我打包的这个bin文件夹下dll文件全删了然后覆盖到msys2安装目录的mingw64文件夹里面

好的 谢谢 我也不着急 多关注下论坛里面的大大

踩到一个坑:
之前自作聪明,通过mklink /j <tatget path> <source path> 创建.emacs.d 链接到另外一个文件夹。这种方式对native Emacs 的编译会造成影响,会出现一些小问题。恢复成 真身的 .emacs.d 后没问题了。这个问题是同样存在于Mac 系统。希望对后来者有所帮助。

之前27.1版本z在windows上试过用软链接把.emacs.d重定向,没什么问题就是启动时间加倍了,win的IO是真捉鸡。。。

确实,我说启动时间怎么从5s变成了10s,开始还以为是native comp的锅

用了selectrum? 如果是,这是selectrum新功能,关于窗高的设置默认是 auto,所以只显示一个,这种情况下C-p或者向上箭头会变成多行;C-n或者向下箭头,会显示剩余的选项

(setq-default selectrum-fix-vertical-window-height t) 就是固定窗高

1 个赞

原来是selectrum 的原因,我还以为是consult 改变的行为。多谢指点 :+1:

今天重新在 msys2 上编译 Emacs navtive-comp 又踩了下面两个坑:
参考 emacs 目录下的 ./nt/INSTALL.W64 安装指南进行安装

  1. clone 仓库时忘记关闭git的 autocrlf 选项,会造成 make 的时候失败。
    通过一下命令即可关闭该选项。
git config --global core.autocrlf false
git clone --depth=1  https://git.savannah.gnu.org/git/emacs.git
  1. 在 mingw64 中 使用了 mingw32-make.exe 这个问题,可以参考 Re: build failure emacs-26 branch on Mingw64

不然会在config 时出现下面的错误:

config.status: creating admin/grammars/Makefile
config.status: creating src/config.h
config.status: executing src/epaths.h commands
sed: -e expression #1, char 79: unknown option to `s'
make: *** [Makefile:398: epaths-force-w32] Error 1
config.status: error: 'src/epaths.h' could not be made.
  1. 新的编译命令
./autogen.sh
./configure --with-native-compilation --without-dbus
make -j$(nproc)

make install prefix=/d/Dev_Tools/emacs28-native
cp $( pacman -Ql mingw-w64-x86_64-{libtiff,giflib,libpng,libjpeg-turbo,librsvg,libxml2,gnutls} | grep bin/.*\.dll$ | awk '{print $2}' ) /D/Dev_Tools/emacs28-native/bin
4 个赞

最近因为 Emacs 配置集成到了 Nix,在Windows 上将 emacs配置文件夹链接到 ~/.config/emacs ,再次踩了这个坑(启动速度慢3s)。

不知道 Windows 上有没有更加高效的软链接方式?

估计没啥特别好的办法,win就是这个样子。。。不过你可以试下硬连接。

:+1:现在用硬链接,这种方式不会影响启动速度。硬链接是不是只支持文件,不支持文件夹?