Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

building catapult-server from source

需要があるのかわかりませんが、catapult-serverのビルド手順です。

catapult-serverのビルドには、 パッケージマネージャのconanを利用する手順と利用しない手順があります。
今回はconanを利用しない手順について記述します。

手順については、本家の以下のドキュメントがあるのですが、
ドキュメントどおり実施してもうまくいかないので、本記事を残しておくことにしました。

手順については、以下を参照してください。(Jaguarさんに直してもらいました)
https://github.com/nemtech/catapult-server/blob/main/docs/BUILD-manual.md

なお、今回の手順は2020年12月8日時点でのものですので、ご注意ください。

所要時間は約150分です。

注意点

ドキュメント通りにやってもうまくビルドできない。以下注意点。

  • clangはくせもの。いれないようにしよう。
  • ビルド時には結構メモリを食う。メモリ1GBだと無理、16GBで試した。
  • ディスクも食う。8GBだと無理。32GBで試した。

* bashでは動かない。zshに変更したら動いた
* ドキュメントに書いてあるcmakeのCMAKE_PREFIX_PATHのデリミタが多分間違っている。:(コロン)ではなくて;(セミコロン)に変更したら動いた。
* あとboostのincludeディレクトリも-DBoost_INCLUDE_DIRで指定してあげる必要がある。
* googleのbenchmarkのライブラリがマニュアル通りだとデフォルト(-fPICなし)でコンパイルされる。そのため、catapult-serverのビルドのときのリンクに失敗してしまう。cmakeの引数に-DCMAKE_POSITION_INDEPENDENT_CODE=ONを追加する必要がある。
* 事前にpkg-configbuild-essentialのパッケージを入れておかないとビルドでこける。
* 最後にninjaを実行する必要がある。

2018年5月くらいに比べてビルドはずいぶん簡単になっている。

環境(Amazon EC2)

  • Ubuntu Server 20.04 LTS (HVM), SSD Volume Type
    • t2.xlarge
    • vCPU 4
    • メモリ 16GB
    • ストレージ(SSD) 32GB

手順(インスタンス作成後)

以下手順です。

Step0 準備

sudo apt update
sudo apt -y upgrade
sudo apt -y install gcc g++ cmake libssl-dev ninja-build zsh pkg-config

zsh

mkdir -p cat_deps_dir/boost
export CAT_DEPS_DIR=$HOME/cat_deps_dir
boost_output_dir=${CAT_DEPS_DIR}/boost

Step1 download all dependencies from source

function download_boost {
    local boost_ver=1_${1}_0
    local boost_ver_dotted=1.${1}.0

    curl -o boost_${boost_ver}.tar.gz -SL https://dl.bintray.com/boostorg/release/${boost_ver_dotted}/source/boost_${boost_ver}.tar.gz
    tar -xzf boost_${boost_ver}.tar.gz
    mv boost_${boost_ver} boost
}

function download_git_dependency {
    git clone git://github.com/${1}/${2}.git
    cd ${2}
    git checkout ${3}
    cd ..
}

function download_all {
    download_boost 74

    download_git_dependency google googletest release-1.10.0
    download_git_dependency google benchmark v1.5.2

    download_git_dependency mongodb mongo-c-driver 1.17.2
    download_git_dependency mongodb mongo-cxx-driver r3.6.1

    download_git_dependency zeromq libzmq v4.3.3
    download_git_dependency zeromq cppzmq v4.7.1

    download_git_dependency facebook rocksdb v6.13.3
}
cd ${CAT_DEPS_DIR}
mkdir source
cd source
download_all

Step 2 - Install all dependencies

マニュアルからの変更点は以下のとおり。
* install_google_benchmark()のオプションに"-DCMAKE_POSITION_INDEPENDENT_CODE=ON"を追加

function install_boost {
    cd boost
    ./bootstrap.sh with-toolset=clang --prefix=${boost_output_dir}

    b2_options=()
    b2_options+=(--prefix=${boost_output_dir})
    ./b2 ${b2_options[@]} -j 8 stage release
    ./b2 install ${b2_options[@]}
}

function install_git_dependency {
    cd ${2}
    mkdir _build
    cd _build

    cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="${CAT_DEPS_DIR}/${1}" ${cmake_options[@]} ..
    make -j 8 && make install
}

function install_google_test {
    cmake_options=()
    cmake_options+=(-DCMAKE_POSITION_INDEPENDENT_CODE=ON)
    install_git_dependency google googletest
}

function install_google_benchmark {
    cmake_options=()
    cmake_options+=(-DBENCHMARK_ENABLE_GTEST_TESTS=OFF)
    install_git_dependency google benchmark
}

function install_mongo_c_driver {
    cmake_options=()
    cmake_options+=(-DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF)
    cmake_options+=(-DENABLE_MONGODB_AWS_AUTH=OFF)
    cmake_options+=(-DENABLE_TESTS=OFF)
    cmake_options+=(-DENABLE_EXAMPLES=OFF)
    cmake_options+=(-DENABLE_SASL=OFF)
    install_git_dependency mongodb mongo-c-driver
}

function install_mongo_cxx_driver {
    cmake_options=()
    cmake_options+=(-DBOOST_ROOT=${boost_output_dir})
    cmake_options+=(-DCMAKE_CXX_STANDARD=17)
    install_git_dependency mongodb mongo-cxx-driver
}

function install_zmq_lib {
    cmake_options=()
    cmake_options+=(-DWITH_TLS=OFF)
    install_git_dependency zeromq libzmq
}

