Linux
MinGW
Simutrans

Simutransをビルドしてみる

More than 1 year has passed since last update.

はじめに

Simutransは割と有名な(?)公共交通シミュレーションゲームですが、よくある環境でも動くように公式のバイナリは32Bit版で、しかもマルチスレッドでの動作に対応していません。

そこでこの記事では自力でビルドすることによって、64Bit対応でしかもマルチスレッド処理分散までできてしまうSimutransを作ってみる手順を紹介します。

なおこの記事では、Arch Linux上でMinGWを使ったWindows用Simutransのクロスビルドと、Windows上でMSYS + MinGWを使った普通の(?)ビルドに挑戦します。

この手順でビルドしたSimutransが完全に意図した動作になるかどうかは未検証です。急な不具合などが発生する可能性があります。

用意するもの

AURにMinGWクロスビルド用のライブラリが充実しているため、Arch Linux環境を利用します。AURを利用するため、yaourtなどのツールを導入しておきましょう。

Windows上の場合は、事前にMSYS2を導入しておいてください。

ビルドの準備(Linuxのみ)

ビルドに必要なパッケージをインストールします。
MinGW関連のインストールは全てAURから行われるので、事前にbase-develをインストールしておきましょう。
あとで使うツールもついでに入れておきます。

$ yaourt -S base-devel git zip unzip
$ yaourt -S mingw-w64-zlib mingw-w64-bzip2 mingw-w64-libpng

ビルドの準備(MSYSのみ)

こちらはpacmanから全て導入出来ます。

$ pacman -S make mingw-w64-x86_64-toolchain mingw-w64-x86_64-zlib mingw-w64-x86_64-bzip2 mingw-w64-x86_64-libpng

安定版ソースコードの取得

SourceForgeから落としてきます。執筆時の安定版なので、その都度最新版を確かめてダウンロードしてください。
なぜかビルドに必要なファイルがいくつかが欠落しているので、Githubからもらってきます。

$ wget https://jaist.dl.sourceforge.net/project/simutrans/simutrans/120-2-2/simutrans-src-120-2-2.zip
$ unzip simutrans-src-120-2-2.zip -d simutrans
$ cd simutrans
$ wget https://raw.githubusercontent.com/aburch/simutrans/master/Simutrans.manifest
$ wget https://raw.githubusercontent.com/aburch/simutrans/master/distribute.sh

開発版ソースコードの取得(共通)

Githubからクローンしてきます。cdして次の作業に備えましょう。

$ git clone https://github.com/aburch/simutrans.git
$ cd simutrans

設定ファイルの準備(共通)

デフォルトの設定ファイルをコピーして、ビルド用の設定ファイルを準備します。
適当なエディタで設定ファイルを開き、以下のように編集します。

蛇足ですが、+3,133行目から13行分にわたってという意味です。
編集箇所の目安にお使いください。

$ cp config.template config.default
$ vim config.default
@@ -3,8 +3,13 @@
 # copy this file to config.default and adjust the settings
 #

+CC=x86_64-w64-mingw32-gcc
+CXX=x86_64-w64-mingw32-g++
+CFLAGS=-fpermissive
+CXXFLAGS=$(CFLAGS)
+
 #BACKEND = allegro
-#BACKEND = gdi
+BACKEND = gdi
 #BACKEND = opengl
 #BACKEND = sdl
 #BACKEND = sdl2
@@ -12,7 +17,7 @@
 #BACKEND = posix

 #COLOUR_DEPTH = 0
-#COLOUR_DEPTH = 16
+COLOUR_DEPTH = 16

 #OSTYPE = amiga
 #OSTYPE = beos
@@ -20,23 +25,23 @@
 #OSTYPE = freebsd
 #OSTYPE = haiku
 #OSTYPE = linux
-#OSTYPE = mingw
+OSTYPE = mingw
 #OSTYPE = mac

 #DEBUG = 1    # Level 1-3, higher number means more debug-friendly but slower, see Makefile
 #MSG_LEVEL = 1 # Level 1-4, more runtime debug messages (without only warnings and errors)
-#OPTIMISE = 1 # Add umpteen optimisation flags
+OPTIMISE = 3 # Add umpteen optimisation flags
 #PROFILE = 1  # Enable profiling
 #PROFILE = 2  # Enable profiling with optimisation flags, can be used with `OPTIMISE = 1'

