编译并搭建EOS的环境(MAC踩坑填坑版)

2017/7/30 posted in  项目

原文:https://eosio.github.io/eos/group__howtobuild.html

最近EOS官网出了文档,说可以跑通一个独立测试的节点了。这周尝试自行搭建了一下,由于自己不完全做mac下的开发,且这玩意是C写的,所以make起来遇到不少坑,记录下来。附完整踩坑、填坑记录。

1. 搭建环境

mac下大家应该都用brew来管理包吧。首先官方说要安装:

  • Boost 1.64
  • OpenSSL
  • LLVM 4.0

通过下面命令,可以尽可能全的安装编译环境:

brew install autoconf automake libtool boost openssl pkg-config

另外需要安装的下面这个,brew并没有,需要手动安装:

  • secp256k1-zkp (Cryptonomex branch)

步骤如下:

git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
./configure
make
sudo make install

2. 编译LLVM和clang来支持智能合约运行的WASM环境

默认安装的LLVM和clang并不会包含WASM模块,所以需要自行编译,下面是实现仅仅编译LLVM只会生成WASM模块。

mkdir  ~/wasm-compiler
cd ~/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 ..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=.. -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
make -j4 install

3. 获取EOS源码

递归取下来所有的EOS及其模块代码:

git clone https://github.com/eosio/eos --recursive

如果你没有带--recursive标志,可以运行下面的命令来抓下来需要的模块(这个命令我没有试,使用时,要看是不是需要进到目录内):

git submodule update --init --recursive

4. 使用WASM编译器完整编译EOS源码

需要配置WASM_LLVM_CONFIG环境变量来找到上面构建的WASM的编译器。这个编译器是用来编译eos/contracts下的合约例子,和相应的测试用例的。

git clone https://github.com/eosio/eos --recursive
mkdir -p eos/build && cd eos/build
export WASM_LLVM_CONFIG=~/wasm-compiler/llvm/bin/llvm-config 
cmake ..
make -j4

上面的cmake ..会遇到一些坑,可参考使用第7节中完整填坑后的cmake脚本。

5. 创建并运行一个测试网节点

进入到编译目录

$ cd programs/
$ /eosd/eosd

运行上述命令后会立即报错,按Ctrl C强制中止后,命令运行目录下,会生成默认的./data-dir/目录,目录下有./data-dir/config.ini配置。可以略微看看默认的配置,再启动就好了(这里相当于没有配置,帮你生成了默认配置,所有人都一样,不安全):

如果要支持命令行,在config.ini下,添加下述配置。参见 https://eosio.github.io/eos/group__eosc.html

plugin = eos::chain_api_plugin

这样,就可以通过EOS自己的命令行工具eosc来进行交互,如下:

./eosc/eosc info

输出效果:

{
  "head_block_num": 0,
  "last_irreversible_block_num": 0,
  "head_block_id": "0000000000000000000000000000000000000000000000000000000000000000",
  "head_block_time": "2017-03-30T12:00:00",
  "head_block_producer": "",
  "recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",
  "participation_rate": "1.00000000000000000"
}

6. 可能遇到的坑

6.1 可能遇到GMP包找不到的报错:

CMake Error at /usr/local/Cellar/cmake/3.9.0/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
Could NOT find GMP (missing: GMP_LIBRARIES GMP_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/local/Cellar/cmake/3.9.0/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:377 (_FPHSA_FAILURE_MESSAGE)

解决办法:

brew install gmp

6.2 可能遇到ssl相关的错

CMake error: Could not find openSSL or GCrypt

但明明已经安装,原因是由于新版mac已经移除了openssl,所以我们需要手动配置环境变量,可以在cmake的命令行中通过-D的方式传入OPENSSL_ROOT_DIROPENSSL_LIBRARIES两个环境变量:

cmake -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2l -DOPENSSL_LIBRARIES=/usr/local/Cellar/openssl/1.0.2l/lib ..

6.3 最后的联接时失败Link failed

第一种,使用brew install llvm后会遇到下面的报错:

- Configuring ChainBase on OS X

CMake Error at libraries/wasm-jit/Source/Runtime/CMakeLists.txt:26 (find_package):

Could not find a package configuration file provided by "LLVM" (requested

version 4.0) with any of the following names:

LLVMConfig.cmake

llvm-config.cmake

Add the installation prefix of "LLVM" to CMAKE_PREFIX_PATH or set

"LLVM_DIR" to a directory containing one of the above files.  If "LLVM"

provides a separate development package or SDK, be sure it has been

installed.

-- Configuring incomplete, errors occurred!

解决办法,配置环境变量:

export LLVM_DIR=/usr/local/Cellar/llvm/4.0.1/lib/cmake/llvm

另一种可能,是手动安装llvm遇到下面的报错:

typeinfo for LLVMJIT::UnitMemoryManager in libRuntime.a(LLVMJIT.cpp.o)
"typeinfo for llvm::CmpInst", referenced from:
typeinfo for llvm::FCmpInst in libRuntime.a(LLVMEmitIR.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libraries/wasm-jit/Source/Programs/wavm] Error 1
make[1]: *** [libraries/wasm-jit/Source/Programs/CMakeFiles/wavm.dir/all] Error 2

初步怀疑这种是因为在第2节中,使用的是默认的llvm编译了,但却后续又使用手动安装的llvm进行后续操作导致的。故统一使用brew管理的llvm

完整的解决过程,参考这里:https://github.com/EOSIO/eos/issues/99

7. 完整的cmake脚本供参考

## 引入支持合约运行的编译器WASM
export WASM_LLVM_CONFIG=~/develop/eos/environment/wasm-compiler/llvm/bin/llvm-config
## 引入LLVM
export LLVM_DIR=/usr/local/Cellar/llvm/4.0.1/lib/cmake/llvm
## 新版mac移除了openssl的环境变量配置,手动设置并cmake
cmake -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2l -DOPENSSL_LIBRARIES=/usr/local/Cellar/openssl/1.0.2l/lib ..

处于某些特定的环境下,可以看到评论框,欢迎留言交流^_^。

友情链接: 区块链技术中文社区    深入浅出区块链