Help us understand the problem. What is going on with this article?

Simutransをビルドしてみる

More than 3 years have 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生活、あなたも始めてみては?

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away