alephoneのクロスコンパイル

以前コンパイルできた環境を無くしたため、環境の再構築にちと手間取りました。もう手間取りたくないのでちょっと細かめに書いておきます。Linuxを用いてWindows用のAlephOne.exeを作成する方法です。確認はしていませんが、OSXでも同様の方法でコンパイルできると思います。
手順についてはAleph One - Marathon Open Source昔書いたビルド方法marathon-devel MINGW cross compilationを参考にしました。

準備

AlephOneのプロジェクトから最新のソースファイル一式をダウンロードし、適当な場所に展開。

ロスコンパイルに利用するcross-make.shcross-configure.shを適当な場所にダウンロード。(今回は/tmp)

ロスコンパイル環境の作成

適当な場所(今回は/tmp)にbuildcrossディレクトリを作成し、build-cross.shをダウンロード。

build-cross.shの、26行目から36行目までを以下のように書き換え

MINGW_URL=http://nchc.dl.sourceforge.net/sourceforge/mingw
GCC_VERSION=3.4.5-20060117-1
GCC=gcc-$GCC_VERSION
GCC_ARCHIVES="gcc-core-$GCC_VERSION-src.tar.gz gcc-g++-$GCC_VERSION-src.tar.gz"
GCC_PATCH=""
BINUTILS=binutils-2.16.91-20060119-1
BINUTILS_ARCHIVE=$BINUTILS-src.tar.gz
MINGW=mingw-runtime-3.9
MINGW_ARCHIVE=$MINGW.tar.gz
W32API=w32api-3.6
W32API_ARCHIVE=$W32API.tar.gz

115行目のconfigureに--disable-dlsオプションを追加する。

 "$SRCDIR/$BINUTILS/configure" --prefix="$PREFIX" --target=$TARGET --disable-nls &> con

ビルド環境を構築する場所を指定する場合は、17行目のPREFIXを変更する。(今回はデフォルト)

 PREFIX=/usr/local/cross-tools

build-cross.shを実行。*1

ライブラリのビルド

SDL

SDL-1.2.11.tar.gzをダウンロードし、ビルドを行っているマシン上にSDLをインストール。

次に、SDL-devel-1.2.11.tar.gzをダウンロード。パッケージ内のbin/ lib/ include/ share/のファイルを/usr/local/cross-tools/i386-mingw32msvc/にコピー。

SDL_net

SDL_net-1.2.5.tar.gzをダウンロード。

ネイティブ環境でインストールし、その後クロスビルド。

$ /tmp/cross-configure.sh --disable-shared
$ /tmp/cross-make.sh install
JPEG

JPEG最新版のソースをダウンロードし、ビルド。

 $ /tmp/cross-configure.sh --disable-shared --prefix=/usr/local/cross-tools/i386-mingw32msvc
 $ /tmp/cross-make install-lib
zlib

zlib最新版をダウンロード。

cross-configure.shをもう1つ作成し、--cache-file、--target、--hostオプションをはずす。

 $ /tmp/cross-configure-zlib.sh --disable-shared --prefix=/usr/local/cross-tools/i386-mingw32msvc

出来上がったMakefileのCCを

CC=/usr/local/cross-tools/i386-mingw32msvc/bin/gcc

に変更後、ビルド。

$ /tmp/cross-make libz.a
$ /tmp/cross-make install
libPNG

libpngから最新版をダウンロードしてビルド。

$ /tmp/cross-configure.sh --prefix=/usr/local/cross-tools/i386-mingw32msvc
$ /tmp/cross-make install
libtiff

libtiffから最新版をダウンロードしてビルド。

$ /tmp/cross-configure.sh --disable-shared
$ /tmp/cross-make.sh install
SDL_image

SDL_imageから最新版のソースをダウンロードしてビルド。

$ /tmp/cross-configure.sh --disable-shared --prefix=/usr/local/cross-tools/i386-mingw32msvc
$ /tmp/cross-make install
smpeg

Alephoneのソースファイル内のLibraryディレクトリのsmpegをビルド

$ ./autogen.sh
$ LIBS="-lstdc++" /tmp/cross-configure.sh --disable-shared --enable-gtk-player=no --prefix=/usr/local/cross-tools/i386-mingw32msvc
$ /tmp/cross-make install
SDL_sound

subversionからSDL_Soundを取得

$ svn co svn://svn.icculus.org/SDL_sound/branches/stable-1.0/ SDL_sound-stable-1.0
$ cd SDL_sound-stable-1.0
$ ./bootstrap
$ CFLAGS="-I/usr/local/cross-tools/i386-mingw32msvc/include/smpeg" LIBS="-lstdc++" \
  ./cross-configure.sh --disable-shared --prefix=/usr/local/cross-tools/i386-mingw32msvc \
  --enable-smpeg --disable-midi --disable-mpglib
$ sed -ie s/playsound//g Makefile
$ /tmp/cross-make.sh install
Speex

Speexをダウンロード。

$ /tmp/cross-configure.sh --prefix=/usr/local/cross-tools/i386-mingw32msvc --enable-ogg=no --disable-shared
$ /tmp/cross-make.sh install
Lua

Luaをダウンロード。

configファイルのINSTALL_ROOTを変更

INSTALL_ROOT= /usr/local/cross-tools/i386-ming32msvc

コンパイル&インストール

$ /tmp/cross-configure.sh
$ /tmp/cross-make.sh install
boost

boostからネイティブのboost-jamをDLし、インストール。同じ場所からboostライブラリもDL。

ライブラリを展開して、

$ bjam -sTOOLS="gcc" --prefix="/usr/local/cross-tools/i386-mingw32msvc" --sGXX="/usr/local/cross-tools/i386-mingw32msvc/bin/g++" --with-bind --with-function install

AlephOneのビルド

不足ファイルの取得

配布されているパッケージには足りないファイルがいくつかあるため、CVSからダウンロード。

  • /aleph/autogen.sh
  • /aleph/Source_Files/Network/network_microphone_shared.h
  • /aleph/Resources/Windows/*
一部修正

Source_Files/RenderOther/screen_shared.h内の732行目のGL_BGRAをGL_RGBAに変更(参考:marathon-devel Windows Build Problem)。ビルド環境がOpenGL1.2に対応していないため。

ビルド
$ ./autogen.sh
$ ./configure
$ cd Source_Files/Expat
$ make gennmtab
$ cd ../..
$ LIBS="-ljpeg -lpng -lz -lstdc++ -lws2_32" /tmp/cross-configure.sh
$ cd Source_Files/Expat
$ make clean
$ cd ../..
$ /tmp/cross-make.sh

成功すればSource_Files/AlephOne.exeが作成される。

その他

  • 現在配布されている最新のAlephOne.exeはSDL.dllが不要ですが、この方法を用いた場合SDL.dllが必要になります。なんでかな。
  • どうもSDL_soundのビルドに失敗する。smpegが上手くリンクできていないっぽい。
    • そういうわけで、M1A1で音が鳴りません。

おまけ

2chmarathonスレpart8の>>217さんが作成したパッチを当ててみました。MMLまで日本語対応していますね。すごい!

*1:デフォルトではroot権限が必要