Docker を使用することで、ホスト環境を汚さずに一貫したビルド環境を構築できます。すべての依存関係が Docker イメージ内に含まれるため、セットアップが簡単です。
このドキュメントは以下の目的で作成されています:
対象読者:
docker --version
docker-compose --version
# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# Docker Compose
sudo apt-get install docker-compose-plugin
# 再ログイン後、確認
docker --version
docker compose version
# プロジェクトディレクトリに移動
cd c:/dev/simutrans
# Dockerイメージをビルド
docker-compose build
# コンテナを起動してビルド
docker-compose run --rm simutrans-build docker-build.sh make
# または、コンテナに入ってインタラクティブに作業
docker-compose run --rm simutrans-build
# コンテナ内で:
# ./docker-build.sh make
# Dockerイメージをビルド
docker build -t simutrans-build .
# コンテナ内でビルド
docker run --rm -v ${PWD}:/simutrans simutrans-build docker-build.sh make
# または、コンテナに入る
docker run -it --rm -v ${PWD}:/simutrans simutrans-build bash
# Docker Composeの場合
docker-compose run --rm simutrans-build docker-build.sh make
# または手動で
docker-compose run --rm simutrans-build bash
# コンテナ内:
autoconf
./configure
make -j$(nproc)
# Docker Composeの場合
docker-compose run --rm simutrans-build docker-build.sh cmake
# または手動で
docker-compose run --rm simutrans-build bash
# コンテナ内:
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DSIMUTRANS_BACKEND=sdl2 ..
cmake --build . -j$(nproc)
Docker 環境(Linux)から Windows 用バイナリ(.exe)を生成できます。
# MinGWイメージをビルド(初回のみ)
docker-compose build simutrans-mingw
# Windows用バイナリをビルド
docker-compose run --rm simutrans-mingw docker-build-mingw.sh make
# または、コンテナに入って手動でビルド
docker-compose run --rm simutrans-mingw bash
# コンテナ内:
./docker-build-mingw.sh make
# ビルド成果物を確認
ls -lh sim.exe
✅ クロスプラットフォーム: Linux や macOS から Windows バイナリをビルド可能 ✅ 環境の一貫性: Docker コンテナで依存関係が完全に管理される ✅ CI/CD 対応: GitHub Actions などで自動ビルド可能 ✅ Windows 不要: Windows マシンが不要でビルド可能
⚠️ MinGW でビルドされたバイナリは、Windows 用の依存 DLL が必要な場合があります。配布時は依存関係を確認してください。
ビルド済みの sim.exe と必要な DLL をまとめて dist/win64/ にコピーします。
# 必要なDLLを収集してステージング
docker-compose run --rm simutrans-mingw ./docker-build-mingw.sh stage
# Windows側での起動例(PowerShell)
.\u005cdist\win64\sim.exe
dist/win64/ に含まれる主なファイル:
(Windows 標準の DLL はコピーされません。上記を同梱すれば DLL 不足エラーが解消されます。)
詳細は DEVELOPMENT_SETUP.md の Windows セクションを参照してください。
# PowerShell を「管理者として実行」で開く
# vcpkg のセットアップ
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install
cd ..
# MSBuild でビルド(32-bit GDI)
msbuild /m .\Simutrans-GDI.vcxproj -p:Configuration=Release /p:platform=Win32
# または、64-bit SDL2
msbuild /m .\Simutrans-SDL2.vcxproj -p:Configuration=Release /p:platform=x64
# ビルドファイルの確認
# build/GDI/Simutrans GDI Nightly.exe (32-bit GDI版)
# build/SDL2/Simutrans SDL2 Nightly.exe (64-bit SDL2版)
プロジェクトには自動ビルドワークフローが含まれています:
.github/workflows/nightly-windows-ms.yml - 32-bit GDI 版.github/workflows/nightly-windows64-SDL2-ms.yml - 64-bit SDL2 版これらはプッシュ時に自動実行され、リリースファイルが生成されます。
| バックエンド | プロジェクト | ビット数 | 用途 |
|---|---|---|---|
| GDI | Simutrans-GDI.vcxproj | 32-bit | 古い Windows との互換性が必要な場合 |
| SDL2 | Simutrans-SDL2.vcxproj | 64-bit | 推奨(より新しく、機能が豊富) |
Windows ビルドでは、vcpkg を通じて以下のライブラリが自動インストールされます:
- zlib
- libpng
- freetype
- bzip2
- zstd
- miniupnpc
- fluidsynth
- fontconfig
詳細は vcpkg.json を参照してください。
vcpkg インストールエラー
# vcpkg キャッシュをクリア
.\vcpkg remove '*' --outdated
.\vcpkg update
MSBuild が見つからない
# Visual Studio のインストール確認
Get-Command msbuild
# または、Visual Studio Installer から C++ ワークロードを追加
ビルドファイルが見つからない
# 64-bit GDI 版(推奨)
# build/GDI/Simutrans GDI Nightly.exe
# または 32-bit SDL2 版
# build/SDL2/Simutrans SDL2 Nightly.exe
便利なビルドスクリプトが用意されています:
# Makeでビルド(デフォルト)
docker-compose run --rm simutrans-build docker-build.sh make
# CMakeでビルド
docker-compose run --rm simutrans-build docker-build.sh cmake
# クリーン
docker-compose run --rm simutrans-build docker-build.sh clean
VSCode の Dev Container 機能を使用すると、統合開発環境として使用できます。
これで、VSCode が自動的に Docker コンテナ内で動作するようになります。
simutrans/
├── Dockerfile # Dockerイメージ定義
├── docker-compose.yml # Docker Compose設定
├── docker-build.sh # ビルドスクリプト
├── .dockerignore # Docker除外ファイル
└── .devcontainer/ # VSCode Dev Container設定
└── devcontainer.json
症状: Docker Desktop が動作していない
解決方法:
# Docker Desktopを起動
# Windowsの場合、スタートメニューから「Docker Desktop」を起動
症状: メモリ不足エラー
解決方法:
# 並列ビルド数を減らす
docker-compose run --rm simutrans-build bash
# コンテナ内:
make -j2 # 2並列に制限
症状: ビルド成果物が root ユーザー所有になる
解決方法:
# コンテナ実行後、権限を修正
sudo chown -R $USER:$USER build/
# または、Dockerfileを修正してユーザーIDを合わせる
症状: イメージビルドが失敗
解決方法:
# 不要なイメージとコンテナを削除
docker system prune -a
# ビルドキャッシュをクリア
docker builder prune
Docker 環境でのビルドを実現するため、以下の修正が Simutrans のソースコードに加えられました。
fontconfig が libexpat に依存しているため、静的リンク時にシンボルが解決されないエラーが発生していました。
修正内容:
RUN apt-get update && apt-get install -y \
...
libexpat1-dev \ # 追加
...
理由: fontconfig ライブラリが XML パース機能で libexpat を使用しており、明示的にインストールする必要があります。
fontconfig を検索する際に、依存関係である libexpat を明示的にリンクするよう修正しました。
修正内容:
# fontconfig オプション検索
AC_SEARCH_LIBS(FcInitLoadConfigAndFonts, fontconfig,
[AC_SUBST(fontconfig, 1)],
[AC_SUBST(fontconfig, 0)],
[-lfontconfig -lexpat]) # 修正: -lexpat を追加
理由: configure スクリプトが fontconfig ライブラリをテストする際に、その依存関係も含めてリンクする必要があります。
Linux 環境では pkg-config --libs --static を使用して、すべての依存関係を正しく解決するよう修正しました。
修正内容:
ifdef USE_FONTCONFIG
ifeq ($(shell expr $(USE_FONTCONFIG) \>= 1), 1)
CFLAGS += -DUSE_FONTCONFIG
CFLAGS += $(shell $(FONTCONFIG_CONFIG) --cflags)
ifeq ($(shell expr $(STATIC) \>= 1), 1)
LDFLAGS += $(shell $(FONTCONFIG_CONFIG) --libs --static) # 修正
else
LDFLAGS += $(shell $(FONTCONFIG_CONFIG) --libs)
endif
endif
endif
理由: 静的リンク時に、pkg-config の --static フラグを使用することで、libexpat を含むすべての依存ライブラリが正しくリンクされます。
Linux 環境では完全な静的リンクが推奨されないため、デフォルト値を変更しました。
修正内容:
# Before:
STATIC := 1 # Enable static linkage
# After:
STATIC := 0 # Enable static linkage (disabled for Linux)
理由:
_dl_x86_cpu_features など)に依存しており、完全な静的リンクは問題を引き起こします以下のコマンドで正常にビルドできることを確認できます:
docker-compose build
docker-compose run --rm simutrans-build docker-build.sh make
# 実行ファイルが生成されたことを確認
docker-compose run --rm simutrans-build ls -lh /simutrans/sim
成功時の出力例:
-rwxr-xr-x 1 root root 7.9M Jan 12 08:22 /simutrans/sim
# 特定のバックエンドでビルド
docker-compose run --rm simutrans-build bash
# コンテナ内:
cmake -B build -DSIMUTRANS_BACKEND=gdi
cmake --build build
実行環境を軽量化したい場合は、Dockerfile をマルチステージに修正:
# ビルドステージ
FROM ubuntu:22.04 AS builder
# ... ビルド処理 ...
# 実行ステージ
FROM ubuntu:22.04
COPY --from=builder /simutrans/build/default/sim /usr/local/bin/
# 実行時の依存関係のみインストール
RUN apt-get update && apt-get install -y \
libsdl2-2.0-0 \
libpng16-16 \
...
# バックグラウンドで起動
docker-compose up -d simutrans-build
# 別のターミナルから接続
docker-compose exec simutrans-build bash
name: Build Simutrans
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Docker image
run: docker-compose build
- name: Build Simutrans
run: docker-compose run --rm simutrans-build docker-build.sh make
build:
image: docker:latest
services:
- docker:dind
script:
- docker-compose build
- docker-compose run --rm simutrans-build docker-build.sh make
# Dockerのビルドキャッシュを使用
docker-compose build --no-cache # キャッシュをクリアして再ビルド
# ボリュームでビルドキャッシュを永続化(docker-compose.ymlで設定済み)
# CPUコア数に応じて調整
docker-compose run --rm -e MAKEFLAGS="-j8" simutrans-build docker-build.sh make
本番環境では、非 root ユーザーでコンテナを実行することを推奨:
# Dockerfileに追加
RUN useradd -m -u 1000 simutrans
USER simutrans
# ベースイメージを定期的に更新
docker-compose build --pull
Dockerfile (Linux/GCC 用)Dockerfile.mingw (Windows クロスコンパイル用)docker-compose.ymldocker-build.shdocker-build-mingw.shCMakeLists.txtcmake/SimutransBackend.cmakeDocker を使用した Simutrans のビルドは、再現性と便利さを提供します:
主な特徴:
docker-compose up だけでビルド環境が完成Docker 環境でのビルドに慣れたら、DEVELOPMENT_SETUP.md でネイティブ環境も試してみましょう。