On Mac, I sometimes run a prebuilt binary and sometimes compile my own. For Apple M1 (ARM) I started by using the x86 binaries from emacsformacosx.com but I wanted to try compiling a native ARM version too. I saw that the work
branch of Mitsuharu Yamamoto's Mac port has M1 patches applied, so I decided to try it.
Make sure /opt/homebrew/bin
(ARM homebrew) is earlier in your path than /usr/local/bin
(Intel homebrew).
EMACSAPP=$HOME/Applications brew install coreutils pkg-config libxml2 jansson gnutls autoconf gnu-sed git clone --depth 1 --single-branch --branch work \ https://bitbucket.org/mituharu/emacs-mac.git cd emacs-mac ./autogen.sh
and then build:
make clean find . -name \*.elc -exec rm '{}' ';' ./configure \ --with-mac-metal --with-xml2 --without-imagemagick --with-json \ --with-modules --without-makeinfo \ --prefix=$EMACSAPP/Emacs.app/Contents/MacOS \ --enable-mac-app=$EMACSAPP --enable-mac-self-contained make -j3 mac/Emacs.app/Contents/MacOS/Emacs -q # test it make install
You should see it bring up a window with:
This is GNU Emacs 27.1 (build 1, aarch64-apple-darwin20.1.0, Carbon Version 164 AppKit 2022.1) of 2020-11-30 Copyright (C) 2020 Free Software Foundation, Inc.
Updates
As various packages were made available in Homebrew, the situation improved.
- [2020-11-30] Other parts of homebrew weren't complete enough for me to compile modules like vterm, so I temporarily switched back to emacsformacosx.com emacs
- [2020-12-01] The emacsformacosx.com version flickrs a lot when using Rust + LSP + posframe, due to this issue, so I switched back to the Mac Port, but compiled for x86.
- [2020-12-03] I had some issues with *.elc files from previous compiles not being recompiled so I ended up deleting all the *.elc files in the emacs build folder, and that resolved the problem.
- [2020-12-05] I also had to recompile all the *.elc files in elpa modules, with
(byte-recompile-directory "~/.emacs.d/elpa" 0 t)
. - [2020-12-07] I switched back to the ARM version, which works now. It seems faster but I don't know a good way to measure.
- [2020-12-13] Modules like vterm seem to work now.
- [2021-01-07] I learned that Homebrew emacs, emacs-plus, and railwaycat emacs now work on arm. I'm happy with the version I compiled, but these would be the first things to try if you don't want to compile your own.
8 comments:
Subscribe to:
Post Comments (Atom)
How long did it take to compile and install?
Did it feel any faster than the Intel version?
Could you run any comparative benchmark?
It took around 30 seconds to compile (!) but didn't feel faster than the Intel version, and I'm back on the Intel emulation version. Everything else I'm running right now (like homebrew and rust) are Intel emulation so it was easier to stick to that for now.
@Anonymous: I ran
(benchmark-run-compiled 100 (cl-loop for i below (* 1000 1000) sum i))
Intel version from emacsformacosx.com: 2.54s
Intel version compiled myself: 2.70s
ARM version compiled myself: 1.73s
Hello, thank you for taking the time to write this blog.
I followed the same steps as you but appear to be getting an error at the `make -j3` stage.
I haven't been able to find much info about this error, any idea how to get around it?
```
CCLD temacs
/opt/homebrew/bin/gmkdir -p ../etc
/Library/Developer/CommandLineTools/usr/bin/make -C ../lisp update-subdirs
cp -f temacs bootstrap-emacs
rm -f bootstrap-emacs.pdmp
./temacs --batch -l loadup --temacs=pbootstrap
make[1]: *** [bootstrap-emacs.pdmp] Killed: 9
make: *** [src] Error 2
make -j3 59.16s user 4.50s system 270% cpu 23.539 total```
For further info, I'm running this on an M1 MacBook Air that arrived today, I'm gonna try updating the OS and re-running.
Never mind, I retraced my steps and spotted a mistake (cloned the repo myself earlier, then came across the tutorial - I didn't clone the same branch as you). It works now! Thanks again for sharing your steps on this blog.
Anonymous: glad you got it working! I think the main branch doesn't have the ARM patches yet.
I'm having the same problem with ./temacs getting killed. I looked at the crash report and it's due to a code sign invalid error. When I run that failing command inside "lldb" it actually runs fine, then typing make I get the same killed 9 for the next thing it tries to run `EMACSLOADPATH= '../src/bootstrap-emacs' -batch --no-site-file --no-site-lisp --eval '(setq load-prefer-newer t)' -f batch-byte-compile international/titdic-cnv.el`
I wonder how I can convince the system to not keep killing these processes, and why they aren't "signed" correctly (just building a test program with `gcc -o foo foo.c` runs fine.
Found the issue. The code was not being signed b/c:
Configured for 'aarch64-apple-darwin20.3.0'.
and in one of the Makefiles it was expecting that to start with 'arm-apple-darwin' to enable 'codesign -s - ..'
I changed the makefile, and got past the issue.
Post a Comment