MinGWとSDLSKKでクロスビルド

Last-modified: 2011-04-03 (日) 02:58:18

はじめに

このページは Battle for Wesnoth 日本語版 1.8.5-20101019 のビルド環境 makenoth-1.8.5-sdlskk-20101019.7z.001,002,003 に含まれる Battle for Wesnoth 日本語版 ビルド環境作成手順 (INSTALL.html) と同様です。

VMware を使用できない方でも読めるよう、また SourceForge.JP 上のバイナリが失われた場合でも誰でも再現できるよう、ここにも情報として残させていただきます。

概要

Battle for Wesnoth 日本語版 1.8.5-20101019 のビルド環境をどのように作成したのか、どのようにビルドを行ったのかをまとめるのがこのドキュメントの目的です。

作成するバイナリは Windows 用ですが、ビルドに用いた OS は Ubuntu Linux 10.10 です。

1.8.4-20100915 において発生したネットワーク問題*1を解決するため、コンパイラセットを Visual C++ 2010 Express から MinGW に移行せざるを得なくなったのですが、MinGW を使うのであればたとえクロスコンパイルになったとしても Windows 上よりも Linux 上のほうがはるかに扱いやすいと考えたためです。

また、このように、ビルド環境そのものを丸ごと仮想マシンとして公開できるメリットも生まれます。

目次

OS のインストールと環境設定

VMware Player*2 で仮想マシンを作成し、Ubuntu 10.10 Desktop 日本語 Remix をインストールします。
ホスト名は makenoth としました。またユーザ konrad を作成し (パスワードも konrad です) 、GNOME に自動ログインするよう設定しました。以後はこのユーザでビルド作業を行います。
あえて build-essential を入れず、PATH やら何やら環境変数を .profile に設定しておくことも避ける方針を採ります。できるだけマシン環境への依存を減らし、また要求されるユーザ権限も少なくなるよう意識しています。

パッケージのインストール

まず以下のパッケージをインストールしておきます。

sudo apt-get install openssh-server samba mingw32 unzip xz-utils patch wine pkg-config gettext boost-build scons

openssh-server
ssh-keygen 済みで、パスフレーズも konrad です。ビルド作業はやはり ssh で行うのが一番楽です。Ubuntu は screen もインストール済みですし byobu で特に設定もせず恩恵にあずかれます。
samba
Homes のみ有効の設定にしてあります。ホストマシンから \\makenoth\konrad にアクセスできるはずです。
mingw32
この環境の主役。Windows で実行できるバイナリを吐いてくれるコンパイラセットです。
unzip xz-utils
それぞれ ZIP および XZ 形式書庫の展開に使用します。
patch
一緒にインストールされる diff とともに、パッチを当てたり作ったりに使用します。
wine
Windows エミュレータ。ここでの主目的は NSIS を動かすためですが、ビルドするライブラリの中にはテストプログラムの実行が避けられないものもあったりします。
pkg-config
いくつかのライブラリが他のライブラリのありかを知るために使用するもの。
gettext
翻訳処理用ソフトウェア。いくつかのライブラリが、自分を国際化対応させるためにこれを要求します。
boost-build scons
いずれもビルドツール。boost-build に含まれる bjam を Boost ライブラリのビルドに、scons を Wesnoth のビルドに使用します。

ディレクトリの作成

ホームディレクトリには以下のディレクトリを作成することにします。

cd
mkdir arc src mingw

~/arc

ダウンロードした書庫等を置きます。

~/src

書庫を展開しビルドするための場所です。

~/mingw

~/src でビルドしたライブラリやヘッダをここにインストールします。

~/mingw/bin に実行ファイルと DLL を、~/mingw/include にヘッダを、~/mingw/lib にライブラリをインストールします。

~/mingw/bin にインストールされる実行ファイルはすべて Windows バイナリですが、ライブラリによって拡張子 .exe をつけたりつけなかったりします。いずれにせよ Wine で実行可能ですが、Windows 環境と違い拡張子の有無は正確に指示しなければなりません。

NSIS のインストール

NSIS (Nullsoft Scriptable Install System) は Windows 版 Wesnoth が使用しているインストーラ作成ツールです。これ自体は普通の Windows アプリケーションなので、GUI でインストールを行う必要があります。

wget http://prdownloads.sourceforge.net/nsis/nsis-2.46-setup.exe -P ~/arc
chmod +x ~/arc/nsis-2.46-setup.exe

としてダウンロードしてから実行可能ビットを立て、GNOME の Nautilus 等から ~/arc/nsis-2.46-setup.exe を Wine で実行し、インストールします。

ライブラリのビルド

Wesnoth のビルドに必要なライブラリをひとつずつビルドしていきます。

ZLIB

configure を使うのは面倒くさいため、同梱されている出来合いの Makefile を使います。

wget http://zlib.net/zlib-1.2.5.tar.bz2 -P ~/arc
tar jxvf ~/arc/zlib-1.2.5.tar.bz2 -C ~/src
cd ~/src/zlib-1.2.5
make IMPLIB=libz.dll.a -f win32/Makefile.gcc PREFIX=i586-mingw32msvc-
make IMPLIB=libz.dll.a -f win32/Makefile.gcc install SHARED_MODE=1 BINARY_PATH=$HOME/mingw/bin INCLUDE_PATH=$HOME/mingw/include LIBRARY_PATH=$HOME/mingw/lib
cd

IMPLIB=libz.dll.a の指定をしないと libzdll.a が作成されますが、このファイル名は MinGW っぽくないため変更しています。もちろんインストール時にも指定する必要があります。

SHARED_MODE=1 を指定しないと DLL 関連がインストールされません。

BZIP2

Wesnoth のビルドには不要ですが、MinGW で Boost をビルドしようとすると当然のように BZIP2 のソースを要求されるため、せっかくなのでビルド。これだけメジャーなソフトウェアなのに非 configure なのは珍しい (まあ NetHack とかもそうですけども) 。

wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz -P ~/arc
tar zxvf ~/arc/bzip2-1.0.6.tar.gz -C ~/src
cd ~/src/bzip2-1.0.6
sed -i 's|sys\\stat.h|sys/stat.h|g' bzip2.c
make CC=i586-mingw32msvc-gcc AR=i586-mingw32msvc-ar RANLIB=i586-mingw32msvc-ranlib
make PREFIX=$HOME/mingw install
cd

bzip2.c が sys\stat.h をインクルードしている個所を sys/stat.h に変更する必要があり、sed でパッチを当てています。

スタティックライブラリは作成されません。

Boost

C++ 用お便利ライブラリ群。でも C# の甘美な味を知ってしまうと、こんなもん使ってまで C++ 使いたくないと思ってしまいます。

sudo ln -s /usr/bin/i586-mingw32msvc-g++ /usr/bin/g++
wget http://sourceforge.net/projects/boost/files/boost/1.44.0/boost_1_44_0.tar.bz2 -P ~/arc
tar jxvf ~/arc/boost_1_44_0.tar.bz2 -C ~/src
cd ~/src/boost_1_44_0
bjam target-os=windows threadapi=win32 --layout=versioned -s ZLIB_SOURCE=$HOME/src/zlib-1.2.5 -s BZIP2_SOURCE=$HOME/src/bzip2-1.0.6 --with-iostreams --with-system --with-regex --with-thread link=static runtime-link=shared variant=release threading=multi --prefix=$HOME/mingw install
cd
sudo rm /usr/bin/g++

いくら user-config.jam を設定しても、bjam が素の g++ を探しに行ってこけてしまいます。CXX を設定してもだめ。
そのためビルドの間だけシンボリックリンクを作ってごまかすことに。もちろんこんな回避方法しないとなんないほどあほなツールは他にはないので、ビルドが済んだら削除してしまいます。
bootstrap.sh の実行も user-config.jam への追記も不要。というか user-config.jam に書いても g++ の件を回避できないのでは、書く意味がないですが。

Wesnoth に必要なのは iostreams、smart_ptr、regex、unit_test_framework のみなので、生成するライブラリは絞ってあります。
Wesnoth が ZLIB 対応の iostreams を要求するため、ZLIB_SOURCE の指定は必須。
BZIP2_SOURCE は Wesnoth には不要なので VC++ でのビルドでは省略できましたが、MinGW でこれを省略すると iostreams のビルドが失敗します。
VC++ では警告とともに自動的に without された python ライブラリは、MinGW 上では明示的に without しないとエラーとなります。もし他のライブラリもビルドしたいと --with-* オプションを外す場合は、--without-python を指定するかビルドに必要なファイルを揃えるかしなければなりません。

