Da mein etwas in die Jahre gekommener GameCube in letzter Zeit wieder häufiger benutzt wird, wollte ich mal den Dolphin Emulator testen. Dazu muss dieser im ersten Schritt jedoch kompiliert werden - in meinem Fall für Ubuntu 18.04 LTS in einem passenden LXC Container.

Warum Ubuntu 18.04 LTS?
Weil mein Testsystem noch damit läuft und ich es nicht für den Dolphin-Test upgraden möchte.
Warum im LXC Container?
Weil ich mein Testsystem nicht mit den Abhängigkeiten für den Build zumüllen möchte. Zusätzlich gibt mir dies eine klare Vorstellung davon, welche Komponenten für den Build wirklich gebraucht werden.

Anlegen des passenden LXC Containers

Da ich LXC schon länger nutze ist es schon vorinstalliert und muss nicht mehr installiert werden. Alles, was ich noch machen muss, ist einen passenden LXC Container mit Ubuntu 18.04 LTS zu erzeugen:

cat > dolphin.conf << EOF
lxc.include = /etc/lxc/default.conf

lxc.idmap = u 0 100000 65535 
lxc.idmap = g 0 100000 65535

lxc.apparmor.profile = unconfined
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
EOF

lxc-create -n dolphin -t download -f dolphin.conf -- \
    -d ubuntu -r bionic -a amd64
lxc-start -n dolphin

Für solche Anwendungen verwende ich meist einen unprivilegierten LXC Container. Diese funktionieren unter Ubuntu recht gut. Unter Debian gibt es dabei schon hin und wieder Probleme.

Installation der Abhängigkeiten

Nun, da der passende LXC Container angelegt ist, können die benötigten Pakete installiert werden:

lxc-attach -n dolphin << EOF
apt install -y git autoconf libtool build-essential cmake \
  pkg-config clang libxi-dev qtbase5-dev libgl1-mesa-dev \
  libevdev-dev libudev-dev libpulse-dev libasound2-dev \
  libbluetooth-dev libavcodec-dev libavformat-dev \
  libavutil-dev libswscale-dev qtbase5-private-dev
EOF

Herausforderungen

Der Build Prozess war nicht so einfach und straightforward, wie es hier den Eindruck erwecken mag. Meine ersten Versuche mit gcc scheiterten kläglich. Auch der Versuch, eine ältere Version von Dolphin 5.0 entsprechend der Anleitung (Building Dolphin on Linux) zu kompilieren, hat nicht funktioniert, sondern führte zu diversen Fehlermeldungen.

Erst die Verwendung von clang ließ mich die neueste Dolphin Version bauen. Dabei wird jedoch die alternative Standard-Library libc++ benötigt, welche auf dem eigentlichen Testsystem nicht installiert ist und auch nicht installiert werden soll. Ein statisches Linken dieser Library sollte das Problem beheben.

Laut dem LLVM Bugtracker ist dies auch schon implementiert - nur leider nicht in der clang Version, welche mit Ubuntu 18.04 LTS geliefert wird.

Zum Glück lässt sich Dolphin auch mit der libstdc++ bauen und diese dann auch statisch linken.

Neue Herausforderungen

All diese Versuche habe ich schon vor rund zwei Wochen gemacht. Als ich heute für diesen Artikel das Vorgehen nochmals testen wollte, musste ich feststellen, dass ich Fehler beim Kompilieren erhalte. Ich war mir jedoch sicher, dass ich Dolphin damals auf diesem Weg erfolgreich bauen konnte.

Was hatte sich also geändert? Habe ich eine Dependency vergessen zu installieren? Hatte ich Codefragmente in meinem Build-Verzeichnis, welche damals zum Erfolg führten, bei einer neuen Installation jedoch fehlen und so zu Fehlern führen?

Ein git log <DATEI> zeigt, dass die Datei, welche den Fehler erzeugt, in den letzten Tagen verändert wurde. Vielleicht haben neue Commits den Fehler erzeugt?

Ich bin also ein paar Commits zurück gegangen und siehe da: Dolphin lässt sich wieder kompilieren! Manchmal wunder ich mich schon, wie knapp ich bei meinem ersten Versuchen zum Ziel kam. Hätte ich es nur eine Woche später versucht, wäre ich in diesen Fehler gelaufen und hätte wohlmöglich frustriert aufgegeben.

Build von Dolphin

So war ich letztlich erfolgreich, eine statisch gelinkte Dolphin Version für Ubuntu 18.04 LTS zu bauen:

lxc-attach -n dolphin << EOF
git clone https://github.com/dolphin-emu/dolphin /dolphin
cd /dolphin
git checkout 07fd17445c6ca4e89b0cef023ba711bb27c920aa
git submodule update --init

mkdir build
cd build
cmake .. -DLINUX_LOCAL_DEV=true -DCMAKE_C_COMPILER=clang \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DCMAKE_CXX_FLAGS="-stdlib=libstdc++"
make -j$(nproc)

cp -r ../Data/Sys/ Binaries/
touch Binaries/portable.txt
EOF

Verwenden des GameCube Controllers unter Linux

Mit Hilfe des MAYFLASH Gamecube Controller Adapter lassen sich die original CameCube Controller unter Dolphin verwenden. Fehlende Zugriffsrechte auf das USB Gerät ließen sich schnell mit einer udev-Regel beheben. Details dazu finden sich im Dolphin Artikel: How to use the Official GameCube Controller Adapter for Wii U in Dolphin

Ausblick

Meine GameCube Spiele lassen sich nun auch unter Linux mit den original Controllern spielen. Dies ist beruhigend für den Fall, dass der GameCube (und vor allem das DVD Laufwerk) einmal das zeitliche segnen sollte. Ansonsten werden wir wohl vorerst beim GameCube bleiben.

Es zeigt sich, dass sich eine meiner Hoffnungen nicht erfüllt: Dolphin auf einem Ein-Platinen-Computer (wie dem Raspberry Pi) zu spielen. Dies ist wohl auf dem neuesten Raspberry Pi 4 gerade so möglich, aber teilweise noch mit Einschränkungen. Der GameCube hatte wohl doch schon eine ordentliche CPU und vor allem GPU Leistung, welche auch heute noch nicht von einfachen SoC-Boards erreicht wird.