function install_zmq_cpp {
    cmake_options=()
    cmake_options+=(-DCPPZMQ_BUILD_TESTS=OFF)
    install_git_dependency zeromq cppzmq
}

function install_rocks {
    cmake_options=()
    cmake_options+=(-DPORTABLE=1)
    cmake_options+=(-DWITH_TESTS=OFF)
    cmake_options+=(-DWITH_TOOLS=OFF)
    cmake_options+=(-DWITH_BENCHMARK_TOOLS=OFF)
    cmake_options+=(-DWITH_CORE_TOOLS=OFF)
    cmake_options+=(-DWITH_GFLAGS=OFF)
    install_git_dependency facebook rocksdb
}

function install_all {
    declare -a installers=(
        install_boost
        install_google_test
        install_google_benchmark
        install_mongo_c_driver
        install_mongo_cxx_driver
        install_zmq_lib
        install_zmq_cpp
        install_rocks
    )
    for install in "${installers[@]}"
    do
        pushd source > /dev/null
        ${install}
        popd > /dev/null
    done
}
cd ${CAT_DEPS_DIR}
install_all

Step 3 - Finally, download and build catapult

マニュアルからの変更点は以下のとおり。
* -DCMAKE_PREFIX_PATHのデリミタを:から;に変更
* -DBoost_INCLUDE_DIRを追加
* 最後にninjaコマンドを実行しないとコンパイルされない

cd
git clone https://github.com/nemtech/catapult-server.git
cd catapult-server

mkdir _build && cd _build
BOOST_ROOT="${CAT_DEPS_DIR}/boost" cmake .. \
    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DCMAKE_PREFIX_PATH="${CAT_DEPS_DIR}/facebook;${CAT_DEPS_DIR}/google;${CAT_DEPS_DIR}/mongodb;${CAT_DEPS_DIR}/zeromq" \
    \
    -GNinja

ninja publish
ninja -j4

Step 4 確認

ls ./bin
bench.catapult.crypto.hashers                        tests.catapult.local.recovery
bench.catapult.crypto.verify                         tests.catapult.local.server
catapult.broker                                      tests.catapult.model
catapult.recovery                                    tests.catapult.mongo
catapult.server                                      tests.catapult.mongo.plugins.accountlink
catapult.tools.address                               tests.catapult.mongo.plugins.aggregate
catapult.tools.benchmark                             tests.catapult.mongo.plugins.lockhash
catapult.tools.health                                tests.catapult.mongo.plugins.locksecret
catapult.tools.linker                                tests.catapult.mongo.plugins.metadata
catapult.tools.nemgen                                tests.catapult.mongo.plugins.mosaic
catapult.tools.network                               tests.catapult.mongo.plugins.multisig
catapult.tools.ssl                                   tests.catapult.mongo.plugins.namespace
catapult.tools.statusgen                             tests.catapult.mongo.plugins.restrictionaccount
catapult.tools.testvectors                           tests.catapult.mongo.plugins.restrictionmosaic
catapult.tools.votingkey                             tests.catapult.mongo.plugins.transfer
tests.catapult.addressextraction                     tests.catapult.net
tests.catapult.api                                   tests.catapult.networkheight
tests.catapult.cache                                 tests.catapult.nodediscovery
tests.catapult.cache_core                            tests.catapult.observers
tests.catapult.cache_db                              tests.catapult.packetserver
tests.catapult.cache_tx                              tests.catapult.partialtransaction
tests.catapult.chain                                 tests.catapult.pluginhandlers
tests.catapult.config                                tests.catapult.plugins
tests.catapult.consumers                             tests.catapult.plugins.accountlink
tests.catapult.crypto                                tests.catapult.plugins.aggregate
tests.catapult.crypto_voting                         tests.catapult.plugins.coresystem
tests.catapult.deltaset                              tests.catapult.plugins.hashcache
tests.catapult.diagnostics                           tests.catapult.plugins.lockhash
tests.catapult.disruptor                             tests.catapult.plugins.locksecret
tests.catapult.extensions                            tests.catapult.plugins.metadata
tests.catapult.filespooling                          tests.catapult.plugins.mosaic
tests.catapult.finalization                          tests.catapult.plugins.multisig
tests.catapult.handlers                              tests.catapult.plugins.namespace
tests.catapult.harvesting                            tests.catapult.plugins.restrictionaccount
tests.catapult.hashcache                             tests.catapult.plugins.restrictionmosaic
tests.catapult.int.mongo                             tests.catapult.plugins.signature
tests.catapult.int.mongo.plugins.lockhash            tests.catapult.plugins.transfer
tests.catapult.int.mongo.plugins.locksecret          tests.catapult.sdk
tests.catapult.int.mongo.plugins.metadata            tests.catapult.state
tests.catapult.int.mongo.plugins.mosaic              tests.catapult.subscribers
tests.catapult.int.mongo.plugins.multisig            tests.catapult.sync
tests.catapult.int.mongo.plugins.namespace           tests.catapult.syncsource
tests.catapult.int.mongo.plugins.restrictionaccount  tests.catapult.thread
tests.catapult.int.mongo.plugins.restrictionmosaic   tests.catapult.timesync
tests.catapult.int.node                              tests.catapult.transactionsink
tests.catapult.int.node.stress                       tests.catapult.tree
tests.catapult.int.stress                            tests.catapult.unbondedpruning
tests.catapult.io                                    tests.catapult.utils
tests.catapult.ionet                                 tests.catapult.validators
tests.catapult.keylink                               tests.catapult.zeromq
tests.catapult.local.broker

以上。

ryosasa
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away