ラズベリーパイ４にSymbolノードをマニュアルビルドで構築する１

前置き
===

前回このような記事を投稿しました。前回はDockerImageのビルドにチャンレンジしましたがあえなく失敗。

https://qiita.com/ishidad2/items/eddda91c9c0f275c6d0d

今回は、下記を参考にマニュアルビルドでノード構築に挑戦していきたいと思います。

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


機器・OS
===
* [ラズベリーパイ４](https://amzn.to/36Z157Q)
* Ubuntu 20.04.4 LTS
Linux ubuntu 5.4.0-1058-raspi #65-Ubuntu SMP PREEMPT Fri Mar 25 12:29:46 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
* 32GBSDカード


ビルド環境
===

* git.
* python 3.7+.
* openssl 1.1.1n+.
* About 15 GB of free disk space.

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


事前準備
===

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

* Step 3: Build catapultでラズパイのメモリが足りなくなるので事前に[Swap領域を拡張](https://qiita.com/zrock/items/71e3874cb83ed12ec405)しておきます。
 
2022/04/07 追記
Google Testがインストールされていないと途中エラーで先に進めなくなるので、[ここ](https://qiita.com/shohirose/items/30e39949d8bf990b0462#google-test%E3%82%92%E6%89%8B%E5%8B%95%E3%81%A7%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)を参考にGoogle Testをインストールしておいてください。

マニュアルビルド手順
===

ラズベリーパイ上でSymbolノードのマニュアルビルドを実施する手順を示します。
今回すべての作業はrootで行っています。以下のコマンドよりrootユーザーになってください。

```bash
su -
```

もしrootになれない時はパスワードが設定されてない可能性があるので下記のコマンドでrootのパスワードを設定してから作業を行ってください。

```bash
sudo passwd root
```

# ソフトウェアインストール

必要なソフトウェアをインストールします。もし途中足りないものがあれば適時インストールしてください。

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

# GitHubからソースコードダウンロード

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

# 依存関係をダウンロード、ビルド、インストール

（それなりに時間かかります。~~約１時間くらいかな~~ １時間以上かかります）

2022/04/07追記

make -j 8でエラーが発生するのでソースを修正します。
修正するファイルはsymbol/jenkins/catapult/installDepsLocal.pyです。(10行目)

```diff
...

from process import ProcessManager

SOURCE_DIR_NAME = 'source'
- NUM_BUILD_CORES = 8
+ NUM_BUILD_CORES = 1

...
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/7928143f-05cc-9868-0981-a2f3b66f90d7.png)

~~installDepsLocal.pyを修正したらコマンドを実行します。~~(symbol/client/catapult以下で実行)
NUM_BUILD_CORES = 1に修正してから実行するとめちゃくちゃ時間がかかるので、最初はNUM_BUILD_CORES = 8で実行してエラーが出たら（出るので）NUM_BUILD_CORES = 1に修正して--dowonloadオプションを外したほうがいいです。

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

※ちなみに、上記のコマンドを実行して途中エラーで止まってしまった場合、再開する場合は--downloadオプションを外すか、_depsフォルダを削除してから再開してください。各種ツールのソースコードがダウンロードされた状態で--downloadオプションをつけて実行するとエラーで先に進みません。


すべての依存関係のダウンロード・ビルド・インストールが完了すると作業フォルダ_deps以下に各ライブラリが生成されています。（_buildフォルダは後ほど作成します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/d0f79cb9-faa3-5576-8c1f-eda188ce6a82.png)

_deps以下は各ツールフォルダが出来上がっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/3c0c24a5-c756-69c8-dfa4-67305ba7d04e.png)

# PATHの設定

~/.bashrcに下記のパスを設定します。

```.bashrc
export CAT_DEPS_DIR=/root/symbol/client/catapult/_deps
export LD_LIBRARY_PATH=$CAT_DEPS_DIR/boost/lib:$CAT_DEPS_DIR/facebook/lib:$CAT_DEPS_DIR/google/lib:$CAT_DEPS_DIR/mongodb/lib:$CAT_DEPS_DIR/zeromq/lib
```

※「root/symbol/client/catapult」の部分はご自分の環境に合わせてください。

.bashrcの反映

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

# catapultをビルド

下記のコマンドを順に実行します。

```bash
mkdir -p _build && cd _build
```

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

2022/04/09 補足
マニュアルビルドでテストを無効にする方法もあるようです。
* [マニュアルビルドのテストを無効にする](
https://qiita.com/monakaJP/items/c8846231a3ecc621e777#2-%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%93%E3%83%AB%E3%83%89%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)

```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)" \
	-GNinja
```


```bash
ninja publish
```

ninjaコマンドを実行するとビルドが始まります。とても時間がかかります（手元のラズパイで約４時間半）ので余裕のあると時に行ってください。

```bash
ninja
```


**2022/0408 追記** 
ninjaコマンドでgoogle testのライブラリー参照エラーが発生する可能性があります。
もしエラーが発生した場合は下記を参考にgoogle testをmake installしてください。
リンク先はzipをダウンロードしていますが、tarで解凍する場合はtar.gzをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/3f367bfa-d844-6d82-6fed-11ebb07dc276.png)


https://qiita.com/shohirose/items/30e39949d8bf990b0462#google-test%E3%82%92%E6%89%8B%E5%8B%95%E3%81%A7%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95


ビルドが成功すると、_buildフォルダ以下にファイルが生成されます。これがSymbolノードの本体のソースコード群になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/d119210d-99cc-6dd2-7e0d-475a4b19aba4.png)


以下のコマンドを実行してツールが動くことを確認してください。もしツールが動かない場合はライブラリーのPATHの設定を見直してください。

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

## パスの追加

_build/libのパスを追加しておきます。（ここのパスを追加しておかないと次のカタパルトサーバー起動時エラーが発生します）
/root/symbol/client/catapult/_build/lib

```.bashrc
export CAT_DEPS_DIR=/root/symbol/client/catapult/_deps
export LD_LIBRARY_PATH=$CAT_DEPS_DIR/boost/lib:$CAT_DEPS_DIR/facebook/lib:$CAT_DEPS_DIR/google/lib:$CAT_DEPS_DIR/mongodb/lib:$CAT_DEPS_DIR/zeromq/lib:/root/symbol/client/catapult/_build/lib
```

反映

```
source ~/.bashrc
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/8e81deaa-ebf5-1de4-cf4d-33cccf62b7c6.png)

この様にヘルプが表示されればOKです！！

少し長くなりましたので、ノード実行(火入れ)は次の記事で説明します。

謝辞
===
ここまでの手順でビルドエラー等の相談にのっていただいた[@crackthec0de01](https://twitter.com/crackthec0de01)様、大変ありがとうございました。この場を借りてお礼申し上げます。