在Raspberry Pi 4上安装Iroha

时间:2020-10-08 13:26:07

标签: raspberry-pi4 hyperledger-iroha

我正在尝试在Raspberry pi 3和4上安装Iroha。我正在手动构建它,如下所示:

1)git clone -b master https://github.com/hyperledger/iroha

  1. cd iroha

  2. mkdir构建;光盘构建; cmake ..;使-j $(nproc)

然后出现以下错误

cmake / dependencies上的CMake错误。cmake:24(find_package): 找不到“ spdlog”提供的程序包配置文件(已请求 版本1.3.1)具有以下任何名称:

spdlogConfig.cmake spdlog-config.cmake

将“ spdlog”的安装前缀添加到CMAKE_PREFIX_PATH或进行设置 “ spdlog_DIR”到包含上述文件之一的目录。如果是“ spdlog” 提供单独的开发包或SDK,请确保已 已安装。 呼叫堆栈(最近的呼叫优先): CMakeLists.txt:179(包括)

–配置不完整,发生错误! 另请参见“ /home/pi/Desktop/iroha/build/CMakeFiles/CMakeOutput.log”。 另请参阅“ /home/pi/Desktop/iroha/build/CMakeFiles/CMakeError.log”

有什么办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我已经在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

然后,我们应根据instruction安装依赖项:

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

根据instruction的下一步是致电:

iroha/vcpkg/build_iroha_deps.sh

但是当我在2020年10月使用脚本进行构建时,必须采取一些额外的步骤,原因是:

  1. vcpkg不支持aarch64,
  2. RPI上的
  3. g ++没有标志-m64
  4. VCPKG下载的一个依赖项(GRPC)未编译

一段时间后构建它可能不会遇到任何这些问题,但是也可能会遇到其他问题。

因此,建立RPI的第一步是只运行命令:

iroha/vcpkg/build_iroha_deps.sh

并等待。如果您没有发现任何问题,则不需要说明。

如果您发现cmakevcpkg连接时出现问题,则表明vcpkg仍然不支持aarch64,但是有hack使用系统的cmake,而不是由vcpkg下载。为此,我们需要在命令-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' ' ')

如果您遇到与标记boost-container连接的建筑物-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;
        }
    }
}

只需编译:{{1​​}} 我们只需要用包装器替换系统的g++ g++wrapper.cc -o g++wrapper,我们可以使用以下命令来完成此操作:

/usr/bin/c++

现在我们可以像上面那样继续构建。

当我们遇到构建GRPC的问题时:

sudo mv /usr/bin/c++ /usr/bin/c++_original
sudo mv g++wrapper /usr/bin/c++

并检入日志文件:

-- 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) 的另一个定义中遇到了类似的问题,所以我做了类似的事情:

gettid

更正后,我们可以恢复构建。

如果一切正常,我们用二进制文件包装c ++命令,我们应该恢复原始命令:

sed -i 's_\(^.*long gettid(.*$\)_//\1_g' $(find . -name log_linux.cc)

然后,我们应该能够编译对iroha的依赖关系。现在根据说明2,我们应该找出我们需要的cmake标志,我们可以使用以下命令来完成此操作:

sudo mv /usr/bin/c++_original /usr/bin/c++

在我的情况下它被打印了:

vcpkg/vcpkg integrate install

现在我们可以在cmake的命令中使用它了。

-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/vcpkg/scripts/buildsystems/vcpkg.cmake

然后调用makefile(我建议在RPI上使用单线程):

cd iroha
cmake -H. -Bbuild -DTESTING=OFF \
-DVCPKG_TARGET_TRIPLET=x64-linux \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/vcpkg/scripts/buildsystems/vcpkg.cmake

如果成功非常好!但是您看到问题了吗?

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

这就是在Raspberry Pi 4上构建Iroha的全部内容,现在您可以安装(或使用docker映像)数据库并享用。