Skip to content

Instantly share code, notes, and snippets.

@BrandonIrizarry
Forked from abidanBrito/build-emacs.sh
Created November 27, 2022 15:32
Show Gist options
  • Save BrandonIrizarry/45ece0826c1663f4fd8695e1a7767d75 to your computer and use it in GitHub Desktop.
Save BrandonIrizarry/45ece0826c1663f4fd8695e1a7767d75 to your computer and use it in GitHub Desktop.
Bash script to build GNU Emacs 28 from source.
#!/usr/bin/env bash
## Author: Abidán Brito
## This script builds GNU Emacs 28 with support for native elisp compilation,
## libjansson (C JSON library) and mailutils.
# Exit on error and print out commands before executing them.
set -euxo pipefail
# Let's set the number of jobs to something reasonable; keep 2 cores
# free to avoid choking the computer during compilation.
JOBS=`nproc --ignore=2`
# Clone repo locally and get into it.
git clone --branch emacs-28 git://git.savannah.gnu.org/emacs.git
pushd emacs
# Get essential dependencies.
sudo apt install -y build-essential \
texinfo \
libgnutls28-dev \
libjpeg-dev \
libpng-dev \
libtiff5-dev \
libgif-dev \
libxpm-dev \
libncurses-dev \
libgtk-3-dev
#libwebkit2gtk-4.0-dev
#libmagick++-dev
# Get dependencies for gcc-10 and the build process.
sudo apt update -y
sudo apt install -y gcc-10 \
g++-10 \
libgccjit0 \
libgccjit-10-dev
# Get dependencies for fast JSON.
sudo apt install -y libjansson4 libjansson-dev
# Get GNU Mailutils (protocol-independent mail framework).
sudo apt install -y mailutils
# Enable source packages and get dependencies for whatever
# Emacs version Ubuntu supports by default.
#
# Taken from here:
# https://www.masteringemacs.org/article/speed-up-emacs-libjansson-native-elisp-compilation
#sudo sed -i 's/# deb-src/deb-src/' /etc/apt/sources.list \
# && apt update \
# && apt build-dep -y emacs
# Stop debconf from complaining about postfix nonsense.
DEBIAN_FRONTEND=noninteractive
# Needed for compiling libgccjit or we'll get cryptic error messages.
export CC=/usr/bin/gcc-10 CXX=/usr/bin/g++-10
# Configure and run.
#
# Compiler flags:
# -O2 -> Turn on a bunch of optimization flags. There's also -O3, but it increases
# the instruction cache footprint, which may end up reducing performance.
# -pipe -> Reduce temporary files to the minimum.
# -mtune=native -> Optimize code for the local machine (under ISA constraints).
# -march=native -> Enable all instruction subsets supported by the local machine.
# -fomit-frame-pointer -> I'm not sure what this does yet...
#
# NOTE(abi): binaries should go to /usr/local/bin by default.
./autogen.sh \
&& ./configure --with-native-compilation \
--with-json \
--with-gnutls \
--with-mailutils \
--with-cairo
CFLAGS="-O2 -pipe -mtune=native -march=native -fomit-frame-pointer"
# Other interesting compilation options:
#
#--with-pgtk (Emacs 29)
#--with-x-toolkit=gtk3
#--with-xwidgets
#--with-imagemagick
# Build.
#
# NOTE(abi): NATIVE_FULL_AOT=1 ensures native compilation ahead-of-time for all
# elisp files included in the distribution.
make -j${JOBS} NATIVE_FULL_AOT=1 \
&& sudo make install
# Return to the original path.
popd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment