我已经设法在Ubuntu Server 20.04.1 LTS (GNU/Linux 5.4.0-1015-raspi aarch64) 上的 RPI 4 上构建 iroha (1.1.3 版)
首先我们需要更新我们的系统:
sudo apt-get update
sudo apt-get upgrade -y
然后我们应该按照说明安装依赖项:
sudo apt-get -y --no-install-recommends install build-essential git ca-certificates tar curl unzip cmake vim ninja-build -y
现在我建议重新启动系统:
sudo reboot now
下一步是下载 iroha 源,我已经在 Iroha 1.1.3 上测试过,所以我的源是:
git clone --branch 1.1.3 https://github.com/hyperledger/iroha.git --depth=1
根据说明下一步是调用:
iroha/vcpkg/build_iroha_deps.sh
但是,当我在 2020 年 10 月使用脚本进行构建时,一些额外的步骤是必要的,这是因为以下事实:
- vcpkg 不支持 aarch64,
- RPI 上的 g++ 没有标志 -m64
- VCPKG 下载的依赖项 (GRPC) 之一未编译
当您在一段时间后构建它时,您可能不会遇到任何这些问题,但您也可能会遇到不同的问题。
因此,在 RPI 上构建的第一步就是运行命令:
iroha/vcpkg/build_iroha_deps.sh
等待。如果您没有发现任何问题,则不需要该说明。
如果您看到cmake
与它连接的问题,vcpkg
则意味着 vcpkg 仍然不支持 aarch64,但是有一个hack可以使用系统的 cmake,而不是通过 vcpkg 下载。为此,我们需要在 command 之后添加-useSystemBinaries
到文件中。可以使用命令快速完成:iroha/vcpkg/build_iroha_deps.sh
bootstrap-vcpkg.sh
sed -i 's/\(^.*bootstrap.*$\)/\1 -useSystemBinaries/g' iroha/vcpkg/build_iroha_deps.sh
然后您可以继续构建:
./vcpkg/vcpkg install $(cat iroha/vcpkg/VCPKG_DEPS_LIST | cut -d':' -f1 | tr '\n' ' ')
./vcpkg/vcpkg install --head $(cat iroha/vcpkg/VCPKG_HEAD_DEPS_LIST | cut -d':' -f1 | tr '\n' ' ')
如果您遇到 build 问题boost-container
,与 flag 连接,-m64
在 RPI 的 gcc 上不存在,您需要创建包装器来删除标志。我在 c++ 中创建了包装器(文件g++wrapper.cc
):
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
string args2Text(int argc, char** argv, const char* forbiddenFlag="-m64", const char* compilerCommand="/usr/bin/g++");
int returnValidNumberFromSubcommand(int systemCallReturnValue);
string escapeQuotes(const string& text);
int main(int argc, char* argv[])
{
const auto command = args2Text(argc, argv);
const auto status = system(command.c_str());
return returnValidNumberFromSubcommand(status);
}
string args2Text(int argc, char** argv, const char* forbiddenFlag, const char* compilerCommand)
{
string command = compilerCommand;
for (int i = 1; i < argc; ++i)
{
if (strcmp(argv[i], forbiddenFlag))
command += " "s + escapeQuotes(argv[i]);
}
return command;
}
string escapeQuotes(const string& text)
{
constexpr const char* escapedQuote = R"_(\")_";
string returnString;
returnString.reserve(text.size() + 2);
for (auto c : text)
{
if ('"' == c)
returnString += escapedQuote;
else
returnString += c;
}
return returnString;
}
int returnValidNumberFromSubcommand(int systemCallReturnValue)
{
if (systemCallReturnValue < 0)
{
return -1;
}
else
{
if (WIFEXITED(systemCallReturnValue))
{
return WEXITSTATUS(systemCallReturnValue);
}
else
{
return 1;
}
}
}
只需编译它:g++ g++wrapper.cc -o g++wrapper
我们只需要用/usr/bin/c++
我们的包装器替换系统,我们可以用命令来做到这一点:
sudo mv /usr/bin/c++ /usr/bin/c++_original
sudo mv g++wrapper /usr/bin/c++
现在我们可以像上面那样恢复构建了。
当我们遇到构建 GRPC 的问题时:
-- Using source at /home/ubuntu/vcpkg/buildtrees/grpc/src/577f0c79b1-086c8c6e6c
-- Configuring x64-linux-dbg
-- Configuring x64-linux-rel
-- Building x64-linux-dbg
CMake Error at scripts/cmake/vcpkg_execute_build_process.cmake:134 (message):
Command failed: /usr/bin/cmake;--build;.;--config;Debug;--target;install;--;-v
Working Directory: /home/ubuntu/vcpkg/buildtrees/grpc/x64-linux-dbg
See logs for more information:
/home/ubuntu/vcpkg/buildtrees/grpc/install-x64-linux-dbg-out.log
并检查日志文件:
/home/ubuntu/vcpkg/buildtrees/grpc/install-x64-linux-dbg-out.log
/home/ubuntu/vcpkg/buildtrees/grpc/src/577f0c79b1-086c8c6e6c/src/core/lib/iomgr/ev_epollex_linux.cc:1105:13: error: ambiguating new declaration of ‘long int gettid()’
然后我修复了评论gettid
函数重新定义:
sed -i 's_\(^.*long gettid(.*$\)_//\1_g' $(find . -name ev_epollex_linux.cc)
然后我在 function 的另一个定义中遇到了类似的问题gettid
,所以我做了类似的事情:
sed -i 's_\(^.*long gettid(.*$\)_//\1_g' $(find . -name log_linux.cc)
更正后,我们可以恢复构建。
如果一切正常并且我们用二进制文件包装了 c++ 命令,我们应该恢复原始命令:
sudo mv /usr/bin/c++_original /usr/bin/c++
然后我们应该能够将依赖项编译到 iroha。现在根据指令2我们应该找出我们需要什么cmake的标志,我们可以用命令做到这一点:
vcpkg/vcpkg integrate install
在我的情况下,它被打印出来:
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/vcpkg/scripts/buildsystems/vcpkg.cmake
现在我们可以在 cmake 的命令中使用它了。
cd iroha
cmake -H. -Bbuild -DTESTING=OFF \
-DVCPKG_TARGET_TRIPLET=x64-linux \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/vcpkg/scripts/buildsystems/vcpkg.cmake
然后让我们调用 makefile(我建议在 RPI 上使用单线程):
cd build
make
sudo make install
如果成功就太好了!但是你看到问题了吗:
CMake Error at cmake_install.cmake:78 (file):
file INSTALL cannot find "/home/ubuntu/iroha/-lpthread": No such file or directory
您需要从文件中注释该行:
sed -i 's_\(^.*\-lpthread.*\)$_#\1_g' cmake_install.cmake
然后我们可以重新运行:
sudo make install
这就是在 Raspberry Pi 4 上构建 Iroha 的全部内容,现在您可以安装(或使用 docker 映像)数据库并享受。