Compile ZDoom on Linux

From ZDoom Wiki
Jump to: navigation, search

This tutorial will guide you on the compilation of ZDoom on Linux. Commands are shown in the tutorial that should be entered into a terminal. Commands beginning with `su` or `sudo` will require temporary root/superuser privileges, as will most likely any package installation.

Install dependencies

ZDoom needs certain dependencies in order to compile. These versions are known to work with recent ZDoom versions:

  • gcc 4.6 or later
  • make
  • cmake 2.8.7 or later
  • fmodex 4.26.36 or later
  • SDL 2.0.2 or later
  • zlib (optional - ZDoom has a copy of it and will be statically compiled in if not found)
  • libbzip2 (optional - possibly static)
  • libjpeg (optional - possibly static)
  • nasm 0.98.39 or later (optional)
  • GTK2 (optional)
  • Mesa (if compiling GZDoom); or any other GL implementation provider. Compile GZDoom on Linux
  • gxmessage (optional - needed to show the crash log in a window)
  • git (needed in order to download the source)
  • fluidsynth (optional)
  • libgme or game-music-emu (optional - possibly static)
  • libopenal (optional)
  • timidity (optional)
  • wildmidi (optional - possibly static)

You can presumably use any higher versions of these programs, however that might not be the case. FMOD Ex, notably, does not have a constant API and using a version newer than the one listed above can prevent the successful compilation or execution of ZDoom.

Debian/Ubuntu

sudo apt-get install build-essential zlib1g-dev libsdl2-dev libjpeg-dev \
nasm tar libbz2-dev libgtk2.0-dev cmake git libfluidsynth-dev libgme-dev \
libopenal-dev timidity libwildmidi-dev

Fedora

yum install gcc-c++ make zlib-devel SDL2-devel libjpeg-turbo-devel \
nasm tar bzip2-devel gtk2-devel cmake git fluidsynth-devel game-music-emu-devel \
openal-soft-devel timidity++ wildmidi-devel

openSUSE

zypper install gcc-c++ make zlib-devel libSDL2-devel libjpeg-devel \
nasm tar libbz2-devel gtk2-devel cmake git fluidsynth-devel libgme-devel \
openal-soft-devel timidity

Mageia

if [ "$(uname -m)" = "x86_64" ]; then 
a="64" 
else
a=""
fi && \
urpmi gcc-c++ make lib"$a"zlib-devel lib"$a"sdl2.0-devel \
lib"$a"jpeg-devel nasm tar lib"$a"bzip2-devel lib"$a"gtk+2.0-devel \
cmake git lib"$a"fluidsynth-devel lib"$a"gme-devel lib"$a"openal-devel \
TiMidity++ lib"$a"wildmidi-devel lib"$a"cairo-devel

Arch Linux

ZDoom is available in Arch User Repository at http://aur.archlinux.org/packages.php?ID=16403

Install as per usual for AUR packages.

pacman -S --needed gcc make zlib sdl2 libjpeg-turbo nasm tar bzip2 gtk2 cmake git \
fluidsynth libgme fmodex openal timidity++ wildmidi

Gentoo

emerge -avn sys-devel/gcc sys-devel/make sys-libs/zlib media-libs/libsdl2 media-libs/libjpeg-turbo \
dev-lang/nasm app-arch/tar app-arch/bzip2 x11-libs/gtk+ dev-util/cmake dev-vcs/git media-sound/fluidsynth \
media-libs/game-music-emu media-libs/openal media-sound/timidity++ media-sound/wildmidi

PCLinuxOS

if [ "$(uname -m)" = "x86_64" ]; then 
a="64" 
else
a=""
fi && \
apt-get install gcc-c++ make zlib1-devel lib"$a"sdl2.0-devel \
lib"$a"jpeg62-devel nasm tar lib"$a"bzip2-devel lib"$a"gtk+2.0_0-devel \
cmake git lib"$a"fluidsynth1-devel lib"$a"openal-devel TiMidity++

Do the following steps as normal user.

Make zdoom_build directory

mkdir -pv "$HOME"/zdoom_build

Download the Source

Download the ZDoom source and make build directory:

cd "$HOME"/zdoom_build && \
git clone git://github.com/rheit/zdoom.git && \
mkdir -pv zdoom/build

and run the following commands:

cd zdoom
git config --local --add remote.origin.fetch +refs/tags/*:refs/tags/*
git pull

Download FMOD

Download FMOD 4.26.36 32-bit or 64-bit and extract files to zdoom directory:

cd "$HOME"/zdoom_build && \
if [ "$(uname -m)" = "x86_64" ]; then 
a="64" 
else
a=""
fi && \
wget -nc http://web.archive.org/web/20151111191152/http://doomgod.com/ports/fmod/fmodapi42636linux"$a".tar.gz && \
tar -xvzf fmodapi42636linux"$a".tar.gz -C zdoom

FMOD Links

FMOD 4.26.36 32-bit:
http://web.archive.org/web/20151111191152/http://doomgod.com/ports/fmod/fmodapi42636linux.tar.gz

FMOD 4.26.36 64-bit:
http://web.archive.org/web/20151111191152/http://doomgod.com/ports/fmod/fmodapi42636linux64.tar.gz

Compiling

To compile the development version:

cd "$HOME"/zdoom_build/zdoom/build && \
if [ "$(uname -m)" = "x86_64" ]; then
a="64"
else
a=""
fi && \
make clean ; \
cmake -DCMAKE_BUILD_TYPE=Release \
-DFMOD_LIBRARY="$HOME"/zdoom_build/zdoom/fmodapi42636linux"$a"/api/lib/libfmodex"$a"-4.26.36.so \
-DFMOD_INCLUDE_DIR="$HOME"/zdoom_build/zdoom/fmodapi42636linux"$a"/api/inc .. && \
make

Assuming all goes well, a zdoom binary should be produced. To start ZDoom, the following command should work:

./zdoom

If ZDoom complains you do not have any IWADs set up, make sure that you have your IWAD files placed in the same directory as ZDoom, in ~/.config/zdoom, $DOOMWADDIR, or /usr/local/share. Alternatively, you can edit ~/.config/zdoom/zdoom.ini to set the path for your IWADs.

Current release version

Show the current release version:

cd "$HOME"/zdoom_build/zdoom && \
git tag -l | grep -v 9999 | grep -E '^[0-9]+([.][0-9]+)*$' | \
sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 | \
tail -n 1

If you want to compile the current release version, run:

cd "$HOME"/zdoom_build/zdoom && \
Tag="$(git tag -l | grep -v 9999 | grep -E '^[0-9]+([.][0-9]+)*$' | \
sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 | \
tail -n 1)" && \
git checkout --detach refs/tags/"$Tag"

and compile.

After compiling, backing up and optionally installing the current release version, run:

cd "$HOME"/zdoom_build/zdoom && \
git checkout master

Backup

Follow this step if you want or manually copy (backup) zdoom, zdoom.pk3 and liboutput_sdl.so.

Make and name a directory with the corresponding ZDoom version/revision and copy zdoom, zdoom.pk3 and liboutput_sdl.so to it:

cd "$HOME"/zdoom_build && \
BACKUPZDOOM="$(sed -n 's/.*#define GIT_DESCRIPTION "\(.*\)".*/\1/p' \
zdoom/src/gitinfo.h)" && \
mkdir -pv "$BACKUPZDOOM" && \
cp -v zdoom/build/{zdoom,zdoom.pk3,\
output_sdl/liboutput_sdl.so} "$BACKUPZDOOM"

Backup (Optional)

Make and name a directory with the current year, month, day, hour and minute and copy zdoom, zdoom.pk3 and liboutput_sdl.so to it:

cd "$HOME"/zdoom_build && \
BACKUPZD="$(date +'%Y%m%d-%H%M')" && \
mkdir -pv "$BACKUPZD" && \
cp -v zdoom/build/{zdoom,zdoom.pk3,\
output_sdl/liboutput_sdl.so} "$BACKUPZD"

If you did "Backup" or "Backup (Optional)", the previous files should be located at:

/home/<your username>/zdoom_build/<your newly created directory>

Updating

When you wish to update ZDoom, copy and paste the following:

cd "$HOME"/zdoom_build/zdoom && \
git pull

When the update finish, go to #Compiling.

Installation

  • zdoom = Release version
  • zdoom-alpha = Non-release version

The following steps have commands that require to be run as superuser with the sudo command.

If you want to install ZDoom, do the following:

Make /usr/games/zdoom and /usr/games/zdoom-alpha directories:

sudo mkdir -pv /usr/games/{zdoom,zdoom-alpha}

Copy zdoom, zdoom.pk3, liboutput_sdl.so and libfmodex64-4.26.36.so or libfmodex-4.26.36.so to /usr/games/zdoom or /usr/games/zdoom-alpha:

cd "$HOME"/zdoom_build/zdoom && \
t="$(git describe --exact-match --tags 2>/dev/null)" && \
if [ -z "$t" ]; then
d="-alpha"
else
d=""
fi && \
if [ "$(uname -m)" = "x86_64" ]; then
a="64"
else
a=""
fi && \
sudo cp -v {build/{zdoom,zdoom.pk3,output_sdl/liboutput_sdl.so},\
fmodapi42636linux"$a"/api/lib/libfmodex"$a"-4.26.36.so} \
/usr/games/zdoom"$d"

Make zdoom or zdoom-alpha script, add executable permission and move it to /usr/bin:

