9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

カタパルトサーバーのマニュアルビルド方法

Posted at

概要

Symbolのカタパルトサーバーのマニュアルビルド方法です。

環境

$ uname -a
Linux vmi649314.contaboserver.net 5.4.0-105-generic #119-Ubuntu SMP Mon Mar 7 18:49:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

python

$ python3 -V
>Python 3.9.18

openssl

$ openssl version
>OpenSSL 1.1.1f  31 Mar 2020

OpenSSlはバージョンが低かったので以下の手順で入れ直し

$ sudo apt update
# 依存関係をインストール
$ sudo apt install build-essential checkinstall zlib1g-dev -y
# 3.1.0のソースコードを取得
$ sudo wget https://github.com/openssl/openssl/releases/download/openssl-3.1.0/openssl-3.1.0.tar.gz
# 解凍、ビルド、インストール
$ sudo tar xvf openssl-3.1.0.tar.gz
$ cd openssl-3.1.0/
$ ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
$ make
$ sudo make install
# 設定ファイル
$ cat <<- __EOF__ | sudo tee -a /etc/ld.so.conf.d/openssl-3.1.1.conf
/usr/local/ssl/lib64
__EOF__
# 設定反映
$ sudo ldconfig -v
# パスを通す
$ sudo tee /etc/profile.d/openssl.sh<<EOF
export PATH=/usr/local/ssl/bin:\$PATH
export LD_LIBRARY_PATH=/usr/local/ssl/lib:\$LD_LIBRARY_PATH
export OPENSSL_ROOT_DIR=/usr/local/ssl
EOF
$ source /etc/profile.d/openssl.sh
# バージョンの確認
$ openssl version
OpenSSL 3.1.0 14 Mar 2023 (Library: OpenSSL 3.1.0 14 Mar 2023)

前提条件

  • git
  • python3.7+
  • openssl3.1.0+
  • 約15GBの空きディスク容量

ビルド

ステップ1

catapult-clientのクローン

$ git clone https://github.com/symbol/symbol.git
# v1.0.3.6のタグを指定してチェックアウト
$ git checkout -b v1.0.3.6 refs/tags/client/catapult/v1.0.3.6
$ cd symbol/client/catapult

ステップ2

ソースからすべての依存関係をダウンロード、ビルド、インストールする

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

各ツールのダウンロード&ビルドに少しかなり時間がかかります

cmakeのエラーが発生した時

[*] cmake
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DCMAKE_INSTALL_PREFIX=/home/dai/src/symbol/client/catapult/_deps/google
      -DCMAKE_POSITION_INDEPENDENT_CODE=ON
      -DBUILD_GMOCK=OFF
      ..
Traceback (most recent call last):
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 195, in <module>
    main()
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 191, in main
    builder.build_git_dependency(repository[0], repository[1])
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 105, in build_git_dependency
    self.process_manager.dispatch_subprocess(cmake_options + ['..'])
  File "/home/dai/src/symbol/jenkins/catapult/process.py", line 18, in dispatch_subprocess
    with Popen(command_line, stdout=PIPE, stderr=STDOUT) as process:
  File "/home/dai/.pyenv/versions/3.9.18/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/home/dai/.pyenv/versions/3.9.18/lib/python3.9/subprocess.py", line 1837, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'cmake'

解決策

CMakeを入れる

$ sudo apt install -y software-properties-common
$ wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null
$ sudo apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main"
$ sudo apt update
$ sudo apt -y install cmake
$ cmake --version
cmake version 3.28.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

mv boost_1_80_0 boost exited with 1 などのエラーが出る

[*] tar -xzf boost_1_80_0.tar.gz
[*] mv boost_1_80_0 boost
mv: cannot move 'boost_1_80_0' to 'boost/boost_1_80_0': Directory not empty
Traceback (most recent call last):
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 195, in <module>
    main()
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 173, in main
    downloader.download_boost()
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 22, in download_boost
    self.download_boost_unix()
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 31, in download_boost_unix
    self.process_manager.dispatch_subprocess(['mv', f'boost_1_{version}_0', 'boost'])
  File "/home/dai/src/symbol/jenkins/catapult/process.py", line 39, in dispatch_subprocess
    raise SubprocessError(f'{formatted_command_line} exited with {process.returncode}')
subprocess.SubprocessError: mv boost_1_80_0 boost exited with 1

解決策

とりあえず、_depsフォルダを削除する(他にも方法はあるが手っ取り早いので)

$ rm -fr _deps/

CMake Error...Could NOT find PkgConfig エラーが出る

