Skip to content

Instantly share code, notes, and snippets.

@danielsocials
Last active September 14, 2017 07:34
Show Gist options
  • Save danielsocials/5227ba70bcbccfd6962a to your computer and use it in GitHub Desktop.
Save danielsocials/5227ba70bcbccfd6962a to your computer and use it in GitHub Desktop.

bitcoin的各种编译姿势

bitcoin发展到目前,已经支持很多种操作系统,windows/linux/osx, 还有各种CPU体系结构,X86/ARM/MIPS/PPC,

  • 支持的os

    • windows系列
    • linux系列
    • osx系列
  • 支持的编译器

    • gcc
    • clang
  • 支持的CPU

    • X86
    • ARM
    • MIPS
    • PPC
  • 支持的编译方式

    • 通常用于开发测试的编译方式
    • trival方式: 主要用于验证pull request
    • gitian编译: 主要是发布时候的编译方式
    • cross编译: 支不同的OS和不同CPU比如ARM/MIPS/PPC等的交叉编译

这里主要以最新的0.11.2为例, 编译主机为ubuntu12.04 总结下目前的各种编译方式

安装依赖库

https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md

sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils libboost-all-dev libdb-dev libdb++-dev

GUI

如果需要GUI支持,需要安装qt库

QT4需要的库

sudo apt-get install libqt4-dev libprotobuf-dev protobuf-compiler
QT5需要的库
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler

upnp

sudo apt-get install libminiupnpc-dev

ZMQ

需4.x以上版本
sudo apt-get install libzmq3-dev

wallet

bitcoin的钱包是基于berkly DB实现的,但是这个数据库的新版本不兼容前面的版本,所以如果需要兼容旧的钱包
就要安老的的的BDB的库,如果你不需要兼容旧钱包,可以用--with-incompatible-bdb跳过这个
如果需要兼容旧的钱包,需要安装老版本的libdb
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8-dev libdb4.8++-dev

编译命令

git clone https://github.com/bitcoin/bitcoin.git
cd bitcoin
./autogen.sh
./configure
make
make install # 可选

编译配置选项

可选模块及编译选项

目前bitcoin很多特性已经模块化, 可以在configure时候选择需要的模块,这样不需要的模块库就可以不编译,当然相应的功能也不支持,可选的模块有upnp,gui,lib,wallet,zmq,还有测试模块test,bench,lco

去掉gui支持

./configure --with-gui=no

去掉upnp支持

--enable-upnp-default   if UPNP is enabled, turn it on at startup (default is no)
--with-miniupnpc        enable UPNP (default is yes if libminiupnpc is found)

去掉ZMQ模块支持

--disable-zmq          disable ZMQ notifications

去掉wallet模块支持

--disable-wallet        disable wallet (enabled by default)

关闭test

--disable-tests         do not compile tests (default is to compile)

去掉benchmark模块

--disable-bench         do not compile benchmarks (default is to compile)

打开或者关闭lib库编译

--enable-shared[=PKGS]  build shared libraries [default=yes]
--enable-static[=PKGS]  build static libraries [default=yes]

调试开关

--eanble-debug 打开调试信息

--disable-silent-rules 打印编译信息

windows下编译

bitcoin的windows编译目前需要 msys / mingw-w64支持 这里有人整理了个自动编译环境

https://github.com/phelix/easywinbuilder
https://bitcointalk.org/index.php?topic=149479.0

msvc目前不支持,如果想试试可以参考如下的实现,比较早但是有一定参考价值:

https://github.com/ClaireDuSoleil/bitcoin/tree/0.8.6
https://github.com/ENikS/bitcoin-dev-msvc
https://github.com/ClaireDuSoleil/bitcoin/tree/0.8.6
https://github.com/fsb4000/bitcoin/tree/MSVC
https://bitcoinqtmsvc2012.codeplex.com/
https://bitcointalk.org/index.php?topic=349094.0

mac下编译

