ADSのビルドに21時間かけた話

AI作るにあたりADSと連携できないかとファイル漁ってたら、どうやらGithubに公開されているらしいので見に行くと、C++Luaで書かれていたのでとりあえずソースからコンパイルして実行できないか試してみた。
github.com

プロジェクトになれていない私には睡眠3時間のハードタスクだった。

OSはwindows10

手順概要

ソースコードに書いてある。

という不親切なことはやめておいて、未来の自分のためにメモしておこう。
ざっくりとした手順は次の通り。

  1. 必要なツール、ライブラリをダウンロードして環境を整える。
  1. プロジェクトチームが作成したビルド用のシェルスクリプトを読み解きながら、コマンド入力を行う。
  1. エラーを処理しながらビルドする。

シェルスクリプト解読に気付くまでに17時間くらい使い、そこから4時間程度で完成。
Githubwiki欄を参照すると古い情報ゆえに私のように無駄な時間を過ごすので、スクリプトの意味がわからなかった時にだけ参考にするように。

参照コード

.travis.ymltravisフォルダ
travisCIというサービスが自動でビルドしてくれるらしく、その命令用のソースがこれら。
即ちビルド手順が全てここに詰め込まれているのである。

次の三行を実行すればよい。
f:id:nnt339:20200928011750p:plain
(そのままコマンドラインに入力しても無意味なことに注意!)

インストールしたツールたち

それぞれビルドとダウンロードに使う。

VisualStudioには「C++によるデスクトップ開発」と「個別コンポーネント/VS 2017 (v141) ツールの C++ Windows XP サポート [非推奨]」をインストールしておく必要がある。

ソースのダウンロード

Unixコマンドを使用するためターミナルにはGit Bashを使用する。
(Cの講義取ってなかったらUnixコマンド一生知らなかっただろうな...)
ダウンロードしたいディレクトリに移動して

#ソースのダウンロード
$ git clone https://github.com/edo9300/ygopro.git ads
$ cd ads
#ocgcoreのダウンロード
$ git clone https://github.com/edo9300/ygopro-core ocgcore

例の3行を実行

1行目
$ ./travis/install-premake5.sh windows

/ads/直下にpremake5.exeが追加される。
MacLinuxユーザーはソース見ながら適宜変更して。

2行目

ソースの中身を見ると次の三つを実行すべきだとわかる

#!/usr/bin/env bash

set -euxo pipefail

./travis/install-local-dependencies.sh
if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then
    ./travis/get-windows-vcpkg-cache.sh
    ./travis/get-windows-d3d9sdk.sh
fi

ちなみに$TRAVIS_OS_NAME.travis.ymlで定義されている変数なのでファイルをそのまま実行しても機能しない。

./travis/install-local-dependencies.sh

上から一行一行処理していけばよい。
やっていることは3dゲームエンジンサウンドエンジンなどのダウンロード、解凍、しかるべき場所への配置である。
Unixコマンドなので調べなくても感覚で読めるかもしれない。

./travis/get-windows-vcpkg-cache.sh(vcpkg)
#!/usr/bin/env bash

set -euxo pipefail

