在 Windows 上使用 Emacs 的同学,如果试着编译过 Emacs 的话,大部分应该都是在 MSYS2 的 Mingw64 环境下编译,此时 Emacs 会使用 MSVCRT 运行时。
如果在 UCRT64 环境(使用 UCRT 运行时)下编译,可能会在执行 make 后得到类似下面的结果:
./temacs --batch -l loadup --temacs=pbootstrap \
--bin-dest '/d/user/yy/emacs-build/bin/' --eln-dest
'/d/user/yy/emacs-build/lib/emacs/31.0.50/'
D:\user\yy\emacs-master\src\temacs.exe: Write error to standard output: No such
file or directory
MSYS2 上提供的 ucrt Emacs 包打了两个补丁: MINGW-packages/mingw-w64-emacs 。分别是 001-ucrt.patch
和 002-clang-fixes.patch,如果你只应用其中第一个,Emacs 能够正常通过编译,但是可能会出现如下提示:
***
*** "make all" succeeded, but Emacs is not functional.
***
关于在 UCRT 环境上编译 Emacs,之前 Emacs-devel 上大概有如下讨论:
最近的一次讨论可能是和 igc(也就是基于 MPC 的新 gc): MPS: Win64 testers? ,由 igc 分支的主要贡献者 Pip Cet 提出,然后 Angelo Graziosi 提到可以使用 MSYS2 里面的两个 patch(也就是上面提到的那两个)。Eli Zaretskii 也提到了为什么 Emacs 没有正式的 UCRT 支持:
TBH, I don’t know enough about the differences. UCRT is supposed to
be more modern, and so more compatible with ANSI C and perhaps also
with Posix. (However, MinGW has for a very long time a support
library which provides ANSI C compliant implementations of various
functions, so this problem is largely solved even without UCRT.)
The fact that we don’t have experts who can answer these questions is
one serious indication that dedicated support persons are needed if we
want to be able to use whatever good features UCRT provides to Emacs’s
benefit.
Re: MPS: Win64 testers?
今天偶然翻 emacs master commit 的时候我注意到这个 commit 似乎解决了 UCRT 上的问题,实际编译了一下也没有任何问题:(默认 ./configure 配置)
关于这个 commit,具体的讨论可以看这里: Re: MPS: Win64 testers?, Quang Kien Nguyen ,从名字来看应该是个越南人。之前我倒是尝试过折腾 UCRT bug#72335: An attempt to fix UCRT64 build failure ,属于是瞎折腾。
有时间的话,我会在这个帖子下面贴一下关于这个 commit 的具体讨论内容。
7 个赞
最新的 commit 不需要你上面提到的 patch 就可以编译 UCRT Emacs 了?
另外,请问下 UCRT64 相对 Mingw64 (MSVCRT) 有什么优势吗?
0af
2024 年8 月 12 日 11:58
3
1 个赞
是的。
我也不知道,不过至少它更加新一点,可能 POSIX 更兼容一点或者 C 标准支持更好?
The UCRT also implements a large subset of the POSIX.1 (ISO/IEC 9945-1:1996, the POSIX System Application Program Interface) C library. However, it’s not fully conformant to any specific POSIX standard. The UCRT also implements several Microsoft-specific functions and macros that aren’t part of a standard.
Compatibility | Microsoft Learn
对我们普通用户来说,应该没什么区别
2 个赞
刚刚重新编译了一下 Emacs 31,UCRT 版本的 Emacs 在 Windows 上直接起飞了,启动时间 0.903196 seconds。使用上也感觉流畅了很多。(同样电脑,同样 Emacs 配置在 mingw64 下的启动要 1.4s 左右)
在 UCRT64 中安装了下面的依赖后,就可编译了:
pacman -S --needed base-devel \
mingw-w64-ucrt-x86_64-toolchain \
mingw-w64-ucrt-x86_64-xpm-nox \
mingw-w64-ucrt-x86_64-gmp \
mingw-w64-ucrt-x86_64-gnutls \
mingw-w64-ucrt-x86_64-libtiff \
mingw-w64-ucrt-x86_64-giflib \
mingw-w64-ucrt-x86_64-libpng \
mingw-w64-ucrt-x86_64-libjpeg-turbo \
mingw-w64-ucrt-x86_64-librsvg \
mingw-w64-ucrt-x86_64-libwebp \
mingw-w64-ucrt-x86_64-lcms2 \
mingw-w64-ucrt-x86_64-libxml2 \
mingw-w64-ucrt-x86_64-zlib \
mingw-w64-ucrt-x86_64-harfbuzz \
mingw-w64-ucrt-x86_64-libgccjit \
mingw-w64-ucrt-x86_64-sqlite3 \
mingw-w64-ucrt-x86_64-tree-sitter
( 参考 emacs/nt/INSTALL.W64 at master · emacs-mirror/emacs · GitHub 修改)
可惜 Emacs 30 还是没法在 UCRT 下编译。看来又多了一用 Emacs 31 的个理由。
13 个赞
ucrt 版本, Windows 10 启动 Emacs 后第一次打开 org 也快很多了, 直接减少了6秒左右(在我的电脑与之前的对比)
1 个赞
可以直接用这个编译好的不? 我看文件名里有 ucrt
https://github.com/kiennq/emacs-build/releases/download/v31.279.20240807.fa1ecbf/emacs-fa1ecbf-ucrt-x86_64-full.zip
可以用scoop安装
scoop bucket add kiennq-scoop https://github.com/kiennq/scoop-misc
scoop install emacs-k
可以的, 我用的就是这里下载的, 就是这个 fa1ecbf - ucrt
0af
2024 年8 月 14 日 12:51
10
31 及之后的 Release 是不是也会提供 ucrt 版本了?
没看到有相关的讨论。目前还没官方说支持 UCRT。
ltylty
2024 年8 月 16 日 02:37
12
我试用了两天。 和之前的Emacs29.4相比,速度上几乎没有提升。
打开的方式不对?
修复的 Commit 是 8 月 9 号的,7 号的 build 应该没有应用这个补丁吧…
ltylty
2024 年8 月 16 日 02:52
14
我昨天更新了最新8.15的版本, 速度也没有提升。
ltylty
2024 年8 月 16 日 03:03
15
可能和gc的配置有关系。 我的配置里面有这一行,这个配置会明显提高emacs29的启动速度。
(setq gc-cons-threshold most-positive-fixnum)
但是在Emacs31中去掉这个配置,启动速度也比较快。和Emacs29加上这个配置的速度相当。
Emacs29启动之后的内存占用50MB,Emacs31是150MB。
至于首次打开org文件的速度,我这边29和31都需要四秒的样子。
1 个赞
看来性能提升还是个很主观的问题。
等会我写个 benchmark,有时间的同学可以跑跑看。我给出我的结果…
1 个赞
如果你对测测新的 UCRT 性能感兴趣的话,这里我给出如何在 Windows 上通过 MSYS2 的 mingw64 和 ucrt 64 环境编译 Emacs 的教程,benchmark 在下一个帖子给出。
如何在 Windows 上编译 Emacs
首先,前往 MSYS2 获取 MSYS2,完成安装后它会默认打开一个 UCRT 终端。如果找不到各个 MSYS2 shell,可以通过 Win + 搜索找到:
在命令提示符中,依次输入以下命令,安装一些基本软件:
pacman -Syu
pacman -S git
pacman -S texinfo
git config --global core.autocrlf false
可以通过以下 git
命令拉去最近的 Emacs 源代码,考虑到需要对比 MSVC 和 UCRT 运行时,拉取后可以复制,然后分别命名文件夹为 emacs-msvc 和 emacs-ucrt。
git clone https://github.com/emacs-mirror/emacs --depth 1
随后,分别在 mingw64 和 ucrt64 环境中执行以下命令安装 Emacs 依赖的基本软件(由于我们只是测试基础的性能,不需要其他的一些包):
pacman -S "${MINGW_PACKAGE_PREFIX}-autotools"
pacman -S "${MINGW_PACKAGE_PREFIX}-gcc"
pacman -S "${MINGW_PACKAGE_PREFIX}-gnutls"
pacman -S "${MINGW_PACKAGE_PREFIX}-make"
接着,分别在两个不同的源代码目录下,分别使用 mingw64 和 ucrt64 环境,执行以下命令(没有 native-compile 支持):
./autogen.sh
./configure --with-native-compilation=no
make -j16
在完成编译后,我们可以在 emacs 源代码目录中的 nt
目录下找到 runemacs.exe
可执行文件,在 SHELL 环境中(不能通过鼠标点击打开,或者是 cmd 或 powershell 打开,因为它们没有可用的 SHELL 环境)执行 ./runemacs.exe -Q
即可启动 Emacs。Emacs 的可执行文件位于 src
目录下,但是我们只需要用到 runemacs.exe。
(Mingw64 也同理)
关于测试
由于是相对性能测试,所以具体的操作系统,CPU,内存等信息可能不是非常重要,不过在跑完 benchmark 之后,给出一些相关信息也许更好。把以下信息放在帖子的最前面也许可以作为一种规范:
CPU 和内存信息
操作系统信息
拉取的 Emacs commit
MSYS2 中的 gcc 版本
Emacs 的 (emacs-version)
输出
下面是一个例子:
CPU: AMD Ryzen 5 7640HS, RAM: 32GB
OS: Windows 11 23H2 22631.4037
emacs-mirror/emacs@4f1987c
gcc.exe (Rev1, Built by MSYS2 project) 14.2.0
“GNU Emacs 31.0.50 (build 1, x86_64-w64-mingw32) of 2024-08-18”
以上。我去找点可以测的代码。
3 个赞
草,给我整不会了
MSYS2 提供了 clang 环境 clang64,我试试能不能编译成功。这样可以比较一下同样是 gcc 的 ucrt64 和 mingw64 环境,它们分别用了 msvcrt 和 ucrt,以及比较一下同时使用 UCRT 运行时的 ucrt64 和 clang64 环境。
他就是把参数转换成msvc,msvc的速度和gcc相比并没有显著提升