临近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,我就不罗嗦了。
网友评论