CMake Error at /usr/share/cmake-3.28/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
Call Stack (most recent call first):
  /usr/share/cmake-3.28/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.28/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
  builds/cmake/Modules/FindSodium.cmake:7 (find_package)
  CMakeLists.txt:265 (find_package)


-- Configuring incomplete, errors occurred!
Traceback (most recent call last):
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 195, in <module>
    main()
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 191, in main
    builder.build_git_dependency(repository[0], repository[1])
  File "/home/dai/src/symbol/client/catapult/../../jenkins/catapult/installDepsLocal.py", line 105, in build_git_dependency
    self.process_manager.dispatch_subprocess(cmake_options + ['..'])
  File "/home/dai/src/symbol/jenkins/catapult/process.py", line 39, in dispatch_subprocess
    raise SubprocessError(f'{formatted_command_line} exited with {process.returncode}')
subprocess.SubprocessError: cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/home/dai/src/symbol/client/catapult/_deps/zeromq -DWITH_TLS=OFF .. exited with 1

解決策

pkg-configを入れる

$ sudo apt install pkg-config

ツールへのパスを設定

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

export CAT_DEPS_DIR=/root/symbol/client/catapult/_deps
export CMAKE_PREFIX_PATH=$CAT_DEPS_DIR/boost:$CAT_DEPS_DIR/facebook:$CAT_DEPS_DIR/google:$CAT_DEPS_DIR/mongodb:$CAT_DEPS_DIR/zeromq
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

ステップ3

カタパルトを組み立てる

テストを実行するととてつもなく長いので以下の例では「-DENABLE_TESTS=OFF」を入れてあえてテストを無効にしています。

$ mkdir -p _build && cd _build
$ 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
$ ninja publish
$ ninja

Ninjaが見つからない

CMake Error: CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!

ninja-buildを入れる

$ wget https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-linux.zip
$ sudo unzip ninja-linux.zip -d /usr/local/bin/
$ sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force
$ /usr/bin/ninja --version
>1.11.1

GTestが見つからない

CMake Warning (dev) at CMakeLists.txt:36 (find_package):
  Policy CMP0144 is not set: find_package uses upper-case <PACKAGENAME>_ROOT
  variables.  Run "cmake --help-policy CMP0144" for policy details.  Use the
  cmake_policy command to set the policy and suppress this warning.

  Environment variable BOOST_ROOT is set to:

    /home/dai/src/symbol/client/catapult/_deps/boost

  For compatibility, find_package is ignoring the variable, but code in a
  .cmake module might still use it.
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Found Boost: /home/dai/src/symbol/client/catapult/_deps/boost/lib/cmake/Boost-1.80.0/BoostConfig.cmake (found suitable exact version "1.80.0") found components: atomic chrono date_time filesystem log log_setup program_options regex thread 
boost     ver: 1.80.0
boost     inc: /home/dai/src/symbol/client/catapult/_deps/boost/include
boost    libs: Boost::atomic;Boost::chrono;Boost::date_time;Boost::filesystem;Boost::log;Boost::log_setup;Boost::program_options;Boost::regex;Boost::thread
--- locating gtest dependencies ---
CMake Error at /usr/share/cmake-3.28/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR
  GTEST_MAIN_LIBRARY) (Required is exact version "1.13.0")
Call Stack (most recent call first):
  /usr/share/cmake-3.28/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.28/Modules/FindGTest.cmake:270 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:47 (find_package)

解決策

GTestを入れます
(本来パスが正しく設定されていれば不要のはず)

$ sudo apt-get -y install libgtest-dev

なんか変な時

cmakeのキャッシュファイルを削除する

rm -fr CMakeCache.txt 

ステップ4

検証

以下のように./bin/catapult.tools.address --helpを実行して結果が返ってくれば成功です。

$ ./bin/catapult.tools.address --help

Address Inspector Tool
Copyright (c) Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp.
catapult version: 1.0.3.6 afea1ae8 [v1.0.3.6]

Address Inspector Tool options:
  -h [ --help ]     print help message
  -l [ --loggingConfigurationPath ] arg
                    path to the logging configuration file
  -n [ --network ] arg (=testnet)
                    network, possible values: testnet (default), mainnet
  -i [ --input ] arg
                    input value (comma-delimited) or file
  -o [ --output ] arg
                    (optional) output file
  -f [ --format ] arg (=pretty)
                    output format, possible values: pretty (default), csv
  --suppressConsole 
                    true to suppress console output
  -m [ --mode ] arg mode, possible values: encoded, decoded, public, secret```

おまけ

カタパルトのエクステンションなどを開発してソースコードに追加した際にはステップ3から実行すればOKです。
その際にcmakeのキャッシュファイルが残っている場合は削除しておいたほうが安全です。

参考

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?