https://github.com/bitcoin/bitcoin/blob/v0.11.2/doc/build-osx.md

安装 homwbrew http://brew.sh/

brew install autoconf automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf qt5 libevent

./autogen.sh
./configure --with-gui=no
make

freebsd下编译

https://github.com/WyseNynja/bitcoinxt/blob/master/doc/build-freebsd.md

pkg install ca_root_nss autotools pkgconf gmake boost-libs openssl db48 git

export CC=clang
export CXX=clang++
export CXXFLAGS="-I/usr/local/include -I/usr/local/include/db48"
export LDFLAGS="-L/usr/local/lib -L/usr/local/lib/db48"
./autogen.sh
./configure --with-gui=no
gmake -j4

openbsd编译

https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md

pkg_add gmake libtool libevent
pkg_add autoconf # (select highest version, e.g. 2.69)
pkg_add automake # (select highest version, e.g. 1.15)
pkg_add python # (select version 2.7.x, not 3.x)
ln -sf /usr/local/bin/python2.7 /usr/local/bin/python2
pkg_add g++

travis 编译

travis是travis-ci.org推出的持续集成服务平台,可以用来构建和测试github上的代码,每当有人发出push request请求的时候,trival就会自动进行编译,测试

travis的配置文件: https://github.com/bitcoin/bitcoin/blob/v0.11.2/.travis.yml

目前自动编译测试如下版本,你也可以修改travi文件添加你自己的版本

- compiler: ": ARM"
- compiler: ": Win32"
- compiler: ": 32-bit + dash"
- compiler: ": Win64"
- compiler: ": bitcoind"
- compiler: ": No wallet"
- compiler: ": Cross-Mac"

每当有人发起pull request后,travis就开始自动构建和测试,完成后可以在pull reuest的页面上看到编译结果成功或者失败,同时可以在travis-ci的网站上看到编译过程细节 https://travis-ci.org/bitcoin/bitcoin/builds

gitian 编译

gitian是一个基于虚拟机的编译环境,可以用来解决多人编译的一致性问题,保证每个人的编译结果都是相同的,然后核心开发者们会基于这个编译结果签名发布, gitian可以运行在linux/osx上。

precise 12.04

发布0.11.2时候仍然是基于ubuntu 12.04 构建的的 https://github.com/bitcoin/bitcoin/blob/master/doc/gitian-building.md

目前 master已经切换到14.04,

