老 Linux 遊戲的函式庫重新編譯
在現今的軟硬體環境上執行老 Linux 遊戲,有時候是件很麻煩的事。雖然由 Alan Swanson 所匯集而成的 loki_compat_libs 套件已經提供蠻大的便利,不過在某些情況下,我們可能會想要自行編譯這些函式庫,甚至是修改其中的實作來改善一些遊戲執行問題。而本文主要是記錄在 Fedora 30 64bit 環境下,如何為幾個常用的 Linux 遊戲開發函式庫(分別是 SDL 1.2、SDL_mixer 1.2 以及 OpenAL Soft)編譯 32bit 的版本。
1. 重新編譯 SDL 1.2
SDL 在 Linux 上的角色就猶如是 Windows 上的 DirectX,提供一系列可用於開發多媒體應用程式(例如遊戲)的 API。不過事實上它是跨平台的,而且在 Windows 上的實作也是將 DirectX 再包裝的結果。雖然現時 SDL 的主流版本為 2.0,不過有許多早期的 Linux 遊戲是使用 SDL 1.x 開發而成。所以顧及相容性的因素,SDL 1.2 是本文重新編譯的對象。
首先使用 dnf 安裝所需的開發函式庫:
- sudo dnf install alsa-lib-devel.i686 libX11-devel.i686 libXext-devel.i686 libXrandr-devel.i686 libXrender-devel.i686 mesa-libGL-devel.i686 mesa-libGLU-devel.i686
下載、解開及進入 SDL 1.2 原始碼目錄:
- wget http://www.libsdl.org/release/SDL-1.2.15.tar.gz
- tar zxvf SDL-1.2.15.tar.gz
- cd SDL-1.2.15
編譯及安裝,其中安裝目錄是設定為使用者家目錄下的 SDL-1.2:
- ./configure --build=i686-pc-linux-gnu --prefix=/home/<username>/SDL-1.2 --disable-x11-shared CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32
- make
- make install
安裝完畢後,SDL 函式庫會放置於 /home/<username>/SDL-1.2/lib/libSDL-1.2.so.0.11.4,就可以拿去自行利用了。
2. 重新編譯 SDL_mixer 1.2
SDL_mixer 是 SDL 的附加函式庫,用於提供音訊檔的播放能力。不過除 WAV 外,若欲支援更多音訊格式則還需要依賴其它的函式庫。本文的編譯流程僅多安裝了 libvorbis-devel 來提供對 Ogg 的支援,因為這是 Linux 遊戲相對常用的音訊格式:
- sudo dnf install libvorbis-devel.i686
下載、解開及進入 SDL_mixer 1.2 原始碼目錄:
- wget https://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.12.tar.gz
- tar zxvf SDL_mixer-1.2.12.tar.gz
- cd SDL_mixer-1.2.12
SDL_mixer 編譯時會依賴 SDL 函式庫,若希望使用自行編譯的 SDL 版本,需要於執行 configure 時透過 SDL_CONFIG 參數來指定 sdl-config 所在的路徑:
- ./configure --build=i686-pc-linux-gnu --prefix=/home/<username>/SDL_mixer-1.2 SDL_CONFIG=/home/<username>/SDL-1.2/bin/sdl-config CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32
反之則需安裝 SDL-devel 套件,執行 configure 時就無須再加上 SDL_CONFIG 參數:
- sudo dnf install SDL-devel.i686
接著在執行編譯前,先編輯 configure 所產生的 Makefile,找到下行:
all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/playwave$(EXE) $(objects)/playmus$(EXE)
將 playwave 及 playmus 測試程式取消編譯,縮減為:
all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET)
然後便執行編譯及安裝:
- make
- make install
完成後,如先前指定之路徑,SDL_mixer 函式庫會放置於 /home/<username>/SDL_mixer-1.2/lib/libSDL_mixer-1.2.so.0.12.0。
3. 重新編譯 OpenAL Soft
OpenAL 是一款 3D 音效 API,而 OpenAL Soft 則是目前最為流行的開放原始碼實作。有別於前面兩個函式庫,本文編譯的 OpenAL Soft 並無刻意選擇舊分支的情形。因為 OpenAL 是標準化規格,實作版本的更替不會破壞 API 相容性。除非是一些非常早期的 Linux 遊戲,例如《重裝機甲兵 II》(Heavy Gear II,2000),是發生在 OpenAL 完成標準化之前,所以其內所使用的 OpenAL 函式庫是無法被 OpenAL Soft 直接替換的。
安裝編譯時所需的套件:
- sudo dnf install gcc-c++ cmake alsa-lib-devel.i686 pulseaudio-libs-devel.i686
下載、解開及進入 OpenAL Soft 原始碼目錄:
- wget https://kcat.strangesoft.net/openal-releases/openal-soft-1.20.0.tar.bz2
- tar jxvf openal-soft-1.20.0.tar.bz2
- cd openal-soft-1.20.0
執行編譯:
- cd build
- cmake -DCMAKE_C_FLAGS="-m32 -msse2" -DCMAKE_CXX_FLAGS="-m32 -msse2" -DCMAKE_SHARED_LINKER_FLAGS="-m32 -msse2" ..
- make
完成編譯後,build 目錄下的 libopenal.so.1.20.0 就是 OpenAL Soft 函式庫了。