ZLIB_SOURCE や BZIP2_SOURCE は相対パスではうまくいきません。../zlib-1.2.5 等と指定すると失敗します。ホーム記号を含む絶対パスなら通ります。
一方、--prefix をホーム記号入りで ~/mingw などとすると、boost_1_44_0 の下に ~ ディレクトリを掘ってくれてしまうので要注意。

ライブラリは ~/mingw/lib に libboost_iostreams-mgw42-mt-1_44.a の形式の名前で作成され、libboost_filesystem-mgw42-mt.a 形式のシンボリックリンクが作成されます。.la は作ってくれません。
ヘッダは ~/mingw/include/boost-1_44/boost/ 下に置かれます。こちらはシンボリックリンクなし。
ちなみに DLL を作らせると ~/mingw/bin でなく ~/mingw/lib に出力され思わず失笑してしまいます。つくづく「そんなのお前だけだ」的動作をしたがる bjam たん。それに DLL のみ出力させても regexp だけスタティックライブラリを出力したりして気持ち悪いし、Wesnoth 1.8 系は Boost をスタティックリンクしていることも踏まえ、ここでは DLL は出力させない方向とします。

gettext (libintl)

日本語への翻訳をやっている方にはおなじみのツールかも。ここではツール自体ではなく intl ライブラリを得るためにビルドします。

wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.1.1.tar.gz -P ~/arc
tar zxvf ~/arc/gettext-0.18.1.1.tar.gz -C ~/src
cd ~/src/gettext-0.18.1.1
./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static --enable-threads=win32
cd gettext-runtime
make
make install
cd

gettext-runtime ディレクトリの make だけなら何の問題も起きませんが、すべてをビルドしようとすると面倒なことになります。どうせそれらは使わないためここでは無視。

以降もたびたび出てくる configure について。
クロス環境では --build にマシン環境を、--host に実行環境 (= ビルド環境) を指定します。--host が省略された場合は --build の値が転記されるのですが、だからといって --build=i586-mingw32msvc だけ指定してもうまくいきません (Makefile によっては --build と --host の差異の有無によってクロス環境か否かを判断していたりするため)。

--prefix にホーム記号(チルダ)を使うと叱られるのできちんと記述しなければなりません。基本的にホーム記号が許されるのはコマンドラインまでだよねーと考えるべきなので、こういったシーンではホーム記号でなく環境変数 $HOME で代用するようにします。
configure の生成する Makefile がデフォルトでスタティックライブラリと DLL 両方をビルドするか否かはライブラリごとに異なります。たいていは両方ですが、デフォルトで DLL しか作らないものも結構あります。今回はできるだけ DLL のみにしておく方針を採るので、ここでは --disable-static を指定しています。

--enable-threads=win32 を指定できる場合は指定する方針を採ります (ほとんどないけど) 。
これらオプションは ./configure --help で確認できるため、初めてビルドするライブラリはまず README 、INSTALL 、そして ./configure --help を一読してから行います。
なおたいていの configure はクロス環境でもどうにかぎりぎりのレベルで .exe 拡張子つきの実行ファイルをビルドしてくれますが、テスト (make test とか make check とか) までは目が行き届いていないことがほとんどで、多くの場合拡張子なしでプログラムを起動しようとして失敗します。そのためテストは基本的行いません。

libxml2

XML パーサ。Wesnoth 公式配布バイナリは Expat を使っているようであることに気付いたのが遅かった。行き掛かり上こちらを採用しています。

wget ftp://xmlsoft.org/libxml2/libxml2-2.7.7.tar.gz -P ~/arc
tar zxvf ~/arc/libxml2-2.7.7.tar.gz -C ~/src
cd ~/src/libxml2-2.7.7
./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static --with-zlib=$HOME/mingw
make
make install
cd

--with-zlib を指定しないとライブラリを見つけてくれません。--prefix 下をちょっと覗いてみてくれればいいのに。

GLib2

wget http://ftp.gnome.org/pub/gnome/sources/glib/2.27/glib-2.27.0.tar.bz2 -P ~/arc
tar jxvf ~/arc/glib-2.27.0.tar.bz2 -C ~/src
cd ~/src/glib-2.27.0
CPPFLAGS=-I$HOME/mingw/include LDFLAGS=-L$HOME/mingw/lib ./configure --host=i586-mingw32msvc --prefix=$HOME/mingw
make glib_genmarshal=`pwd`/gobject/glib-genmarshal.exe
make glib_genmarshal=`pwd`/gobject/glib-genmarshal.exe install
cd

