CentOS 7下EOS编译

作者: 海蓝德 | 来源:发表于2018-01-30 21:21 被阅读138次

    临近EOS主网上线,为了尽快体验学习下一代区块链EOS的魅力,自己也要在测试环境中部署一个实例进行验证。目前在EOS Github的官网上已经有基于Ubuntu及MacOS的版本的部署指导及自动化脚本。

    但实际研发人员用的环境还是比较多样化的,在生产集群中更多的用的是CentOS系统。由于编译环境差别比较大,走了不少弯路,今天记录一下怎么在一个纯净CentOS 7.4主机上编译EOS节点的过程以及我遇到的那些坑,以供后人绕行。

    1. 硬件环境准备

    由于需要源码编译LLVM WebAssembly,主机编译目录下至少需要有10GB空闲可用空间,内存不低于16 GB,CPU核数,越多越好。

    2. 基本编译环境安装

    根据EOS.IO的官网介绍,该项目主要是使用 C++14版本进行编译,而CentOS 7仓库中默认带的编译器版本是4.8.5,不支持该标准,同时CMake版本也较低,无法支持依赖库的编译,因此本次在开始编译前需要先安装相关新版的编译工具链及相关环境。

    export BUILD_TEMP=${HOME}/tmp
    mkdir ${BUILD_TEMP}
    
    ##GNU C++ 6.3.1
    sudo yum install -y centos-release-scl
    sudo yum install -y devtoolset-6
    
    ##CMake 3.10.2
    
    export BUILD_TEMP=${HOME}/tmp
    mkdir ${BUILD_TEMP}
    
    cd  ${BUILD_TEMP}
    mkdir ${HOME}/opt
    curl -L https://cmake.org/files/v3.10/cmake-3.10.2-Linux-x86_64.tar.gz -o cmake-3.10.2-Linux-x86_64.tar.gz
    tar -zxf cmake-3.10.2-Linux-x86_64.tar.gz -C ${HOME}/opt
    
    export PATH=$PATH:/opt/rh/devtoolset-6/root/bin/:${HOME}/opt/cmake-3.10.2-Linux-x86_64/bin/
    
    ##Other compile tool chain
    sudo yum install -y git autoconf automake libtool doxygen ocaml  gmp-devel python-devel bzip2-devel openssl-devel libicu-devel bzip2 wget
    
    

    3. EOS依赖环境编译

    根据官网描述,EOS.IO的主要第三方依赖环境如下

    • Boost 1.64
    • secp256k1-zkp
    • Binaryen
    • LLVM 4.0 with WebAssembly(在实际编译中,X86的Target也需要安装编译)

    3.1. Boost编译

    export BOOST_ROOT=${HOME}/opt/boost_1_64_0
    cd  ${BUILD_TEMP}
    curl -L https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2 > boost_1.64.0.tar.bz2
    tar xvf boost_1.64.0.tar.bz2
    cd boost_1_64_0/
    ./bootstrap.sh "--prefix=$BOOST_ROOT"
    ./b2 install
    

    3.2. secp256k1-zkp编译

    cd  ${BUILD_TEMP}
    git clone https://github.com/cryptonomex/secp256k1-zkp.git
    cd secp256k1-zkp
    ./autogen.sh && ./configure
    make
    sudo make install
    

    3.3. Binaryen编译

    cd  ${BUILD_TEMP}
    git clone https://github.com/WebAssembly/binaryen
    cd binaryen
    git checkout tags/1.37.14
    cmake . && make -j 4
    sudo make install
    

    3.4. LLVM WebAssembly+ Host Target

    • 坑一 DLLVM_TARGETS_TO_BUILD
      在这里需要特定说明一下,由于EOS需要LLVM在本地换进中将C++编译为WebAssembly在虚拟机中运行,因此对于LLVM编译器需要同时支持X86(本地换进)和WebAssembly两个Target进行编译。
      在官方给出的编译脚本中,由于在Ubuntu环境中已经安装了基于LLVM的clang,所以对Cmake的DLLVM_TARGETS_TO_BUILD设置为""。但在CentOS中由于没有安装这个编译器,这将会导致在后续EOS编译时C++编译器报错缺失LLVMX86****.so文件,在这里我们需要指定DLLVM_TARGETS_TO_BUILD='host',与主机相同。
    • 坑二 LLVM的版本
      目前官方的EOS目前只支持4.0版本的llvm编译器,在Clone Github库时,一定要选择branch 40。直接clone最新版本,会在最后EOS编译时报llvm版本不支持的错误。
    • 坑三 RTTI没有开启
      在官方的编译安装脚本中,不不知道为什么没有开启LLVM_ENABLE_RTTI,这个会导致在后面编译EOS时遇到莫名其妙的typeof ** undefine的错误,LLVM的默认编译配置中也没有开启,因此在我们自己编译的时候,一定要加上这个选项DLLVM_ENABLE_RTTI=ON,雪的教训啊~
    cd  ${BUILD_TEMP}
    
    mkdir ${BUILD_TEMP}/wasm-compiler/build -p
    cd ${BUILD_TEMP}/wasm-compiler
    git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
    cd llvm/tools
    git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
    cd ${BUILD_TEMP}/wasm-compiler/build
    cmake -G "Unix Makefiles" -DLLVM_ENABLE_RTTI=ON -DLLVM_TARGETS_TO_BUILD='host' -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../llvm
    sudo make -j4 install
    
    export WASM_LLVM_CONFIG=/usr/local/bin/llvm-config
    

    4. EOS编译

    如果到这一步均顺利完成,现在可以编译EOS了

    cd ${BUILD_TEMP}
    git clone https://github.com/eosio/eos --recursive
    mkdir -p ${BUILD_TEMP}/eos/build && cd ${BUILD_TEMP}/eos/build
    cmake -DBOOST_INCLUDEDIR=${BOOST_ROOT}/include/boost \
    -DBOOST_LIBRARYDIR=${BOOST_ROOT}/lib  ..
    make -j4
    

    5. 运行你的第一个EOS节点!

    请参考官方文档Creating and launching a single-node testnet,我就不罗嗦了。


    请打赏一个可怜的攻城狮,ETH捐助地址0x2255b6221479ED4d451914cA7acb2D01ee2ef101

    相关文章

      网友评论

        本文标题:CentOS 7下EOS编译

        本文链接:https://www.haomeiwen.com/subject/xbdzaxtx.html