Installing Emacs 30.1 On Arch and SUSE
Seems to be a common post at the moment, so I thought I would quickly put out there how I updated to Emacs 30.1.
I use an Arch spin called Garuda, running SwayWM, so as its on wayland, this for me is simple, just update the system using pacman -Syu
and emacs-wayland
will pull in 30.1 automatically!
For my other environments, or if I want to build old versions of Emacs from source, I use the following script:
#!/bin/bash
# Directory for Emacs builds
BUILD_ROOT="$HOME/emacs-builds"
INSTALL_ROOT="$HOME/emacs-versions"
# Build dependencies for different distributions
ARCH_BUILD_DEPS="base-devel gtk2 gtk3 libxpm libjpeg-turbo libpng libtiff giflib libxml2 gnutls librsvg"
SLES_BUILD_DEPS="gcc gcc-c++ make automake gtk2-devel gtk3-devel libXpm-devel libjpeg8-devel libpng16-devel libtiff-devel giflib-devel libxml2-devel gnutls-devel cairo-devel harfbuzz-devel librsvg-devel"
# 27.2 2021-03-25
# 28.2 2022-09-12
# 29.4 2024-06-22
VERSIONS=(
"emacs-27.2"
"emacs-28.2"
"emacs-29.4"
"emacs-30.1"
)
# Detect OS
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$NAME
else
OS=$(uname -s)
fi
}
function prepare_environment() {
echo "Creating build directories..."
mkdir -p "$BUILD_ROOT"
mkdir -p "$INSTALL_ROOT"
detect_os
echo "Detected OS: $OS"
case "$OS" in
*"SLED"*|"SLES"*|*"SUSE"*)
echo "Installing build dependencies for SUSE SLES..."
sudo zypper refresh
sudo zypper install -y pattern-devel-base-devel
sudo zypper install -y $SLES_BUILD_DEPS
;;
*"Garuda"*)
echo "Installing build dependencies for Arch Linux..."
sudo pacman -Syu --needed --noconfirm $ARCH_BUILD_DEPS
# Check if we have yay for AUR access (optional)
if ! command -v yay &> /dev/null; then
echo "Installing yay (AUR helper)..."
cd /tmp
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si --noconfirm
fi
;;
*)
echo "Unsupported OS detected: $OS"
echo "Please install build dependencies manually and continue."
read -p "Press Enter to continue or Ctrl+C to abort..."
;;
esac
}
function build_emacs() {
local version=$1
local build_dir="$BUILD_ROOT/$version"
local install_dir="$INSTALL_ROOT/$version"
echo "Building $version..."
# Download and extract
cd "$BUILD_ROOT"
if [ ! -f "$version.tar.gz" ]; then
wget "https://ftp.gnu.org/gnu/emacs/$version.tar.gz"
fi
# Clean previous build if exists
rm -rf "$build_dir"
tar xzf "$version.tar.gz"
# Configure and build
cd "$version"
# Different configure flags for different versions
if [[ "$version" == "emacs-24.5" || "$version" == "emacs-25.3" ]]; then
# Older versions use GTK2
./configure \
--prefix="$install_dir" \
--with-x-toolkit=gtk2 \
--with-xpm \
--with-jpeg \
--with-png \
--with-gif \
--with-tiff \
--with-gnutls \
--with-xml2 \
--with-rsvg
else
# Newer versions use GTK3
./configure \
--prefix="$install_dir" \
--with-x-toolkit=gtk3 \
--with-xpm \
--with-jpeg \
--with-png \
--with-gif \
--with-tiff \
--with-gnutls \
--with-xml2 \
--with-cairo \
--with-harfbuzz \
--with-rsvg
fi
# Use all available cores for compilation
make -j$(nproc)
make install
echo "$version installed to $install_dir"
}
function create_pkgbuild() {
# Only create PKGBUILD for Arch Linux
if [[ "$OS" != *"Arch Linux"* ]]; then
echo "PKGBUILD creation is only supported on Arch Linux"
return 1
fi
local version=$1
local version_num=${version#emacs-}
echo "Creating PKGBUILD for $version..."
mkdir -p "$BUILD_ROOT/pkgbuilds/$version"
cd "$BUILD_ROOT/pkgbuilds/$version"
cat > PKGBUILD << EOF
# Maintainer: Your Name <your.email@example.com>
pkgname=$version
pkgver=$version_num
pkgrel=1
pkgdesc="GNU Emacs version $version_num"
arch=('x86_64')
url="https://www.gnu.org/software/emacs/"
license=('GPL3')
depends=('gtk3' 'libxpm' 'libjpeg-turbo' 'libpng' 'giflib' 'libtiff' 'libxml2' 'gnutls')
makedepends=('base-devel')
provides=("emacs-$version_num")
conflicts=("emacs")
source=("https://ftp.gnu.org/gnu/emacs/emacs-\$pkgver.tar.gz")
sha256sums=('SKIP')
build() {
cd "\$srcdir/emacs-\$pkgver"
./configure \\
--prefix=/usr \\
--sysconfdir=/etc \\
--libexecdir=/usr/lib \\
--localstatedir=/var \\
--with-x-toolkit=gtk3 \\
--with-xpm \\
--with-jpeg \\
--with-png \\
--with-gif \\
--with-tiff \\
--with-gnutls \\
--with-xml2
make
}
package() {
cd "\$srcdir/emacs-\$pkgver"
make DESTDIR="\$pkgdir" install
}
EOF
}
# Main execution
echo "This script provides two methods to build Emacs:"
echo "1. Direct compilation (traditional)"
echo "2. Using makepkg (Arch Linux only)"
read -p "Which method do you prefer? (1/2): " build_method
case $build_method in
1)
prepare_environment
for version in "${VERSIONS[@]}"; do
build_emacs "$version"
done
# Create convenience symlinks
mkdir -p "$HOME/bin"
echo "Creating version-specific symlinks..."
for version in "${VERSIONS[@]}"; do
ln -sf "$INSTALL_ROOT/$version/bin/emacs" "$HOME/bin/emacs-${version#emacs-}"
done
;;
2)
detect_os
if [[ "$OS" != *"Arch Linux"* ]]; then
echo "makepkg method is only supported on Arch Linux"
exit 1
fi
prepare_environment
for version in "${VERSIONS[@]}"; do
create_pkgbuild "$version"
echo "PKGBUILD created for $version"
echo "To build, cd to $BUILD_ROOT/pkgbuilds/$version and run 'makepkg -si'"
done
;;
*)
echo "Invalid option selected"
exit 1
;;
esac
echo "Build complete. You can run specific versions using:"
for version in "${VERSIONS[@]}"; do
echo "emacs-${version#emacs-}"
done