CPPFLAGS と LDFLAGS でヘッダとライブラリの場所を教えています。ZLIB を必要とするライブラリの configure には以降もたいていこれが必要となります。他のライブラリだと --prefix 下に存在しないか一度検索してくれることも多いのですが、ZLIB はあって当たり前のライブラリだからか、いきなりチェックプログラムのコンパイルとリンクでチェックされることがほとんどなため、ヘッダとライブラリの場所を前もって教えておかなければなりません。

--build を指定しないことで、あえて configure がクロスコンパイルモードに入ることを避けています。この configure はクロスコンパイルモードに入ると実行ファイル glib-genmarshal が存在することを義務付けるのですが、実際にはそのファイルはこれからビルドしようとしているもののひとつなのです。

--enable-threads=win32 を指定すると g_thread_init_glib がエクスポートできないと言われエラーになるため指定しません。
DLL のみがビルドされます。--enable-static を指定すると、GLib2 は Windows 向けの場合スタティックライブラリと DLL を同時にビルドできないと叱られます。

--with-libiconv=gnu を指定して libiconv を使わせることはできません。この configure はなぜか、Windows 用バイナリには libiconv を使用させてくれないようになっているためです。

glib_genmarshal を設定してやらないと例によって拡張子問題を起こしエラーとなります。インストール時に勝手にテストが行われるため、この時も指定しておかないとなりません。

一方、インストールされる実行ファイルのいくつかは逆に拡張子を欠いています (たとえば glib-mkenums) 。今回は主眼がライブラリなので深く考えません。

作成されるのは libgio 、libglib 、libgmodule 、libgobject 、libgthread 。

lua

スクリプト言語エンジン。

wget http://www.lua.org/ftp/lua-5.1.4.tar.gz -P ~/arc
wget http://www.lua.org/ftp/patch-lua-5.1.4-2 -P ~/arc
tar zxf ~/arc/lua-5.1.4.tar.gz -C ~/src
cd ~/src/lua-5.1.4/src
patch < ~/arc/patch-lua-5.1.4-2
cd ..
make mingw CC=i586-mingw32msvc-gcc AR="i586-mingw32msvc-ar rcu" RANLIB=i586-mingw32msvc-ranlib
make install INSTALL_TOP=$HOME/mingw TO_BIN="lua.exe luac.exe lua51.dll"
ln -s $HOME/mingw/lib/liblua.a $HOME/mingw/lib/liblua5.1.a
cd

修正パッチが出ているのでそれを当てています。

configure がありません。Makefile には MinGW の実行ファイル名を変数で与える必要があります。
また例によって拡張子の処理が抜けているため make install がエラーになります。bin へのコピー一覧を修正したものを変数で与え、ついでに DLL が抜けているので追加してやります。

スタティックライブラリは作成されません。

Wesnoth が決め打ちで持っているライブラリファイル名がここでビルドされるものと異なっており、差異吸収のためシンボリックリンクを作成しておきます。

libjpeg

高速化されたものやパッチなどもあるようですが、ここでは IJG 謹製のものを使います。

wget http://www.ijg.org/files/jpegsrc.v8b.tar.gz -P ~/arc
tar zxvf ~/arc/jpegsrc.v8b.tar.gz -C ~/src
cd ~/src/jpeg-8b
./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

libpng

wget http://prdownloads.sourceforge.net/libpng/libpng-1.4.4.tar.xz -P ~/arc
tar Jxvf ~/arc/libpng-1.4.4.tar.xz -C ~/src
cd ~/src/libpng-1.4.4
CPPFLAGS=-I$HOME/mingw/include LDFLAGS=-L$HOME/mingw/lib ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

libtiff

wget ftp://ftp.remotesensing.org/pub/libtiff/tiff-3.9.4.tar.gz -P ~/arc
tar zxvf ~/arc/tiff-3.9.4.tar.gz -C ~/src
cd ~/src/tiff-3.9.4
CPPFLAGS=-I$HOME/mingw/include LDFLAGS=-L$HOME/mingw/lib ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

ZLIB や libjpeg を見つけさせるため CPPFLAGS と LDFLAGS を指定しています。これらライブラリの認識のためのオプションは別に設けられているのですが、この方法のほうが手軽なので。

