Linux
archLinux
OpenSiv3D

OpenSiv3DをArchLinuxでビルドする

現在いくつかLinux版OpenSiv3Dをビルドし利用する記事がありますが,

どれも指示通りにはうまく行かなかったので試行錯誤と成功の過程を残しておくことにします.


ライブラリのビルド

いくつかある記事を試した中で最も後の段階まで成功したこちらを参考にライブラリをビルドしました.

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

# GitレポジトリをClone

git clone https://github.com/Siv3D/OpenSiv3D.git
cd OpenSiv3D
# Linuxブランチを使用します
git checkout Linux
cd Linux

mkdir build
cd build

# 現在パッケージ名はopencv4となりエラーが発生するので
sed -i -e 's/opencv//' ../CMakeLists.txt

cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4

成功していれば


[100%] Linking CXX static library libSiv3D.a

[100%] Built target Siv3D


と表示されています.

念のためlibSiv3D.aが存在することを確かめます.


サンプルプログラムのビルド

./make_release.shが存在せず簡単にはビルドさせてくれませんでした.

公式のサンプルソースを適当なディレクトリに保存します.


app.cpp

#include <Siv3D.hpp>


void Main()
{
Graphics::SetBackground(ColorF(0.8, 0.9, 1.0));

const Font font(50);

const Texture textureCat(Emoji(U"🐈"), TextureDesc::Mipped);

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

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

textureCat.resized(80).draw(540, 380);

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


そして,ビルドするためのコマンドはとても長いのでMakefileを置きます.

Makefile,長いので折りたたみ


Makefile

TARGET := main$(EXEEXT)

HDRS := $(wildcard $(SRCDIR)/*.hpp)
LIBS := /opt/OpenSiv3D/Linux/libSiv3D.a

CC = clang++
CFLAGS = \
-std=c++1z \
-Wall \
-Wextra \
-Wpedantic \
-O2 \
-I/opt/OpenSiv3D/Siv3D/include \
-I/opt/OpenSiv3D/Siv3D/include/ThirdParty/ \
-lboost_filesystem \
-lboost_system \
-lpthread \
-lGL \
-lGLEW \
-lglib-2.0 \
-lgobject-2.0 \
-lgio-2.0 \
-lpng \
-lturbojpeg \
-lX11 \
-lXi \
-lXrandr \
-lXinerama \
-lXcursor \
-ldl \
-lgif \
-lfreetype \
-lharfbuzz \
-lopenal \
-ludev \
-lopencv_core \
-lopencv_imgproc \
-lopencv_core \
-lopencv_highgui \
-lopencv_imgcodecs \
-lopencv_imgproc \
-lBox2D \
-lfontconfig

.PHONY: all
all: $(TARGET)

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

clean:
rm -rf $(OUTDIR)



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

これは


  • OpenCVのバージョンに3が期待されている

  • AngelScriptが欠けている

が原因なので,次で直していきます.


OpenCV3のインストール

OpenCVは3と4では仕様に多くの差があるため,諦めて古いバージョンを使用します.

yay -S opencv3-opt

でインストールできます

ビルドに必要なディスク容量がめっちゃでかい(5GB)ので

ディスクに余裕がない場合はAURのURLからポータブルHDDなどにCloneしてmakepkg -si

をします.

そして,Makefileにライブラリディレクトリを追加します.


Makefile

  -I/opt/OpenSiv3D/Siv3D/include \

-I/opt/OpenSiv3D/Siv3D/include/ThirdParty/ \
+ -L/opt/opencv3/lib/ \
-lboost_filesystem \
-lboost_system \

これでmakeをするとエラーがある程度減ります.


AngelScriptのインストール

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

ここにソースが公開されており,

これをダウンロードしてビルドします.

例によって/optにDLをします.

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バージョンはこちらで確認が可能です.

次のようにバージョンが定義されているはずです.

#define ANGELSCRIPT_VERSION_STRING "2.32.0"

ビルドはめんどくさいので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.soが生成されます.

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


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の精神からすれば私が作るという選択をするべきなのかもしれませんがそこまで奥深く複雑なプロジェクトは私には力不足なのです…