Windows上のDockerでUbuntu22を動かしてCatapultをビルドする

新しくLinux版を書きました。

https://qiita.com/ccHarvestasya/items/afc034b6b2d6787ab50b

## はじめに

catapult サーバーの中身にも興味が出てきたので、気軽にビルド＆実行できる環境を作ってみました。

## 環境

- Windows 11 Home
- Ryzen 5 3600
- メモリ 16GB

## Ubuntu の準備

### Windows 版 Docker のインストール

まずは Windows 版 Docker をインストールします。
インストーラーに沿っていくだけなので、詰まるところはないと思います。

https://docs.docker.com/desktop/install/windows-install/

インストールが終わったら Docker を起動しておいて下さい。

### Docker 上に Ubuntu を構築

Docker 用のフォルダを作成します。
今回は私は H ドライブ直下に`docker_ubuntu`フォルダを作成しました。
そして、作成したフォルダの中に`docker-compose.yml`を作成します。

```yaml:docker-compose.yml
version: "3.8"

services:
  ubuntu:
    image: ubuntu:22.04
    container_name: ubuntu01
    tty: true
    volumes:
      - ./opt:/opt
```

コマンドプロンプトでこのフォルダまで移動して、ubuntu コンテナを起動します。(フォルダのアドレス欄に`cmd`って打つと楽)

```bash
docker compose up -d
```

停止する場合は下記コマンドです。

```bash
docker compose stop
```

初回はイメージのダウンロードがあるので少し時間かかります。
起動したら、コンテナ内に入ります。ユーザ指定してないので root で入れます。ちなみに root じゃない場合は`-u 0`オプションを追加すれば root で入れます。

```bash
docker exec -it ubuntu01 bash
```

コンテナに入れたら、パッケージの更新をしておきましょう。あと、vi 入ってないので vim とか好きなテキストエディタもインストールしておいて下さい。

```bash
apt update
apt -y upgrade
apt -y install vim
```

## catapult のビルド

ここに書いてあることのほぼコピーですが…

https://github.com/symbol/symbol/blob/dev/client/catapult/docs/BUILD-manual.md

### 必要なパッケージのインストール

ここからは Ubuntu01 コンテナに入って作業します。

```bash
apt -y install git gcc g++ cmake curl libssl-dev libgtest-dev ninja-build pkg-config python3-pip
```

```bash
pip install pyyaml
```

### catapult-client クローン

```bash
cd /opt
git clone https://github.com/symbol/symbol.git
cd symbol/client/catapult
```

### 依存関係をダウンロード＆ビルド

3 時間程かかります。メモリ 5GB 程使用します。
ビルド中にエラー出たら解消して、再実行してください。再実行時は`--download`オプション不要です。

```bash
PYTHONPATH="../../jenkins/catapult/" \
	python3 "../../jenkins/catapult/installDepsLocal.py" \
	--target "./deps" \
	--versions "../../jenkins/catapult/versions.properties" \
	--build \
	--download
```

:::note warn
たまに止まることがあります。CPU使用率が 0% のまま変動しないようであれば、 Docker を再起動してください。
:::

### catapult をビルド

テスト無効にしてビルドする。
ちなみに、-DENABLE_TESTS=OFF を削除すればテストしてビルドします。

```bash
mkdir -p build && cd build
```

```bash
BOOST_ROOT="$(realpath ../deps/boost)" cmake .. \
	-DENABLE_TESTS=OFF \
	-DCMAKE_BUILD_TYPE=RelWithDebInfo \
	-DCMAKE_PREFIX_PATH="$(realpath ../deps/facebook);$(realpath ../deps/google);$(realpath ../deps/mongodb);$(realpath ../deps/zeromq);$(realpath ../deps/openssl)" \
	-GNinja
```

```bash
ninja publish
```

```bash
ninja
```

2 時間くらい？かかる。CPU 結構使う。
エラーが出てやり直す場合は、キャッシュが残ってるので `build` ディレクトリ内を全て削除する。

```bash
rm -rf *
```

#### RocksDB でエラー

```
--- locating rocksdb dependencies ---
rocksdb   ver:
CMake Error at CMakeLists.txt:80 (get_property):
  get_property could not find TARGET RocksDB::rocksdb-shared.  Perhaps it has
  not yet been created.


rocksdb   inc:
CMake Error at CMakeLists.txt:26 (get_property):
  get_property could not find TARGET RocksDB::rocksdb-shared.  Perhaps it has
  not yet been created.
Call Stack (most recent call first):
  CMakeLists.txt:82 (get_library_path)
```

リアルマシンに入れた Ubuntu では出なかったエラー。
なぜか`../CMakeList.txt`の 71 行目の`find_package(RocksDB 7.10.2 EXACT REQUIRED)`がコメントになってたので解除。

```cmake:../CMakeList.txt
### setup rocksdb
message("--- locating rocksdb dependencies ---")
find_package(RocksDB 7.10.2 EXACT REQUIRED) #コメント解除

if(WIN32)
	set(RocksDB_LIBRARY RocksDB::rocksdb)
else()
	set(RocksDB_LIBRARY RocksDB::rocksdb-shared)
endif()
```

### catapult 動作確認

#### パスを通す

```
vi ~/.bashrc
```

以下を末行に追加。

```bash:~/.bashrc
export LD_LIBRARY_PATH=/opt/symbol/client/catapult/deps/facebook/lib:/opt/symbol/client/catapult/deps/boost/lib:/opt/symbol/client/catapult/build/lib
```

.bashrcを再読込。

```bash
source ~/.bashrc
```

#### 実行

下記コマンドでツールが動くことを確認。

```bash
./bin/catapult.tools.address --help
```

## 参考にした記事

https://qiita.com/monakaJP/items/c8846231a3ecc621e777

https://qiita.com/ishidad2/items/9592363992e0f96840fc