mkdir -p "$VCPKG_ROOT"
cd "$VCPKG_ROOT"
curl --retry 5 --connect-timeout 30 --location --remote-header-name --output installed.7z $VCPKG_CACHE_7Z_URL
7z x installed.7z
mv irrlicht/include /usr/local/include/irrlicht
mv irrlicht/lib/* /usr/local/lib

モジュールのダウンロード。
数行の処理だが変数が噛んでいるため、そのままは実行できない。
適当な場所(Cドライブ直下とか)にvcpkgディレクトリを作成して、zipファイルを解凍すればよい。
その後mvコマンドに従ってフォルダを移動させる。
移動させなくても2回目のビルドができたが、それが以前何かしらの操作をしていたからなのかは不明。

./travis/get-windows-d3d9sdk(dirextX9 SDK)
#!/usr/bin/env bash

set -euxo pipefail

git clone --depth=1 https://github.com/kevinlul/DXSDK201006.git "$DXSDK_DIR"

"$DXSDK_DIR" はCドライブ直下がおすすめ。(元がそうであるため。)

3行目

とりあえずソースコードを参考に次のコマンドを打ち込む

$ ./premake5 vs2019 --sound=sdl-mixer
#使用しているvsによってvs2017のように変更

そうすると/adsbuildフォルダが追加される。
そのままソースコードの手順に従っても良いが、私はygo.slnVisual Studio 2019で開いてビルドを行った。

ビルドを行うとエラーを吐きまくって、まず成功はしない。
そこで主要なエラーに対する処置を記載しておく。

  • includeエラー

各プロジェクトは名前が一致するフォルダ内に配置されたpremake5.lua(数字は異なり得る)に従って構成されている。
例えば、次のコードはirrlicht/premake5.luaであるが$(DXSDK_DIR)という変数が使われているのがわかる。

project "Irrlicht"
	kind "StaticLib"
	includedirs "include"
	links "imm32"
	dofile("defines.lua")
	exceptionhandling "Off"
	rtti "Off"
	files { "**.cpp", "**.c", "**.cxx", "**.hpp", "**.h" }

	filter "options:no-direct3d"
		defines "NO_IRR_COMPILE_WITH_DIRECT3D_9_"

	filter "options:not no-direct3d"
		defines "IRR_COMPILE_WITH_DX9_DEV_PACK"
		includedirs "$(DXSDK_DIR)Include"
		libdirs "$(DXSDK_DIR)Lib/x86"

これを先ほどダウンロードしたdirectX9 SDKのパスを直接書き込んでやればよい。
私はそれでも解決しなかったため、Include内全部をirrlicht/includeにコピペした。

2回目もここで詰まったので、最初からIncludeの中身をirrlicht/includeにコピペするのが良いかもしれない。


以下のエラーはedoprohttps://github.com/edo9300/ygopro-coreの公開しているCoreを使用することで回避可能。

  • back_inserter' 'std' のメンバーではありません。

VC++10の仕様変更の影響。
相当古いソースを使っているらしい。

該当ファイル(ocgcore/operations.cpp)のインクルードに#include < iterator >を追加する。
流石にソースからビルドするような人にインクルードの説明は要らないだろう。

  • 'uint32_t' から 'int' への変換には縮小変換が必要です

MicroSoftのドキュメントによるとキャストすれば直るらしいが、直らなかったのでそのままexeファイルを実行したら動いたのでとりあえず無視することにした。
いつかエラー吐くのが楽しみですね。


と、全てのコンパイルエラーを抜ければ起動できるようになるので、予めインストーラー等で導入したEDOproのカード画像やフォントを使えばADSが動くわけである。
(そもそもADSをインストールできない人はダメ元で./travis/quickrun.shを試してみるとか?)

まとめ

手順の流れを1つのシェルスクリプトにしてみたので、Windows10環境ならコピペでも動くかも?

#githubからクローンしてきた後、そのディレクトリ(eg. c/ads)で実行する

# install core engine
git clone https://github.com/edo9300/ygopro-core ocgcore

# install premake5.exe
./travis/install-premake5.sh windows

# install irrklang64
curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name http://www.ambiera.at/downloads/irrKlang-64bit-1.6.0.zip
echo Extracting irrKlang64...
unzip -uo irrKlang-64bit-1.6.0.zip > /dev/null
rm -rf irrKlang
mv irrKlang-64bit-1.6.0 irrKlang
rm irrKlang-64bit-1.6.0.zip


# install freetype
curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name http://downloads.sourceforge.net/freetype/freetype-2.6.5.tar.bz2
echo Extracting FreeType...
tar xf freetype-2.6.5.tar.bz2 > /dev/null
mv freetype-2.6.5/builds freetype
mv freetype-2.6.5/include freetype
mv freetype-2.6.5/src freetype
rm -rf freetype-2.6.5
rm freetype-2.6.5.tar.bz2


# install irrklang32
# We wrap irrKlang32's extract because its zip has a hidden macOS directory that we don't want
curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://www.ambiera.at/downloads/irrKlang-32bit-1.6.0.zip
echo Extracting irrKlang32...
unzip -uo irrKlang-32bit-1.6.0.zip -d irrKlang-tmp > /dev/null
# Merge 32-bit binaries into folder
mv irrKlang-tmp/irrKlang-1.6.0/bin/win32-gcc irrKlang/bin/win32-gcc
mv irrKlang-tmp/irrKlang-1.6.0/bin/win32-visualStudio irrKlang/bin/win32-visualStudio
mv irrKlang-tmp/irrKlang-1.6.0/lib/Win32-gcc irrKlang/lib/Win32-gcc
mv irrKlang-tmp/irrKlang-1.6.0/lib/Win32-visualStudio irrKlang/lib/Win32-visualStudio
rm -rf irrKlang-tmp
rm irrKlang-32bit-1.6.0.zip


# install irrlicht
curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/edo9300/irrlicht1-8-4/archive/master.zip
echo Extracting irrlicht... this may take some time.
unzip -uo irrlicht1-8-4-master.zip > /dev/null
mv irrlicht1-8-4-master/include irrlicht/include
# Technically, only code files need to be moved, and code files in lzma and aesGladman, but this is easier
mv irrlicht1-8-4-master/source/Irrlicht irrlicht/src
rm -rf irrlicht1-8-4-master
rm irrlicht1-8-4-master.zip
# We will build against vcpkg-provided versions of these libs
rm -rf irrlicht/src/bzip2 irrlicht/src/jpeglib irrlicht/src/libpng irrlicht/src/zlib irrlicht/src/MacOSX

# ※install vcpkg-cache and directX9 sdk here if you need※

# irrlicht/premake5.luaの"$(DXSDK_SDK)"を書き換えるコード

# build for vs2019
./premake5 vs2019 --sound=sdl-mixer 

成功した後、わずかに書き換えたため不備があれば連絡求む

終わりに

私はもう疲れたので休みますが、また時間ができたら再度同じ手順を実行して書き漏れを補充したいと思います。

とはいえ、これでADSをc++で拡張できるわけですからPythonと組み合わせてAI開発に励みたいと思います。

2回目のビルドで気が付いたが、もしかしてirrklang使ってない?