OpenSiv3DをArchLinuxでビルドする

現在いくつかLinux版OpenSiv3Dをビルドし利用する記事がありますが,
どれも指示通りにはうまく行かなかったので試行錯誤と成功の過程を残しておくことにします.

## ライブラリのビルド
いくつかある記事を試した中で最も後の段階まで成功した[こちら](https://qiita.com/wynd2608/items/630560a420c9773b4d5b)を参考にライブラリをビルドしました.

/optなど場所を決めて次を実行してください.

```sh
# GitレポジトリをClone
git clone https://github.com/Siv3D/OpenSiv3D.git
cd OpenSiv3D
# Linuxブランチを使用します
git checkout Linux
cd Linux

mkdir build
cd build

cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
```

成功していれば
> [100%] Linking CXX static library libSiv3D.a
> [100%] Built target Siv3D

と表示されています.
念のためlibSiv3D.aが存在することを確かめます.

## サンプルプログラムのビルド
公式のサンプルソースを適当なディレクトリに保存します.

```cpp:app.cpp
#include <iostream>
#include <Siv3D.hpp>

void Main()
{
	auto ip = Network::GetPrivateIPv4();
	std::cout << ip.value().toStr() << std::endl;

	Scene::SetBackground(ColorF(0.8, 0.9, 1.0));

	const Font font(60);

	const Texture emoji(Emoji(U"🐈"));

	Vec2 emojiPos(650, 450);

	while (System::Update())
	{   
		font(U"Hello, Siv3D!🐣").drawAt(Scene::Center(), Palette::Black);

		font(Cursor::Pos()).draw(20, 500, ColorF(0.6));

		emoji.resized(80).drawAt(emojiPos);

		Circle(Cursor::Pos(), 40).draw(ColorF(1, 0, 0, 0.5));

		if (KeyA.down())
		{
			Print << U"Hello!";
		}

		if (SimpleGUI::Button(U"Move the cat", Vec2(600, 20)))
		{
			emojiPos = RandomVec2(Scene::Rect());
		}
	}
}

```

そして,ビルドするためのコマンドはとても長いのでMakefileを置きます.
<details><summary>Makefile,長いので折りたたみ</summary><div>

```makefile:Makefile
TARGET := main
HDRS := $(wildcard $(SRCDIR)/*.hpp)
LIBS := /opt/OpenSiv3D/Linux/libSiv3D.a

CC = clang++
CFLAGS = \
	-std=c++1z \
	-Wall \
	-Wextra \
	-Wpedantic \
	-O2 \
	-I/opt/OpenSiv3D_dev/Siv3D/include \
	-I/opt/OpenSiv3D_dev/Siv3D/include/ThirdParty/ \
	\
	-lX11 -lXi -lXinerama -lXcursor -lXrandr \
	-lGL \
	-lGLEW \
	-lopencv_core -lopencv_imgproc -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_java410 -lopencv_photo -lopencv_objdetect \
	-lpng -lturbojpeg -lgif -lwebp \
	-lfreetype -lharfbuzz \
	-lopenal \
	-logg \
	-lvorbis -lvorbisenc -lvorbisfile \
	-lboost_filesystem -lboost_system \
	-lglib-2.0 \
	-lgobject-2.0 \
	-lgio-2.0 \
	-ludev \
	-ldl \
	-lpthread

.PHONY: all
all: $(TARGET)

$(TARGET): $(OBJS) $(LIBS)
	$(CC) $(CFLAGS) -o $@ $^

clean:
	rm -rf $(OUTDIR)
```

</div></details>

試しにmakeするとUndefined referenceで落ちます.

これはAngelScriptが欠けているのが原因なので,次で直していきます.

## AngelScriptのインストール
AngelScriptはOpenSiv3Dのスクリプト機能を支えているようです.

[ここ](https://www.angelcode.com/angelscript/downloads.html)にソースが公開されており,
これをダウンロードしてビルドします.
例によって/optにDLをします.

```sh
cd /opt
mkdir angelscript
cd angelscript

wget https://www.angelcode.com/angelscript/sdk/files/angelscript_2.32.0.zip
unzip -d 2.32.0 angelscript_2.32.0.zip

cd sdk/angelscript
```

#### 注意
最新バージョンは2019/04/15現在2.33.0ですが,AngelScriptはinit時に同一バージョン以外を認めません.
そのため,OpenSiv3Dで使用されているバージョンを必ず使用してください.

現状のAngelScriptバージョンは[こちら](https://github.com/Siv3D/OpenSiv3D/blob/master/Siv3D/include/ThirdParty/angelscript/angelscript.h)で確認が可能です.
次のようにバージョンが定義されているはずです.

```cpp
#define ANGELSCRIPT_VERSION_STRING "2.32.0"
```

ビルドはめんどくさいのでMakefileを書きました.

```makefile:Makefile
TARGET := lib/libangelscript.a
SRCDIR := source
OUTDIR := bin
INCDIR := include
TARGET := $(TARGET)
HDRS := $(wildcard $(INCDIR)/*.h)
OBJS := $(addprefix $(OUTDIR)/,$(patsubst %.cpp,%.o,$(wildcard $(SRCDIR)/*.cpp)))
DEPS := $(OBJS:%.o=%.d)
#$(warning $(OBJS))

CC = g++
CFLAGS = \
	-std=c++1z \
	-Wall \
	-Wextra \
	-Wpedantic \
	-O2 \
	-fPIC \
	-I $(INCDIR) \
	-I $(SRCDIR)

.PHONY: all clean
all: $(TARGET)

#-include $(DEPS)

$(TARGET): $(OBJS)
	ar -rcs $@ $^

$(OUTDIR)/%.o:%.cpp $(HDRS)
	@if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi
	rm -f $@
	$(CC) $(CFLAGS) -o $@ -c $<

clean:
	rm -rf $(OUTDIR)
	rm -rf $(TARGET)
```

これでmakeをするとlib/libangelscript.aが生成されます.

また,サンプルプログラム側のMakefileも次のように編集します.

```diff:Makefile
- LIBS := /opt/OpenSiv3D/Linux/libSiv3D.a
+ LIBS := /opt/OpenSiv3D/Linux/libSiv3D.a /opt/angelscript/2.32.0/sdk/angelscript/lib/libangelscript.a
```

これでサンプルプログラムをmakeするとビルドが通りました.

bin/mainを実行すると正常動作を確認できると思います.


## あとがき,諸注意

~~筆者の環境での2019/04/15現在の方法です.
モチベが続いていれば情報が更新されるかもしれませんがそうではないと思ってください.
最新のものに対応させたソースと公式のインストール方法の公開をしてくれることを願っています.[^1]~~
[^1]: OSSの精神からすれば私が作るという選択をするべきなのかもしれませんがそこまで奥深く複雑なプロジェクトは私には力不足なのです…

### 追記:2019/07/10
`371e403`にてビルドを行い,編集したところOpenCVが4に対応したことによりビルドが楽になりました.
現在の内容は新しいものですので古いものが気になる方は編集履歴からご覧ください.