Linux の VSCode 上で Symbol サーバーをビルドする

## 環境

Ubuntu 22.04 LTS

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

ビルドに必要なコンパイラ等をインストールします。

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

```bash
pip install pyyaml
```

### CMake インストール

Ubuntu 22.04 の CMake のバージョンが古いので、新しいバージョンをインストールします。

署名鍵のコピー

```bash
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
```

リポジトリの追加

```bash
echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null
```

パッケージ更新＆インストール

```bash
sudo apt update
sudo apt install cmake
```

## ソースをクローン

現在メインネットで動いているバージョンを取得します。  
ホームディレクトリにクローンしました。

```bash
git clone https://github.com/symbol/symbol.git -b client/catapult/v1.0.3.7
```

## 依存パッケージのビルド

Symbol サーバーをビルドするのに必要な依存パッケージをビルドするため、`symbol/client/catapult`に入ります。

```bash
cd symbol/client/catapult
```

下記コマンドでビルドします。  
ビルド中にエラー出たら解消して、再実行してください。再実行時は`--download`オプション不要です。

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

## VSCode でビルド

## 拡張機能

下記の拡張機能を追加します。(たぶん、これ 1 つだけで良いはず…)

- C/C++ Extension Pack

## VSCode 起動

VSCode を起動し、`symbol/client/catapult`を開きます。  
`.vscode`ディレクトリを作成し、下記の`settings.json`と`tasks.json`を作成します。`settings.json`でパスを通しているので、各自環境に合わせて変更してください。

```.vscode/settings.json
{
  "cmake.environment": {
    "BOOST_ROOT": "~/symbol/client/catapult/deps/boost",
  },
  "cmake.configureArgs": [
    "-DENABLE_TESTS=OFF",
    "-DCMAKE_PREFIX_PATH='~/symbol/client/catapult/deps/facebook;~/symbol/client/catapult/deps/google;~/symbol/client/catapult/deps/mongodb;~/symbol/client/catapult/deps/zeromq;~/symbol/client/catapult/deps/openssl;'",
    "-GNinja"
  ],
  "cmake.deleteBuildDirOnCleanConfigure": false,
  "cmake.skipConfigureIfCachePresent": true,
}
```

```.vscode/tasks.json
{
 "version": "2.0.0",
 "tasks": [
  {
   "hide": true,
   "type": "cmake",
   "label": "CMake: 構成",
   "command": "configure",
   "problemMatcher": [],
   "detail": "CMake テンプレート 構成 タスク"
  },
  {
   "type": "shell",
   "label": "Symbol 構成",
   "command": "ninja publish",
   "options": {
    "cwd": "${workspaceFolder}/build"
   },
   "dependsOn": [
    "CMake: 構成"
   ],
   "problemMatcher": [],
   "detail": "ビルド前の `ninja publish` コマンド"
  }
 ]
}
```

## 構成

メニュー 「ターミナル->タスクの実行」 から 「Symbol 構成」を選択します。  
依存パッケージのバージョンチェック等が走ります。上手くパスが通せてなかったりするとエラーが出ますので、頑張って解消してください。エラーが出てやり直す場合は、キャッシュが残ってるので `build` ディレクトリ内を全て削除すること。

## ビルド

VSCode のウィンドウ左下辺りに「ビルド」ボタンがあるので、それを押す。または、「ターミナル->ビルド タスクの実行...」から「CMake:ビルド」を選択でも可。
これまた時間が掛かります。

## 動作確認

### ライブラリ移動

ライブラリが`bin`ディレクトリ内にあるので、`lib`ディレクトリにコピーします。

```bash
cd build
cp bin/*.so lib
```

### パスを通す

```bash
vi ~/.bashrc
```

以下を末行に追加。

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

`.bashrc`を再読込。

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

### 実行

下記コマンドを実行してヘルプが表示されれば、ビルド成功です。

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