libogg

wget http://downloads.xiph.org/releases/ogg/libogg-1.2.0.tar.gz -P ~/arc
tar zxvf ~/arc/libogg-1.2.0.tar.gz -C ~/src
cd ~/src/libogg-1.2.0
./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

libvorbis

wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.1.tar.bz2 -P ~/arc
tar jxvf ~/arc/libvorbis-1.3.1.tar.bz2 -C ~/src
cd ~/src/libvorbis-1.3.1
./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

FreeType

TrueType ライブラリ。

wget http://download.savannah.gnu.org/releases/freetype/freetype-2.4.2.tar.bz2 -P ~/arc
tar jxvf ~/arc/freetype-2.4.2.tar.bz2 -C ~/src
cd ~/src/freetype-2.4.2
CPPFLAGS=-I$HOME/mingw/include LDFLAGS=-L$HOME/mingw/lib ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

fontconfig

フォント設定管理ライブラリ。

wget http://fontconfig.org/release/fontconfig-2.8.0.tar.gz -P ~/arc
tar zxvf ~/arc/fontconfig-2.8.0.tar.gz -C ~/src
cd ~/src/fontconfig-2.8.0
PKG_CONFIG_PATH=$HOME/mingw/lib/pkgconfig ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static --with-arch=mingw32 --enable-libxml2 --with-freetype-config=$HOME/mingw/bin/freetype-config
make
make install RUN_FC_CACHE_TEST=false
cd

libxml2 の場所を探すために pkg-config を使用しているので、libxml2 の .pc ファイル がある場所を PKG_CONFIG_PATH で指定しています。
pkg-config はいまどきの主流らしく、ライブラリによってはその亜流を自前で持っていたりします。sdl-config もそうですし、ここでパスを教えてやっている freetype-config もそうです。

RUN_FC_CACHE_TEST=false はインストール時に勝手に実行される fc-cache に拡張子が指定されていないためエラーとなるのを避けるため。

pixman

Cairo のデフォルトバックエンドとなるピクセル操作ライブラリ。

wget http://cairographics.org/releases/pixman-0.19.4.tar.gz -P ~/arc
tar zxvf ~/arc/pixman-0.19.4.tar.gz -C ~/src
cd ~/src/pixman-0.19.4
./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static --disable-sse2 --disable-vmx --disable-arm-simd --disable-arm-neon
make SUBDIRS=pixman
make SUBDIRS=pixman install
cd

配布することを考えると、高速化オプションはせいぜい MMX 程度にしておいたほうがよさそうなので、SSE2 、VMX 、ARM SIMD 、ARM NEON は使わないよう指定します。

test/utils.c に、mmap が使えないのに使おうとするバグがあるため make に失敗してしまいます。#if の条件に HAVE_SYS_MMAN_H を追加してやれば対処できるのですが、そうまでしてテストプログラムをビルドしても仕方ないので、ライブラリのビルドのみ行っています。しかし単に pixman ディレクトリで make && make install するだけだと .pc ファイルがインストールされないため、SUBDIRS 変数を設定する方法を採っています。

Cairo

ベクトル描画ライブラリ。

wget http://www.cairographics.org/releases/cairo-1.10.0.tar.gz -P ~/arc
tar zxvf ~/arc/cairo-1.10.0.tar.gz -C ~/src
cd ~/src/cairo-1.10.0
PKG_CONFIG_PATH=$HOME/mingw/lib/pkgconfig CPPFLAGS=-I$HOME/mingw/include LDFLAGS=-L$HOME/mingw/lib ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static --disable-ps
make
make install
cd

libpng の検索に PKG_CONFIG_PATH が、ZLIB の検索に CPPFLAGS と LDFLAGS が使用されます。

--disable-ps をしないとエラーとなるため指定しています。

Pango

文字描画ライブラリ。Cairo と合体して pangocairo になります。

wget http://ftp.gnome.org/pub/GNOME/sources/pango/1.28/pango-1.28.1.tar.bz2 -P ~/arc
tar jxvf ~/arc/pango-1.28.1.tar.bz2 -C ~/src
cd ~/src/pango-1.28.1
PKG_CONFIG_PATH=$HOME/mingw/lib/pkgconfig CXX=i586-mingw32msvc-gcc ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --with-included-modules=yes --with-dynamic-modules=no
make GLIB_MKENUMS=$HOME/mingw/bin/glib-mkenums
make install RUN_QUERY_MODULES_TEST=false
cd

GLib2 や Cairo の検索に PKG_CONFIG_PATH が使用されます。
なぜか CXX だけ正しい実行ファイル名でなく gcc だの c++ だのに落ち着いてしまい、make でエラーとなるため、明示します。

--with-included-modules=yes --with-dynamic-modules=no により、Pango モジュールを別モジュールにせず組み込みとします。

GLIB_MKENUMS のファイル名とパスを指定してやる必要があります。

RUN_QUERY_MODULES_TEST=false を指定してインストール時の勝手にテストを回避します。

Windows 用バイナリは DLL しか作成できず、--enable-static を指定しても無視されます。

SDL

wget http://www.libsdl.org/release/SDL-1.2.14.tar.gz -P ~/arc
tar zxvf ~/arc/SDL-1.2.14.tar.gz -C ~/src
cd ~/src/SDL-1.2.14
./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

SDL_image

wget http://www.libsdl.org/projects/SDL_image/release/SDL_image-1.2.10.tar.gz -P ~/arc
tar zxvf ~/arc/SDL_image-1.2.10.tar.gz -C ~/src
cd ~/src/SDL_image-1.2.10
PKG_CONFIG_PATH=$HOME/mingw/lib/pkgconfig CPPFLAGS=-I$HOME/mingw/include LDFLAGS=-L$HOME/mingw/lib ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

SDL の検索に PKG_CONFIG_PATH が、libjpeg 等の検索に CPPFLAGS と LDFLAGS が使用されます。

SDL_mixer

wget http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.11.tar.gz -P ~/arc
tar zxvf ~/arc/SDL_mixer-1.2.11.tar.gz -C ~/src
cd ~/src/SDL_mixer-1.2.11
PKG_CONFIG_PATH=$HOME/mingw/lib/pkgconfig CPPFLAGS=-I$HOME/mingw/include LDFLAGS=-L$HOME/mingw/lib ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static
make
make install
cd

SDL の検索に PKG_CONFIG_PATH が、libogg 等の検索に CPPFLAGS と LDFLAGS が使用されます。

SMPEG がないので MP3 サポートが無効となります。しかし現状の Wesnoth は .ogg と .wav しか鳴らさないので問題ないはず。

SDL_net

wget http://www.libsdl.org/projects/SDL_net/release/SDL_net-1.2.7.tar.gz -P ~/arc
tar zxvf ~/arc/SDL_net-1.2.7.tar.gz -C ~/src
cd ~/src/SDL_net-1.2.7
PKG_CONFIG_PATH=$HOME/mingw/lib/pkgconfig ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static --disable-sdltest --disable-gui
make
make install
cd

SDL の検索に PKG_CONFIG_PATH が使用されます。

--disable-sdltest --disable-gui を指定してテストプログラム実行を抑止しています。

SDL_ttf

wget http://www.libsdl.org/projects/SDL_ttf/release/SDL_ttf-2.0.10.tar.gz -P ~/arc
tar zxvf ~/arc/SDL_ttf-2.0.10.tar.gz -C ~/src
cd ~/src/SDL_ttf-2.0.10
PKG_CONFIG_PATH=$HOME/mingw/lib/pkgconfig ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --disable-static --with-freetype-prefix=$HOME/mingw
make
make install
cd

SDL の検索に PKG_CONFIG_PATH が使用されます。

--with-freetype-prefix は freetype-config を探すのに必要です。

libiconv

文字コード変換ライブラリの代表格。

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz -P ~/arc
wget http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.13-ja-1.patch.gz -P ~/arc
tar zxvf ~/arc/libiconv-1.13.1.tar.gz -C ~/src
cd ~/src/libiconv-1.13.1
gzip -dc ~/arc/libiconv-1.13-ja-1.patch.gz | patch -p1
./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw
make
make install
cd

CP932等を追加修正するパッチを当てています。実際のところ、現状 SDLSKK しか使用せず、その SDLSKK もせいぜい EUC-JP と UTF-8 の相互変換程度にしか使っていないはずではありますが、縁起物なので一応。

作成されるのは libiconv 、libcharset 。

SDLSKK

SDL 用 SKK ライブラリ。

