臨近EOS主網(wǎng)上線,為了盡快體驗(yàn)學(xué)習(xí)下一代區(qū)塊鏈EOS的魅力,自己也要在測(cè)試環(huán)境中部署一個(gè)實(shí)例進(jìn)行驗(yàn)證。目前在EOS Github的官網(wǎng)上已經(jīng)有基于Ubuntu及MacOS的版本的部署指導(dǎo)及自動(dòng)化腳本。
但實(shí)際研發(fā)人員用的環(huán)境還是比較多樣化的,在生產(chǎn)集群中更多的用的是CentOS系統(tǒng)。由于編譯環(huán)境差別比較大,走了不少?gòu)澛罚裉煊涗浺幌略趺丛谝粋€(gè)純凈CentOS 7.4主機(jī)上編譯EOS節(jié)點(diǎn)的過程以及我遇到的那些坑,以供后人繞行。
1. 硬件環(huán)境準(zhǔn)備
由于需要源碼編譯LLVM WebAssembly,主機(jī)編譯目錄下至少需要有10GB空閑可用空間,內(nèi)存不低于16 GB,CPU核數(shù),越多越好。
2. 基本編譯環(huán)境安裝
根據(jù)EOS.IO的官網(wǎng)介紹,該項(xiàng)目主要是使用 C++14版本進(jìn)行編譯,而CentOS 7倉庫中默認(rèn)帶的編譯器版本是4.8.5,不支持該標(biāo)準(zhǔn),同時(shí)CMake版本也較低,無法支持依賴庫的編譯,因此本次在開始編譯前需要先安裝相關(guān)新版的編譯工具鏈及相關(guān)環(huán)境。
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依賴環(huán)境編譯
根據(jù)官網(wǎng)描述,EOS.IO的主要第三方依賴環(huán)境如下
- Boost 1.64
- secp256k1-zkp
- Binaryen
- LLVM 4.0 with WebAssembly(在實(shí)際編譯中,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在本地?fù)Q進(jìn)中將C++編譯為WebAssembly在虛擬機(jī)中運(yùn)行,因此對(duì)于LLVM編譯器需要同時(shí)支持X86(本地?fù)Q進(jìn))和WebAssembly兩個(gè)Target進(jìn)行編譯。
在官方給出的編譯腳本中,由于在Ubuntu環(huán)境中已經(jīng)安裝了基于LLVM的clang,所以對(duì)Cmake的DLLVM_TARGETS_TO_BUILD
設(shè)置為""。但在CentOS中由于沒有安裝這個(gè)編譯器,這將會(huì)導(dǎo)致在后續(xù)EOS編譯時(shí)C++編譯器報(bào)錯(cuò)缺失LLVMX86****.so
文件,在這里我們需要指定DLLVM_TARGETS_TO_BUILD='host'
,與主機(jī)相同。 -
坑二 LLVM的版本
目前官方的EOS目前只支持4.0版本的llvm編譯器,在Clone Github庫時(shí),一定要選擇branch 40。直接clone最新版本,會(huì)在最后EOS編譯時(shí)報(bào)llvm版本不支持的錯(cuò)誤。 -
坑三 RTTI沒有開啟
在官方的編譯安裝腳本中,不不知道為什么沒有開啟LLVM_ENABLE_RTTI,這個(gè)會(huì)導(dǎo)致在后面編譯EOS時(shí)遇到莫名其妙的typeof ** undefine的錯(cuò)誤,LLVM的默認(rèn)編譯配置中也沒有開啟,因此在我們自己編譯的時(shí)候,一定要加上這個(gè)選項(xiàng)DLLVM_ENABLE_RTTI=ON
,雪的教訓(xùn)啊~
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編譯
如果到這一步均順利完成,現(xiàn)在可以編譯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. 運(yùn)行你的第一個(gè)EOS節(jié)點(diǎn)!
請(qǐng)參考官方文檔Creating and launching a single-node testnet,我就不羅嗦了。