-#STATIC = 1   # Enable static linkage, currently mingw only
+STATIC = 1   # Enable static linkage, currently mingw only

 #WITH_REVISION = 1 # adds the revision from svn; required for networkgames
 # if you do not use SVN, add -DREVISION="1234" to the FLAGS below

 #WIN32_CONSOLE = 1 # adds a console for windows debugging

-#MULTI_THREAD = 1 # Enable multithreading
+MULTI_THREAD = 1 # Enable multithreading

 # Define these as empty strings, if you don't have the respective config program
 #ALLEGRO_CONFIG = allegro-config
@@ -76,7 +81,7 @@
 # DESTINATION_CITYCARS: Citycars can have a destination (not recommended)
 #
 # In order to use the flags, add a line like this: (-Dxxx)
-# FLAGS = -DUSE_C
+FLAGS = -DUSE_C

 # Output directories:
 #

Makefileの修正(ほぼ共通)

今度はビルドが通るようにMakefileを編集します。念のためオリジナルは残しておきました。
これも以下のように編集してください。

なおMSYSの場合はwindresの箇所は変更しないでそのままにしてください。

$ cp Makefile Makefile.orig
$ vim Makefile
@@ -32,7 +32,7 @@
       else
         ifeq ($(OSTYPE),mingw)
           CFLAGS  += -DPNG_STATIC -DZLIB_STATIC
-          LDFLAGS += -static-libgcc -static-libstdc++ -Wl,-Bstatic -lpthread -lbz2 -lz -Wl,-Bdynamic -Wl,--large-address-aware
+          LDFLAGS += -static-libgcc -static-libstdc++ -Wl,-Bstatic -lpthread -lbz2 -lz -Wl,-Bdynamic
           ifneq ($(STATIC),)
             ifeq ($(shell expr $(STATIC) \>= 1), 1)
               CFLAGS  += -static
@@ -613,7 +613,7 @@

 ifneq ($(findstring $(OSTYPE), cygwin mingw),)
   SOURCES += simres.rc
-  WINDRES ?= windres
+  WINDRES ?= x86_64-w64-mingw32-windres
 endif

 CCFLAGS  += $(CFLAGS)

ソースコードの修正(Linuxのみ)

Windows.hが大文字で始まっているせいでコンパイルがこけてしまいます。
utils/searchfolder.ccの該当箇所を修正しましょう。

$ cp utils/searchfolder.cc utils/searchfolder.cc.orig
$ vim utils/searchfolder.cc
@@ -5,7 +5,7 @@
 #include <dirent.h>
 #else
 #define NOMINMAX
-#include <Windows.h>
+#include <windows.h>
 #include <io.h>
 #endif

いざビルド(共通)

ここまでできればmakeするだけの簡単ビルドです。
並列コンパイルをする場合はCPUのコア数+1ぐらいの値を-jの後ろにつけましょう。

$ make -j9

パッケージの作成(共通)

最後に、コンパイルしたバイナリの他に言語ファイルやテーマなど起動に必要なファイルをまとめてパッケージを作成します。以下のコマンドを叩いて、生成されたsimuwin-.zipをWindows側に転送すればOKです。

$ cp build/default/sim sim.exe
$ ./distributes

いざプレイ

simuwin-.zipを展開して、事前にダウンロードしておいたお好みの基本pakをsimutrans.exeと同じ階層に入れてから起動します。後はいつも通りのんびりプレイしていきましょう。

おまけ - makeobjのビルド

アドオンの自作に必要なmakeobjもビルドしてみましょう。

まずはmakeobjディレクトリに移動して、Makefileを修正します。
なぜかpentium指定になっていて64Bitではビルド出来ないのでnativeに変更しておきます。

$ cd makeobj
$ cp Makefile Makefile.orig
$ vim Makefile
@@ -30,7 +30,7 @@
 endif

 ifeq ($(OSTYPE),mingw)
-  OS_OPT   ?= -DPNG_STATIC -DZLIB_STATIC -march=pentium
+  OS_OPT   ?= -DPNG_STATIC -DZLIB_STATIC -march=native
   LDFLAGS += -static-libgcc -static-libstdc++ -static
   # we need the libraries EXACTLY in this order to link
   STD_LIBS = -lmingw32 -lpng -lz

後はコンパイルするだけです。

$ make -j9

コンパイルが終わったら、ソースコードのルートディレクトリにあるbuild/default/makeobjの中にmakeobj.exeができあがりますので、こちらをコピーしてご利用ください。

おわりに

事前の準備にいろいろとやることが多いですが、そんなに難易度は高くない作業でビルドが可能です。
自前ビルドの快適Simutrans生活、あなたも始めてみては?