cd "$HOME"/zdoom_build/zdoom && \
t="$(git describe --exact-match --tags 2>/dev/null)" && \
if [ -z "$t" ]; then
d="-alpha"
else
d=""
fi && cd /tmp && \
echo '#!/bin/sh' > zdoom"$d" && \
echo >> zdoom"$d" && \
echo "export LD_LIBRARY_PATH=/usr/games/zdoom"$d"" >> zdoom"$d" && \
echo "exec /usr/games/zdoom"$d"/zdoom \"\$@\"" >> zdoom"$d" && \
chmod 755 zdoom"$d" && \
sudo mv -v zdoom"$d" /usr/bin

Now from a terminal you should be able to execute zdoom or zdoom-alpha from any user account.

Uninstallation

To remove the previous installation steps:

Remove /usr/games/zdoom directory and all its files:

cd /usr/games && \
sudo rm -rfv zdoom

Remove zdoom script:

cd /usr/bin && \
sudo rm -fv zdoom

Remove /usr/games/zdoom-alpha directory and all its files:

cd /usr/games && \
sudo rm -rfv zdoom-alpha

Remove zdoom-alpha script:

cd /usr/bin && \
sudo rm -fv zdoom-alpha

Developing

This page has helped you compile ZDoom, but perhaps you are interested in debugging the code or submitting code changes or fixes for inclusion. This section is intended for more advanced users who may be unfamiliar to CMake or debugging on Linux systems.

Debugging

Prerequisite:

Maybe you have found a way to make ZDoom crash, and are interested in debugging it. First, you need to compile a debug build of ZDoom.

Inside the clone directory, create a new directory debug:

mkdir -pv "$HOME"/zdoom_build/zdoom/debug

Inside the debug directory, invoke CMake to set up for compiling, but this time, the build type is set to Debug. After CMake is done, run make as usual:

cd "$HOME"/zdoom_build/zdoom/debug && \
if [ "$(uname -m)" = "x86_64" ]; then
a="64"
else
a=""
fi && \
make clean ; \
cmake -DCMAKE_BUILD_TYPE=Debug \
-DFMOD_LIBRARY="$HOME"/zdoom_build/zdoom/fmodapi42636linux"$a"/api/lib/libfmodex"$a"-4.26.36.so \
-DFMOD_INCLUDE_DIR="$HOME"/zdoom_build/zdoom/fmodapi42636linux"$a"/api/inc .. && \
make

To run ZDoom under a debugger such as gdb, use the following command:

gdb zdoom

Now gdb should have you in its own command prompt. You probably want to log the output, so lets output to a file zdoomdebug.log:

(gdb) set logging on zdoomdebug.log

Now start ZDoom by typing in run, and pressing enter:

(gdb) run

Or put any Command line parameters to zdoom after run:

(gdb) run <command line parameters>

If ZDoom crashes, gdb may be able to tell you the source file and line number it crashed in.
Typing in the command bt or backtrace will produce information telling the last function calls, showing how execution got to the point where it crashed:

(gdb) bt

All output will be copied into the zdoomdebug.log, which can then be scrutinized later, or perhaps posted to the Bugs forum for other developers to look at.

To get out of gdb's command prompt, use quit, q or Ctrl-D:

(gdb) quit

Build Options

CMake Build Options
Options Description Example
NO_GTK=ON Disable GTK+ dialogs. cmake -DNO_GTK=ON ..
NO_FMOD=ON Disable FMOD support. cmake -DNO_FMOD=ON ..
NO_OPENAL=ON Disable OpenAL support. cmake -DNO_OPENAL=ON ..
FMOD_LIBRARY Set path for FMOD library. cmake -DFMOD_LIBRARY=/path/to/libfmodex(64)-X.Y.Z.so ..
FMOD_INCLUDE_DIR Set path for FMOD include directory. cmake -DFMOD_INCLUDE_DIR=/path/to/include/dir ..
CMake Build Types
Types Description Example
Debug Debug information, -O1 optimization. cmake -DCMAKE_BUILD_TYPE=Debug ..
Release No debug information, -O3 optimization. cmake -DCMAKE_BUILD_TYPE=Release ..
RelWithDebInfo Debug information, -O3 optimization. Useful for finding optimization bugs that only show up in Release. cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
MinSizeRel Similar to Release but with less optimizations in order to save space. cmake -DCMAKE_BUILD_TYPE=MinSizeRel ..

Troubleshooting

Sound

If ZDoom starts but immediately closes with the following messages in the terminal:

...
Init Playloop state.
Setting up sound.
S_Init
Checking network game status.
player 1 of 1 (1 nodes)

This usually indicates that FMOD Ex is not loading correctly (and ZDoom is configured to use FMOD by default). There are then two solutions.

You could start ZDoom without music:

zdoom -nomusic

or you could select (in the ZDoom settings) a MIDI device other than FMOD. To change MIDI device, go to the sound options menu.

  • ... on any Debian/Ubuntu-based distribution, run:
sudo apt-get install timidity timidity-interfaces-extra
  • ... on openSUSE:
yast2 -i timidity or zypper in timidity
  • ... on Gentoo, run:
sudo emerge -avn timidity++

See the software synthesizer article for further information about ZDoom's MIDI devices.

External links