gitian: build on ubuntu 14.04 (#6900) trusty

bitcoin/bitcoin#6900 https://github.com/laanwj/bitcoin/commits/2015_10_gitian_trusty

gitian on mac

在 Mac上运行 gitian参考 http://gavintech.blogspot.jp/2014/02/gitian-building-bitcoin-releases.html

使用gitian发布编译流程

发布编译打包签名等的流程 https://github.com/bitcoin/bitcoin/blob/v0.11.2/doc/release-process.md 文档很详细,照着做就可以了

验证签名

开始运行下载bitcoin core之前最好检查一下你下载的文件没有经过修改,有2种方式 ###检查数字签名 windows或者mac下可以检查数字签名是否是由"The Bitcoin Foundation, Inc." 发布的

###sha256验证 sha256验证可以保证你从网上或者别处下载来的bitcoin core确实是开发者发布的没有经过修改, 在bitcoin core的下载页 https://bitcoin.org/en/download 有个Verify release signatures的链接 就是https://bitcoin.org/bin/bitcoin-core-0.11.2/SHA256SUMS.asc 或者也可以在https://bitcoin.org/bin/找到,每个版本目录下有个SHA256SUMS.asc

SHA256SUMS.asc文件的内容类似如下

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

64b6ce0749266f8418debd90ead0899ffd3434c9fe50b4df327e2248d29dd208  bitcoin-0.11.2-linux32.tar.gz
2fc13c64fd10b7f75aa93d1f1df78f353a02cca62e17f9ffd106527da2e8b908  bitcoin-0.11.2-linux64.tar.gz
511479b042350ed4ea2479e0dd82dbdad6c57da906a3d3e7f8e4a823b96a53c6  bitcoin-0.11.2-osx64.tar.gz
413dd4335ced455c0e773d4081f7ff7e5e23e8098bf1fe402e0185cc584ca0df  bitcoin-0.11.2-osx.dmg
a4d2bd642e5f7f1f82dc3f708618ac77e1e45353db7a98bf81c3bdc0e10690d3  bitcoin-0.11.2.tar.gz
d154ef7c525e99024b33c0471b72201ede74d82dce18e4a11b36abe471671e4f  bitcoin-0.11.2-win32-setup.exe
7e5724e5baac103732da6f5f4b956604561a8b41d0667ec2756ddccf34cac684  bitcoin-0.11.2-win32.zip
1e6c2bc60e023cb603b1ea779200590b128821dab2fcf1fcd03dc0ad5d641ac2  bitcoin-0.11.2-win64-setup.exe
16f045db496e94becf67e7ea2814e96e5b6bade67e024ff31dfd5b0a4138bfba  bitcoin-0.11.2-win64.zip
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQIcBAEBCAAGBQJWRc/oAAoJEJDIAZ42wulk2yQP/0bTjY6725n5dxPkljk29WmW
3gRp6QgJ8aqob03nYVJgd4DqQi5grL928hXjg0vWQp3482GuZnOh54HB21msfEn7
unnLGFIEYM1noZbPcGLrBg6P5ONWJVGerYj3O8XQSPBVFZ6TPO54OfTYdRGva0td
YuzJZCIlQo9VRifuEWt/iV2fnzSfsmoFFXb3p31/SHxOVVJ2FlhKGmymzpwu5Pm7
aeeRspSYgNwvqoOQsv0OBoVC+b/2+++oEBHjsU4bJg3wjX4Ak4CZlKR3Ra9NNf8i
MRYLTmO90diDGwdYgq3OhW9YavjgxgNj9dZBJ/UZm8jer6TFwxvXFUWod+z5FOD1
x0fgWZQ7UfvWHRTT73diCspmoP5CmqyE0rjoHHe3U/FfLWvPyXeqhBsy2UN8f0wJ
2+OjIKcDcI448nVhS7q0/s9nRJCSrUadiTgsOkK+M2J9enFDJlVanfzJJ3IxOVo+
1mr1rWzac+hwvC96vs7IYNY39MwaACks80qtHnsF+iTtK+HmU/GSY1fnfx0noFb5
odTDvTJU3kZGTBrnMyRo/AGj4rxlWBB7fccHRH70z3l3iYX1RqZ07dglweSlYIIE
zqn7oqPOzXX5nhrCKXc0jrig9LMRrwrht8ybf3lpr8HOnw6GKhEqmNYtBmmDIy7Q
wtG1t18CRbX0jIxf0hk+
=HEI3
-----END PGP SIGNATURE-----

前面是文件的SHA256值,后面是对sha256值的签名

导入signing key

导入开发者们的公钥 gpg --import ../bitcoin/contrib/gitian-downloader/*

验证签名

gpg --verify SHA256SUMS.asc

也可以用这个脚本 验证

bitcoin/contrib/verifysfbinaries/verify.sh bitcoin-core-0.11.2
参数格式为
[bitcoin-]<version>-[rc[0-9]] (example: bitcoin-core-0.11.0-rc1)

验证sha256sum

通过签名pgp验证我们可以确定这些sha256值确实是开发者发布的,然后检查文件的sha256值

windows下验证sha256sum

可以用http://implbits.com/products/hashtab/ 计算sha256值

linux下验证sha256sum

sha256sum bitcoin-0.11.2-linux64.tar.gz

如果结果和SHA256SUMS.asc里显示的hash值一样,就说明下载文件和发布文件的是一样的

Mac OS下验证sha256sum

shasum -a 256 bitcoin-0.11.2-osx.dmg

交叉编译

交叉编译可以让你linux下编译windows, osx程序,也可以让你在x86的linux机器上编译arm/mips/ppc等版本的程序

自己编译依赖的库

进行交叉编译前需要编译需要的依赖库

编译步骤

1. 首先需要下载bitcoin编译需要的库的代码,bitcoin.org上有编译bitcoin依赖库的源代码下载,进入depends目录执行

  • make download: 下载依赖的所有库的源代码

  • make download-osx: 仅仅下载编译osx版本依赖的所有库的源代码,注意由于mac sdk的版权问题,并没有提供给普通用户下载,需要的自行寻找,也可以用如下方式自己构建

1.注册苹果开发者帐号, 然后下载 Xcode 6.1.1 dmg
https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/xcode_6.1.1/xcode_6.1.1.dmg
2.把其中的SDK打包:
 $ tar -C /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ -czf MacOSX10.9.sdk.tar.gz MacOSX10.9.sdk
  • make download-win: 仅仅下载编译win版本依赖的所有库的源代码

  • make download-linux: 仅仅下载编译linux版本依赖的所有库的源代码

    当然也可以者自己去其他网站下载

2. 安装需要的编译环境

安装各种需要编译器工具比如 windows

安装交叉编译windows版本需要的编译

sudo apt-get install g++-mingw-w64-i686 mingw-w64-i686-dev g++-mingw-w64-x86-64 mingw-w64-x86-64-dev

参考 https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.md

3. 设置交叉编译环境

编译器下载和安装相关patch后,开始设置编译环境

把工具链的路径加入PATH
export PATH=$PATH:<crosstoool path>
设置HOST,比如OSX
export HOST=x86_64-apple-darwin11
或者其他HOST的值
HOST=x86_64-w64-mingw32
HOST=i686-w64-mingw32
HOST=arm-linux-gnueabihf
HOST=mips-linux-gnu
HOST=powerpc-linux-gnu

4. 交叉编译依赖的库

make SOURCES_PATH=/opt/build/libsrc  BASE_CACHE=/opt/build/cache/arm-linux-gnueabihf/ HOST=arm-linux-gnueabihf DEBUG=1 NO_QT=1 NO_WALLET=1 -j
 make PACKAGES="mips-linux-gnu" HOST=mips-linux-gnu DEBUG=1 NO_QT=1 NO_WALLET=1 -j

一些下载和编译库源码时可修改的环境变量列表

SOURCES_PATH: 库的源代码路径
BASE_CACHE: 编译好的库将会在这里
SDK_PATH: sdk的路径,只有osx需要
FALLBACK_DOWNLOAD_PATH: 如果下载失败,可以试试这个路径
NO_QT: 不下载和编译QT和相关的库
NO_WALLET: 不下载和编译钱包相关的库
NO_UPNP: 不下载和编译UPNP相关的库
DEBUG: 关闭优化方便调试

5. 交叉编译bitcoind

交叉编译windows 32 bit版本

使用--prefix 指定签名编译出库的路径

cd depends
make HOST=i686-w64-mingw32 -j4
cd ..
/autogen.sh
./configure --prefix=`pwd`/depends/i686-w64-mingw32
make

交叉编译windows 64 bit版本

cd depends
make HOST=x86_64-w64-mingw32 -j4
cd ..
/autogen.sh
./configure --prefix=`pwd`/depends/x86_64-w64-mingw32
make

交叉编译MIPS/ARM/PPC 版本的bitcoind

如果你是在debian的MIPS/ARM/PPC版本或者ubuntu的ARM版本上编译的话,直接按照文档doc/build-unix.md编译即可. 下面是基基于ubuntu linux的cross编译方式

arm编译器

debian和ubuntu目前大发行版和可以直接安装arm版本的编译器 apt-get install g++-arm-linux-gnueabi apt-get install g++-arm-linux-gnueabihf 硬浮点版本

或者也可以使用 http://www.codesourcery.com/sgpp/lite/arm/portal/package7853/public/arm-none-linux-gnueabi/arm-2010.09-50-arm-none-linux-gnueabi.bin

http://sources.buildroot.net/arm-2013.11-33-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

http://p2sh.net/lib/list/arm-2013.11-33-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

树莓派的交叉编译环境

如果你试图在树莓派上直接编译bitcoin的代码也是可以的,按照liunx的方式安装相关库,然后编译就可以,但是由于树莓派的配置较低,编译是个非常缓慢的过程,如果想试试这里有一些参考:

http://blog.pryds.eu/2014/06/compile-bitcoin-core-on-raspberry-pi.html https://bitcointalk.org/index.php?topic=633347.0 Bitcoind 0.9.1 on RaspberryPi

但是如果你使用交叉编译的方式,那就相对快很多

下载工具链

https://github.com/raspberrypi/tools/archive/master.tar.gz

解压工具包, 设置路径

export PATH=$PATH:<tool path>

编译

cd depends
make  PACKAGES="arm-linux-gnueabihf"   HOST=arm-linux-gnueabihf DEBUG=1 NO_QT=1 NO_WALLET=1 -j5
cd ..
./configure --with-incompatible-bdb  --with-gui=no --prefix=/bitcoin/depends/arm-linux-gnueabihf --disable-silent-rules
make -j5

编译好了传到树莓派上即可运行,也可以用qemu 运行

ppc

https://sourcery.mentor.com/GNUToolchain/package8715/public/mips-linux-gnu/mips-2011.03-53-mips-linux-gnu-i686-pc-linux-gnu.tar.bz2

openssl的库支持ppc编译需要的patch

https://github.com/bitcoin/bitcoin/commit/2798e0b0d2e277ff611d2731e2746c8959bcd18c

编译过程同ARM

mips

https://sourcery.mentor.com/GNUToolchain/package8715/public/mips-linux-gnu/mips-2011.03-53-mips-linux-gnu-i686-pc-linux-gnu.tar.bz2

1.58版本boost库有个问题,不能在mips下正确编译,可以使用这个patch bitcoin/bitcoin#6937 或者升级1.59版本

编译过程同ARM

各种发行版

构建windows和OSX安装包由gitian构建

各种linux发行版

ubuntu

ubuntubitcoin目前由blutematt维护 https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin

debian

debian的在 https://packages.debian.org/sid/main/bitcoin-qt

gentoo

gentoo的版本由luke 维护,但是他的版本和标准的有些不同,加入了一些自己的patch,比如会过滤掉一些他不喜欢的基于bitcoin的二代币,具体的列表可以看这里: https://github.com/gentoo/gentoo/pull/374/files

基于自己构建的工具链

如果基于自己构建的工具链编译,注意设置PACKAGES和HOST的值

static 编译

在一些老的linux发行版或者嵌入式linux环境上运行bitcoind依赖的库可能布存在,或者有兼容性问题,这时候需要静态链接,需要给libtool传递-static-all,相关的配置

--enable-glibc-back-compat --enable-reduce-exports

Enable binary releases to work on older Linux distros without a static link 参考 bitcoin/bitcoin#4042

目前bitcoin 可以支持编译为静态库和动态库,但是只能做些简单的验证,这里有些绑定实现

bitpay曾经发过一个patch可以把整个bitcoin core编译为一个库,可以参考

https://github.com/bitcoin/bitcoin/pull/5084
https://github.com/chjj/bitcoin/commits/libbitcoind
最新的patch在这里
https://github.com/bitpay/bitcoind.js/blob/master/etc/bitcoin.patch

其他

编译器支持

默认是gcc,如果要使用clang,如下

export CC=clang
export CXX=clang++

clang 安装 http://llvm.org/apt/

编译时间度量

https://gist.github.com/laanwj/108877a28ec03836568a

库下载

找不到相关库的可以去这两个地方里找找

http://source.blkdb.com/lib/
http://p2sh.net/lib/list
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment