Build ‐ Linux ‐ Fedora - daid/EmptyEpsilon GitHub Wiki

Current as of 2026-01-25 on Fedora 43.

You can build EmptyEpsilon for Linux on Fedora systems. Cross-compilation of Windows builds is not supported on Fedora; see Build ‐ Windows on Linux for instructions compatible with and tested on Debian and Ubuntu.

For generic build instructions and additional options, see Build.

Table of contents

Prerequisites

Install the required packages for compiling EmptyEpsilon from source:

sudo dnf install git gcc gcc-c++ cmake python3 ninja-build SDL2-devel SDL2_gfx-devel \
  SDL2_image-devel SDL2_mixer-devel SDL2_ttf-devel SDL2_net-devel rpm-build

On Fedora 42 and later, SDL2-devel is a metapackage that installs SDL3 with SDL2 compatibility libraries (SDL3-devel and sdl2-compat-devel). Errors in the compatibility libraries might introduce bugs or unexpected behaviors to EmptyEpsilon because it's designed for SDL2. See Build SDL2 from source for an alternative method.

Build EmptyEpsilon from the master branch

Create a working directory, then from within it run:

git clone https://github.com/daid/SeriousProton.git
git clone https://github.com/daid/EmptyEpsilon.git
cmake -S EmptyEpsilon -B EmptyEpsilon/_build -G Ninja -DCPACK_GENERATOR=RPM
cmake --build EmptyEpsilon/_build

To launch the build without installing, run:

(cd EmptyEpsilon && _build/EmptyEpsilon)

To install this build globally on your local system, run:

sudo cmake --build EmptyEpsilon/_build --target install

The -DCPACK_GENERATOR=RPM option allows you to build a distributable .rpm package by running:

cmake --build EmptyEpsilon/_build --target package

Build script

A script executing the steps to build a Fedora package of EmptyEpsilon's master branch from scratch on a newly installed Fedora 43 system:
sudo dnf install git gcc gcc-c++ cmake python3 ninja-build SDL2-devel SDL2_gfx-devel SDL2_image-devel SDL2_mixer-devel SDL2_ttf-devel SDL2_net-devel rpm-build &&
mkdir -p emptyepsilon-compile &&
cd emptyepsilon-compile &&
git clone https://github.com/daid/EmptyEpsilon.git &&
git clone https://github.com/daid/SeriousProton.git &&
cmake -S EmptyEpsilon -B EmptyEpsilon/_build -G Ninja \
  -DCPACK_GENERATOR=RPM &&
cmake --build EmptyEpsilon/_build --target package

The result should be an EmptyEpsilon.rpm package located at emptyepsilon-compile/EmptyEpsilon/_build.

Build a distributable package of a specific EmptyEpsilon version

See Build for details on downloading a specific release's source or using a repository release tag, and for specifying a version number.

Download or clone the repository for a specific version. Given the 2024.12.08 official release as an example:

git clone -b EE-2024.12.08 https://github.com/daid/EmptyEpsilon.git &&
git clone -b EE-2024.12.08 https://github.com/daid/SeriousProton.git

Create a version.cmake file for that version in the EmptyEpsilon repository root directory. Note the CPACK_RPM_PACKAGE_VERSION line; without it, the package version will be today's date instead of the expected EmptyEpsilon version.

cat <<EOF > EmptyEpsilon/version.cmake
set(PROJECT_VERSION 2024.12.08)
set(PROJECT_VERSION_MAJOR 2024)
set(PROJECT_VERSION_MINOR 12)
set(PROJECT_VERSION_PATCH 8)
set(CPACK_RPM_PACKAGE_VERSION 2024.12.08)
EOF

Provide version.cmake as a project include file:

cmake -S EmptyEpsilon -B EmptyEpsilon/_build -G Ninja \
  -DCPACK_GENERATOR=RPM \
  -DCMAKE_PROJECT_EmptyEpsilon_INCLUDE=version.cmake &&
cmake --build EmptyEpsilon/_build --target package

Confirm the package with rpm -q:

rpm -qip EmptyEpsilon/_build/EmptyEpsilon.rpm

rpm -qip should output something similar to the following, depending on your architecture and the version you defined:

Name        : emptyepsilon
Version     : 2026.1.8
Release     : 1
Architecture: x86_64
Install Date: (not installed)
Group       : unknown
Size        : 349576176
License     : unknown
Signature   : (none)
Source RPM  : emptyepsilon-2026.1.8-1.src.rpm
Build Date  : Thu 08 Jan 2026 01:33:11 PM PST
Build Host  : hostname
Relocations : /usr/local
Vendor      : Humanity
Summary     : EmptyEpsilon built using CMake
Description :
DESCRIPTION
===========

This is an installer created using CPack (https://cmake.org). No additional installation instructions provided.

Build script

A script executing the steps to build a Fedora package of an EmptyEpsilon release tag from scratch on a newly installed Fedora 43 system:

For example, save this script as build-fedora.sh and run it as build-fedora.sh 2024.12.08 to build the EE-2024.12.08 release.

#!/bin/bash

# Capture version from first command-line argument
if [ $# -eq 0 ]; then
    echo "Error: Version number is required"
    echo "Usage: $0 <version>"
    exit 1
fi

VERSION="$1"

# Validate YYYY.MM.DD format
if [[ ! "$VERSION" =~ ^[0-9]{4}\.[0-9]{2}\.[0-9]{2}$ ]]; then
    echo "Error: Invalid version format. Use YYYY.MM.DD"
    exit 1
fi

sudo dnf install git gcc gcc-c++ cmake python3 ninja-build SDL2-devel SDL2_gfx-devel SDL2_image-devel SDL2_mixer-devel SDL2_ttf-devel SDL2_net-devel rpm-build &&
mkdir -p emptyepsilon-compile &&
cd emptyepsilon-compile &&
git clone --branch EE-${VERSION} --depth 1 https://github.com/daid/EmptyEpsilon.git &&
git clone --branch EE-${VERSION} --depth 1 https://github.com/daid/SeriousProton.git &&
{
  cat <<EOF > EmptyEpsilon/version.cmake
set(PROJECT_VERSION ${VERSION})
set(PROJECT_VERSION_MAJOR $(echo ${VERSION} | cut -d. -f1))
set(PROJECT_VERSION_MINOR $(echo ${VERSION} | cut -d. -f2 | sed 's/^0*//'))
set(PROJECT_VERSION_PATCH $(echo ${VERSION} | cut -d. -f3 | sed 's/^0*//'))
set(CPACK_RPM_PACKAGE_VERSION ${VERSION})
EOF
} &&
cmake -S EmptyEpsilon -B EmptyEpsilon/_build -G Ninja \
  -DCPACK_GENERATOR=RPM \
  -DCMAKE_PROJECT_EmptyEpsilon_INCLUDE=version.cmake &&
cmake --build EmptyEpsilon/_build --target package &&
rpm -qip EmptyEpsilon/_build/EmptyEpsilon.rpm

The result should be an EmptyEpsilon.rpm package located at emptyepsilon-compile/EmptyEpsilon/_build.

Build with additional options

See Build for additional options, such as building releases with debugging symbols.

Troubleshooting

Ninja support for RPATH

If the cmake command fails with a message about Ninja support for RPATH, add the -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_BUILD_WITH_INSTALL_RPATH=true flags:

cmake -S EmptyEpsilon -B EmptyEpsilon/_build -G Ninja \
  -DCMAKE_MAKE_PROGRAM=ninja \
  -DCMAKE_BUILD_WITH_INSTALL_RPATH=true

Build SDL2 from source

Fedora project maintainers have stated that SDL2 will not be packaged for the project from Fedora 42 onward. Instead, Fedora ships with SDL3 and the sdl2-compat library, which remains in development and can introduce errors in EmptyEpsilon or SeriousProton.

If building EmptyEpsilon with sdl2-compat causes serious stability issues with EE, file detailed issues with the libsdl-org/sdl2-compat project.

You can build EmptyEpsilon with SDL2 compiled and installed from source. Install the prerequisite packages listed in Requirements, and also the following packages required for SDL features according to the SDL Linux build README:

sudo dnf install -y \
alsa-lib-devel fribidi-devel pulseaudio-libs-devel pipewire-devel \
libX11-devel libXext-devel libXrandr-devel libXcursor-devel libXfixes-devel \
libXi-devel libXScrnSaver-devel libXtst-devel dbus-devel ibus-devel \
systemd-devel mesa-libGL-devel libxkbcommon-devel mesa-libGLES-devel \
mesa-libEGL-devel vulkan-devel wayland-devel wayland-protocols-devel \
libdrm-devel mesa-libgbm-devel libusb1-devel libdecor-devel \
pipewire-jack-audio-connection-kit-devel libthai-devel liburing-devel

Then clone the SDL2 branch of the SDL repository, build it from source, and install it:

git clone --branch SDL2 --depth 1 https://github.com/libsdl-org/SDL.git &&
cmake -S SDL -B SDL/build -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DSDL_WAYLAND=ON \
  -DSDL_X11=ON &&
sudo cmake --build SDL/build --target install

Adjust -DSDL_WAYLAND=ON -DSDL_X11=ON only if necessary.

Finally, rebuild EmptyEpsilon with the new SDL2 installation in place.

Black windows when using multimonitor

On master/ECS builds when using the Wayland display protocol, if you set multimonitor=1 or higher, windows might be created with black contents. Set the environment variable SDL_VIDEODRIVER=wayland to use multimonitor, or set multimonitor=0 to disable multimonitor mode.

SDL_VIDEODRIVER=wayland _build/EmptyEpsilon server_scenario=scenario_00_basic.lua multimonitor=2

Old versions of EmptyEpsilon

⚠️ Before October 2021, EmptyEpsilon and SeriousProton relied on SFML. Check the previous instructions if you're building for an older version.

⚠️ **GitHub.com Fallback** ⚠️