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支持,需要安装qt库
sudo apt-get install libqt4-dev libprotobuf-dev protobuf-compiler
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
sudo apt-get install libminiupnpc-dev
需4.x以上版本
sudo apt-get install libzmq3-dev
bitcoin的钱包是基于berkly DB实现的,但是这个数据库的新版本不兼容前面的版本,所以如果需要兼容旧的钱包
就要安老的的的BDB的库,如果你不需要兼容旧钱包,可以用--with-incompatible-bdb跳过这个
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
./configure --with-gui=no
--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)
--disable-zmq disable ZMQ notifications
--disable-wallet disable wallet (enabled by default)
--disable-tests do not compile tests (default is to compile)
--disable-bench do not compile benchmarks (default is to compile)
--enable-shared[=PKGS] build shared libraries [default=yes]
--enable-static[=PKGS] build static libraries [default=yes]
--eanble-debug 打开调试信息
--disable-silent-rules 打印编译信息
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
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
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
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-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可以运行在linux/osx上。
发布0.11.2时候仍然是基于ubuntu 12.04 构建的的 https://github.com/bitcoin/bitcoin/blob/master/doc/gitian-building.md
目前 master已经切换到14.04,
bitcoin/bitcoin#6900 https://github.com/laanwj/bitcoin/commits/2015_10_gitian_trusty
在 Mac上运行 gitian参考 http://gavintech.blogspot.jp/2014/02/gitian-building-bitcoin-releases.html
发布编译打包签名等的流程 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值的签名
导入开发者们的公钥 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)
通过签名pgp验证我们可以确定这些sha256值确实是开发者发布的,然后检查文件的sha256值
可以用http://implbits.com/products/hashtab/ 计算sha256值
sha256sum bitcoin-0.11.2-linux64.tar.gz
如果结果和SHA256SUMS.asc里显示的hash值一样,就说明下载文件和发布文件的是一样的
shasum -a 256 bitcoin-0.11.2-osx.dmg
交叉编译可以让你linux下编译windows, osx程序,也可以让你在x86的linux机器上编译arm/mips/ppc等版本的程序
进行交叉编译前需要编译需要的依赖库
-
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版本依赖的所有库的源代码
当然也可以者自己去其他网站下载
安装各种需要编译器工具比如 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
编译器下载和安装相关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
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: 关闭优化方便调试
使用--prefix 指定签名编译出库的路径
cd depends
make HOST=i686-w64-mingw32 -j4
cd ..
/autogen.sh
./configure --prefix=`pwd`/depends/i686-w64-mingw32
make
cd depends
make HOST=x86_64-w64-mingw32 -j4
cd ..
/autogen.sh
./configure --prefix=`pwd`/depends/x86_64-w64-mingw32
make
如果你是在debian的MIPS/ARM/PPC版本或者ubuntu的ARM版本上编译的话,直接按照文档doc/build-unix.md编译即可. 下面是基基于ubuntu linux的cross编译方式
debian和ubuntu目前大发行版和可以直接安装arm版本的编译器 apt-get install g++-arm-linux-gnueabi apt-get install g++-arm-linux-gnueabihf 硬浮点版本
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 运行
openssl的库支持ppc编译需要的patch
https://github.com/bitcoin/bitcoin/commit/2798e0b0d2e277ff611d2731e2746c8959bcd18c
编译过程同ARM
1.58版本boost库有个问题,不能在mips下正确编译,可以使用这个patch bitcoin/bitcoin#6937 或者升级1.59版本
编译过程同ARM
ubuntubitcoin目前由blutematt维护 https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin
debian的在 https://packages.debian.org/sid/main/bitcoin-qt
gentoo的版本由luke 维护,但是他的版本和标准的有些不同,加入了一些自己的patch,比如会过滤掉一些他不喜欢的基于bitcoin的二代币,具体的列表可以看这里: https://github.com/gentoo/gentoo/pull/374/files
如果基于自己构建的工具链编译,注意设置PACKAGES和HOST的值
在一些老的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 可以支持编译为静态库和动态库,但是只能做些简单的验证,这里有些绑定实现
- NBitcoin (.NET Bindings)
- node-libbitcoinconsensus (Node.js Bindings)
- java-libbitcoinconsensus (Java Bindings)
- bitcoinconsensus-php (PHP Bindings)
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