ソースからビルドしたい
Catapultのソースコードを少しいじってみたのですが,いざテストの段階になると手動でビルドする必要があります.そこでビルドに挑戦したのですが中々苦労しましたので記録として残したいと思います.
記憶があるうちに記事化したかったのでビルドの内容だけ書きます.このため操作方法については取り扱いません.また記事も書き殴りなので多少ミスがあるかもしれません.
ビルド手順
ビルド手順はmanual,conan,dockerの3通りあります.今回私が試したのはmanualとconanですのでこちらの2つを書き残します
マニュアルビルド(今回苦戦したビルド)
こちらの手順に従っていきます(頻繁にレポジトリが変更されるのでリンクは切れる可能性があります,不明な場合はdiscord等で連絡ください)
ビルドに関して本記事よりも詳しい記載がありますので併せてこちらの記事を読むことをおすすめします(本記事は主にハマった点の周知を目的としています).
ラズベリーパイ4でビルドする場合はまた別のエラーがでるようなので,こちらの記事を参照ください.
ビルドに必要なツールをインストールします
apt update
apt -y upgrade
apt -y install git gcc g++ cmake curl libssl-dev ninja-build pkg-config python3-pip
レポジトリをクローンします
git clone https://github.com/symbol/symbol.git
cd symbol/client/catapult
依存するファイルをダウンロード,ビルドします
結構時間がかかります
PYTHONPATH="../../jenkins/catapult/" python3 "../../jenkins/catapult/installDepsLocal.py" \
--target "./_deps" \
--versions "../../jenkins/catapult/versions.properties" \
--download \
--build
カタパルトをビルドする
これも結構時間がかかります.
mkdir -p _build && cd _build
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
ninja publish
ninja
ビルド成功後,このコマンドが成功すればOKです
./bin/catapult.tools.address --help
Conanを利用したビルド(推奨)
マニュアルビルドの記事を読むとこちらの方法が強く推奨されています.私もこちらの方法では難なく成功したので差し支えなければこちらの方法を使ったほうが良いかもしれません.
必要なツールをインストールします
sudo apt install build-essential git cmake ninja-build
今回活躍するConanをインストールします
sudo pip install conan
Conanの設定をします
conan profile update settings.compiler.libcxx=libstdc++11 default
依存関係をインストールします
conan remote add nemtech https://catapult.jfrog.io/artifactory/api/conan/symbol-conan
git clone https://github.com/symbol/symbol.git
cd symbol/client/catapult
mkdir _build && cd _build
CONAN_REVISIONS_ENABLED=1 conan install .. --build missing
ビルドします(時間がかかります)
cmake -DUSE_CONAN=ON -DCMAKE_BUILD_TYPE=Release -G Ninja ..
ninja publish
ninja -j4
パスを設定します
export LD_LIBRARY_PATH=$PWD/deps
こちらが成功すればOKです
bin/catapult.tools.address --help
失敗したことについて
1 低スペックvpsでビルド失敗
Symbol-bootstrapはそこまでスペックがなくても動作するのでWebarenaの2コアメモリ2GBで試してみたところ,マニュアルビルドの依存関係のインストールの部分で処理落ちし,失敗しました.そこでスペックの高い環境に変更することにしました(ubuntu 20.04)
2 Ubuntu21.10で失敗
1で失敗したので自宅のUbuntu21.10を使用することにしました.
マニュアルビルドの依存関係のインストールで失敗しました
[ 15%] Building CXX object src/bsoncxx/test/CMakeFiles/test_bson.dir/bson_value.cpp.o
In file included from /usr/include/signal.h:328,
from /home/ubuntu/symbol/client/catapult/_deps/source/mongo-cxx-driver/src/third_party/catch/include/catch.hpp:8034,
from /home/ubuntu/symbol/client/catapult/_deps/source/mongo-cxx-driver/src/third_party/catch/main.cpp:16:
/home/ubuntu/symbol/client/catapult/_deps/source/mongo-cxx-driver/src/third_party/catch/include/catch.hpp:10822:58: error: call to non-‘constexpr’ function ‘long int sysconf(int)’
10822 | static constexpr std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ;
| ^~~~~~~~~~~
In file included from /usr/include/x86_64-linux-gnu/bits/sigstksz.h:24,
from /usr/include/signal.h:328,
from /home/ubuntu/symbol/client/catapult/_deps/source/mongo-cxx-driver/src/third_party/catch/include/catch.hpp:8034,
from /home/ubuntu/symbol/client/catapult/_deps/source/mongo-cxx-driver/src/third_party/catch/main.cpp:16:
/usr/include/unistd.h:640:17: note: ‘long int sysconf(int)’ declared here
640 | extern long int sysconf (int __name) __THROW;
| ^~~~~~~
In file included from /home/ubuntu/symbol/client/catapult/_deps/source/mongo-cxx-driver/src/third_party/catch/main.cpp:16:
/home/ubuntu/symbol/client/catapult/_deps/source/mongo-cxx-driver/src/third_party/catch/include/catch.hpp:10881:45: error: size of array ‘altStackMem’ is not an integral constant-expression
10881 | char FatalConditionHandler::altStackMem[sigStackSize] = {};
| ^~~~~~~~~~~~
[ 15%] Building CXX object src/mongocxx/CMakeFiles/mongocxx_shared.dir/client.cpp.o
[ 16%] Building CXX object src/bsoncxx/test/CMakeFiles/test_bson.dir/json.cpp.o
[ 16%] Building CXX object src/bsoncxx/test/CMakeFiles/test_bson.dir/view_or_value.cpp.o
[ 16%] Building CXX object src/mongocxx/CMakeFiles/mongocxx_shared.dir/client_encryption.cpp.o
make[2]: *** [src/bsoncxx/test/CMakeFiles/test_bson.dir/build.make:82: src/bsoncxx/test/CMakeFiles/test_bson.dir/__/__/third_party/catch/main.cpp.o] Error 1
Discordでこの件について報告したところ,mongo-cxx-driverのバグだそうです.このため現状21.10ではビルドが難しいと思います.
今後修正されると思います.
3 Ubuntu20.04で失敗
1でスペックが足りないのが原因としてわかっていたのでwebarenaで8コア32GBのVPSをレンタルし,インストールしました.
すると今まで失敗していた依存関係のインストールまでは成功することができました.しかし,catapalutのビルドで次のエラーが出て失敗しました
./tests/test/nodeps/Stress.h:26:10: fatal error: gtest/gtest.h: No such file or directory
26 | #include <gtest/gtest.h>
| ^~~~~~~
compilation terminated.
[232/2147] Building CXX object tests/c...l.server.dir/MemoryCountersTests.cpp.o
FAILED: tests/catapult/local/server/CMakeFiles/tests.catapult.local.server.dir/M emoryCountersTests.cpp.o
/usr/bin/c++ -DBOOST_ALL_DYN_LINK -DBOOST_ALL_NO_LIB -DBOOST_ASIO_USE_TS_EXECUT OR_AS_DEFAULT -DBOOST_ATOMIC_DYN_LINK -DBOOST_CHRONO_DYN_LINK -DBOOST_DATETIME DYN_LINK -DBOOST_FILESYSTEM_DYN_LINK -DBOOST_LOG_DYN_LINK -DBOOST_LOG_SETUPDYN LINK -DBOOST_PROGRAM_OPTIONS_DYN_LINK -DBOOST_REGEX_DYN_LINK -DBOOST_THREADDYN LINK -DOPENSSL_API_COMPAT=0x10100000L -D_STDC_WANT_LIBEXT1=1 -DSTDC_WANT_LIB _EXT1=1 -I../ -I../src -isystem ../_deps/boost/include -isystem ../_deps/faceb ook/include -Wall -Wextra -Wpedantic -Wshadow -Wconversion -Wformat-security -We rror -Wstrict-aliasing=1 -fvisibility=hidden -Wno-dangling-el se -O2 -g -DNDEBUG -Wno-maybe-uninitialized -g1 -fno-omit-frame-pointer -std=g nu++17 -MD -MT tests/catapult/local/server/CMakeFiles/tests.catapult.local.serve
r.dir/MemoryCountersTests.cpp.o -MF tests/catapult/local/server/CMakeFiles/tests .catapult.local.server.dir/MemoryCountersTests.cpp.o.d -o tests/catapult/local/s erver/CMakeFiles/tests.catapult.local.server.dir/MemoryCountersTests.cpp.o -c .. /tests/catapult/local/server/MemoryCountersTests.cpp
In file included from ../tests/TestHarness.h:26,
from ../tests/catapult/local/server/MemoryCountersTests.cpp:24:
../tests/test/nodeps/Stress.h:26:10: fatal error: gtest/gtest.h: No such file or directory
26 | #include <gtest/gtest.h>
| ^~~~~~~
compilation terminated.
[240/2147] Building CXX object src/cat...Files/catapult.recovery.dir/main.cpp.o
ninja: build stopped: subcommand failed.
gtest関係でエラーが発生しました.
Discordで報告したところコアデブではうまくいっているとの返信があったので,コアデブと環境を揃えたりバージョンを合わせたりしてみたのですがやはり失敗しました
新しくレンタルしたVPNにマニュアル通りのコマンドのみを打ち込んで失敗しているので環境の問題だと思います
成功した方法
1 Conanを利用する
ConanをUbuntu20.04で使用してみたところ、特に問題なくインストールできました.マニュアルにもConanを推奨すると書かれていたので特に差し支えなければConanを利用するのが良いと思います
2 マニュアルビルドのテストを無効にする
コアデブから提案を頂き,カタパルトのビルドの段階でテストを無効にすることで解決しました
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
テストがない分,Conanよりもビルドが高速で行えました.デメリットがなければ良い方法かもしれません.
その他
docker版も時間があればやりたいです
謝辞
Wayonさん,jaguarさんにはDiscordで大変お世話になりました.また,cryptoBelieverさんには今回もhelpdeskで助けていただきました.
本当にありがとうございました.
動作環境
webarena indigoのVPS
Ubuntu 20.04
メモリ32GB
コア数 8
gcc 10.3.0
G++ 10.3.0
Conan 1.47.0
cmake 3.16.3