wget http://www.kmc.gr.jp/~ohai/sdlskk/sdlskk-0.4.tar.gz -P ~/arc
tar zxvf ~/arc/sdlskk-0.4.tar.gz -C ~/src
cd ~/src/sdlskk-0.4
CPPFLAGS=-I$HOME/mingw/include LDFLAGS=-L$HOME/mingw/lib CC=i586-mingw32msvc-gcc ./configure --build=i586-linux --host=i586-mingw32msvc --prefix=$HOME/mingw --with-sdl-prefix=$HOME/mingw --disable-sdltest
make LIBS=-liconv
make install
cd

CPPFLAGS と LDFLAGS は make で iconv 等を探すために必要です。
configure 内部で $host を用いてコンパイラなどのコマンド名をうまく取得しようとしている流れが存在しますが、CC だけは SDL_ttf のチェックで先走って使用されるため、外から与えてやらなければなりません。

--with-sdl-prefix は sdl-config を探すのに必要です。

--disable-sdltest はテストプログラム実行を抑止するために必要です。

configure が iconv の検出に失敗します (が、必須にもかかわらずエラーにならない) 。
原因は iconv の関数の持ち方。iconv_open は実際は libiconv_open という名前で宣言されており、iconv.h で名前の挿げ替えがなされています。しかし configure の吐くテストプログラムは iconv.h をインクルードしないため libiconv_open を見つけられず、iconv_open がないから失敗と判定してしまいます。
make に直接ライブラリ名を与えて対処します。

スタティックライブラリのみ作成されます。configure で --disable-static しても結局はスタティックライブラリしか作成されません。

Wesnoth のビルド

wget http://sourceforge.net/projects/wesnoth/files/wesnoth-1.8/wesnoth-1.8.5/wesnoth-1.8.5.tar.bz2 -P ~/arc
wget http://openlab.jp/skk/dic/SKK-JISYO.L.unannotated.gz -P ~/arc
wget http://osdn.dl.sourceforge.jp/wesnoth-ja/49101/wesnoth-1.8.5_ja-catalogs-20100926.zip -P ~/arc
tar jxvf ~/arc/wesnoth-1.8.5.tar.bz2 -C ~/src
cd ~/src/wesnoth-1.8.5

# SDLSKK パッチ
patch -p1 < ~/wesnoth-1.8.5-sdlskk-20101019.diff

# SDLSKK データファイルの設置
gzip -dc ~/arc/SKK-JISYO.L.unannotated.gz | iconv --from-code EUC-JP --to-code UTF-8 - > data/sdlskk/SKK-JISYO.L.unannotated
iconv --from-code EUC-JP --to-code UTF-8 ../sdlskk-0.4/rule_table > data/sdlskk/rule_table

# シナリオの更新
unzip -p ~/arc/wesnoth-1.8.5_ja-catalogs-20100926.zip wesnoth-1.8.5_ja-catalogs-20100926/wesnoth-1.8.5_httt-20100926_ja.po > po/wesnoth-httt/ja.po

