A native build of Emacs for macOS/ARM64

I recently purchased one of the new MacBook Air models with the M1 chip, and I wanted to try out a “fully native” build of Emacs — where “fully native” means:

There are many different macOS Emacs “distributions” out there, and I wasn’t sure which to choose so I opted to compile Emacs from source myself.

The rest of this post is primarily a guide for my future self, but I’ve published it for anyone else interested in building Emacs from source on macOS. I’m not super familiar with building Emacs from source — these are just the steps that worked for me.

Prerequisites and dependencies

Emacs has a handful of dependencies which can all be installed via Homebrew with the following command:

brew install autoconf texinfo gnutls jansson gcc libgccjit

Next, get the Emacs source code by cloning it from the GitHub mirror:

git clone https://github.com/emacs-mirror/emacs.git --branch emacs-28 --depth 1

Depending on how far in the future you are reading this, the specific branch to use will likely have changed. However, never forget to specify --depth 1 as it reduces the download size and speeds up the clone operation tremendously.

Building (and waiting)

This is the important part. Start by running autogen.sh to generate the appropriate configuration utility, then invoke it as follows:

CFLAGS="-I$(brew --prefix libgccjit)/include -I$(brew --prefix gcc)/include"
LDFLAGS="$CFLAGS -L$(brew --prefix gcc)/lib/gcc/11"
CFLAGS="$CFLAGS -O2"

./configure --disable-silent-rules --with-xml2 --with-gnutls \
	--with-native-compilation --with-json --with-modules --with-ns \
	--without-mailutils --without-dbus --without-imagemagick --without-rsvg \
	--without-xpm --without-tiff --without-gif --without-lcms2 \
	--without-libsystemd --without-cairo --without-imagemagick \
	--without-toolkit-scroll-bars

Note: The GCC major version is hardcoded here and will need to be adjusted in the future.

You may want to adjust the feature set and compiler flags as you see fit. Once configure is done running, the rest of the build is rather easy:

make -j8
make install

Assuming all goes well, you should be greeted with a nice “fully-native” Emacs application bundle located in the “nextstep” directory of the Emacs source tree.