# DLL
cp -fa ~/mingw/bin/*.dll .
cp -fa `locate mingwm10.dll.gz` . && gzip -d mingwm10.dll.gz

# ビルドとインストーラ作成
PKG_CONFIG_PATH=$HOME/mingw/lib/pkgconfig scons host=i586-mingw32msvc prefix=$HOME/mingw boostdir=$HOME/mingw/include/boost-1_44 boostlibdir=$HOME/mingw/lib boost_suffix=-mgw42-mt.a windows-installer
cd

ビルドとインストーラ作成にそれぞれそこそこ時間を要します。お疲れ様でした。

公式バイナリと異なり、面倒なので FriBiDi ライブラリ (右から左に書く言語圏用処理) をリンクしていません。日本しか視野に入れていないので特に問題ないはずですが、日本でも今後軍靴の音が聞こえてきた場合は再び右から左に書かなければならなくなる可能性もあるので注意が必要です。
SDL_mixer に SMPEG をリンクしていないので MP3 が鳴らせない点にも注意 (1.8.5 の配布物に MP3 は含まれていないし、よりによって今後わざわざ MP3 ファイルを追加するとも思えませんが) 。

付録

パッチ作成方法

手を加えた wesnoth-1.8.5 ディレクトリとオリジナルソースの diff をとってパッチを作成する手順を書いておきます。
プログラムソースだけでなく、翻訳ファイルの配布にも diff と patch を使ったほうが、サイズの軽減とか手間の削減とかにつながるかも知れません。

# まずビルドの結果物をクリーンナップ
cd ~/src/wesnoth-1.8.5
scons -c .
rm -R *.dll *.exe data/sdlskk/SKK-JISYO.L.unannotated data/sdlskk/rule_table .scons-option-cache build translations
find -name '*.pyc' -exec rm {} \;

# オリジナルソースを展開して wesnoth-1.8.5-org というディレクトリ名にする
cd ~/src
mv wesnoth-1.8.5 wesnoth-1.8.5.x
tar jxvf ~/arc/wesnoth-1.8.5.tar.bz2
mv wesnoth-1.8.5 wesnoth-1.8.5-org
mv wesnoth-1.8.5.x wesnoth-1.8.5

# パッチを作成
diff -Naru wesnoth-1.8.5-org wesnoth-1.8.5 > ~/wesnoth-1.8.5-sdlskk-2010xxxx.diff

# オリジナルソースを削除
rm -R wesnoth-1.8.5-org
cd

できたパッチの使い方は Wesnoth のビルドのときと同じです。

# 現在のディレクトリを退避
cd ~/src
mv wesnoth-1.8.5 wesnoth-1.8.5.x

# オリジナルソースを展開
tar jxvf ~/arc/wesnoth-1.8.5.tar.bz2

# パッチを当てる
cd ~/src/wesnoth-1.8.5
patch -p1 < ~/wesnoth-1.8.5-sdlskk-2010xxxx.diff

コメント

  • (今更ですが)作成ありがとうございます。すばらしいです!本題とは異なるところにちょっとコメント。《翻訳ファイルの配布にも diff と patch を使ったほうが、サイズの軽減とか手間の削減とかにつながるかも知れません》についてはja.poへのdiffは極めて面倒になる可能性が高いため、あまり賛同できません。シナリオのファイルの一部にコメント文字列を追加した場合、当然そのファイルから生成されたja.poにある行番号、たとえばdata/campaigns/Heir_To_The_Throne/_main.cfgの10行目になんかコメントを追加した場合は「#: data/campaigns/Heir_To_The_Throne/_main.cfg:17」にある「17」という数字が「18」などに変更されます。そしてもちろんdiffとpatchはそういうところも見ているわけで、patchによって差分が適用されなくなってしまいます。従って、ja.poでdiffを取った場合、それをpatchするには「diffを取ったja.po」そのものをpatchの対象にしないと大抵の場合は破綻します。そういうデメリットがあるのです。故に、テキストファイルであるja.poをdiffを取ることで容量が少なくなるという僅かなメリットを得るために失うものが大きくなりすぎちゃいます。 -- iwaim? 2011-04-03 (日) 02:53:49
  • 私の経験では「ja.poそのものではなくdiffによる差分を配布する場合、サイズは軽減し、手間は大きく増える」となっちゃいます。なお、日本語メンテナとしては更新した翻訳物をdiffで送っていただいた場合は一応svn trunkにpatch(1)をやってみた上で「svn trunkにpatch(1)で適用できないからja.poそのものを送ってください。それがどうしても難しいならば基にしたja.poのsvnでのリビジョンを教えてください」と連絡することになると思います。 -- iwaim? 2011-04-03 (日) 02:58:17

*1 ネットワーク問題とは、同系統のネットワークライブラリを使うバージョンのサーバとしか接続できない、というものです。Wesnoth は 1.8 系で SDL_net を、1.9 系で ANA をネットワークライブラリとして使用していますが、普通はそういったことに関係なく相互接続ができます。しかし 1.8.4-20100915 と、同様の手順で作った 1.9.0 サーバとは接続ができません。結果として 1.8.4-20100915 は公式サーバのうち server2 にしか接続できず、同様の手順で作った 1.9.0 クライアントは公式サーバ server と server3 にしか接続できないということになりました。どちらにも問題なく接続できる公式バイナリが MinGW でビルドされていることは同梱の DLL から明らかで、すなわち問題の解決には MinGW への移行が不可欠だろうと考えました。
*2 なお仮想化ソフトウェアに VMware を選択したのは、フリーで有名でとっつきやすそうなイメージが浸透しているからです。個人的には自宅サーバで使っている KVM のほうが都合がいいのですが。