bitcoin-build system gitian

website
github

ubuntu 16.04

this is working

docker

SET UP THE REPOSITORY
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
should be response
pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

INSTALL DOCKER CE
sudo apt-get update
sudo apt-get install docker-ce

verify docker installation
sudo docker run hello-world

// isntall ruby
sudo apt-get install ruby-full

// solve permission denied issue
sudo chmod a+rwx /var/run/docker.sock
sudo chmod a+rwx /var/run/docker.pid

git clone git://github.com/devrandom/gitian-builder.git
mkdir gitian-builder/inputs
cd gitian-builder/inputs
wget -O miniupnpc-1.6.tar.gz 'http://miniupnp.tuxfamily.org/files/download.php?file=miniupnpc-1.6.tar.gz'
wget 'http://fukuchi.org/works/qrencode/qrencode-3.2.0.tar.bz2'
# Inputs for Win32: (Linux has packages for these)
wget 'https://downloads.sourceforge.net/project/boost/boost/1.52.0/boost_1_52_0.tar.bz2'
wget 'http://www.openssl.org/source/openssl-1.0.1g.tar.gz'
wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz'
wget 'https://downloads.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz'
wget 'https://downloads.sourceforge.net/project/libpng/libpng15/older-releases/1.5.9/libpng-1.5.9.tar.gz'
wget 'http://releases.qt-project.org/qt4/source/qt-everywhere-opensource-src-4.8.7.tar.gz'

need modify make-base-vm add linux 32bit support

if [ -n "$DOCKER_IMAGE_HASH" ]; then
base_image="$DISTRO@sha256:$DOCKER_IMAGE_HASH"
OUT=base-$DOCKER_IMAGE_HASH-$ARCH
else
if [ $ARCH = "i386" ]; then
base_image="i386/$DISTRO:$SUITE"
else
base_image="$DISTRO:$SUITE"
fi
fi

bin/make-base-vm --docker --arch amd64 --suite bionic
bin/make-base-vm --docker --arch i386 --suite bionic

export USE_DOCKER=1

// build linux approximately 30min mbp 2015
./bin/gbuild -j4 --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/gitian.yml

// build from github source.
./bin/gbuild -j4 --commit primecoin=HEAD ../primecoin/contrib/gitian-descriptors/gitian_remote.yml

// build windows depends only need build once
./bin/gbuild -j3 --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/boost-win64.yml
./bin/gbuild -j4 --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/deps-win64.yml
./bin/gbuild -j4 --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/qt-win64.yml

./bin/gbuild -j4 --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/boost-win32.yml
./bin/gbuild -j4 --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/deps-win32.yml
./bin/gbuild -j4 --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/qt-win32.yml

// if run in mac need modify gbuild line 147 date parameters is different with linux
author_date = `cd inputs/#{dir} && v2=$(git log --format=%at -1) && date -r $v2 +'%Y-%m-%d %H:%M:%S'`.strip

If you use local code build need modify code path in *.yml
./bin/gbuild --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/gitian-win64.yml

./bin/gbuild --commit primecoin=v0.1.4xpm ../primecoin/contrib/gitian-descriptors/gitian-win32.yml

debug build environment

PATH="libexec:$PATH"
start-target 64 bionic-amd64

this is not working due to network problem

sudo apt-get install lxc
after install need reboot, and check ifconfig should be
lxcbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.0.3.1 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:16:3e:00:00:00 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

then set environment variable
export USE_LXC=1
export LXC_BRIDGE=lxcbr0 <-- your interface name

Valid IP is only 10.0.2.2
sudo ifconfig lxcbr0 10.0.2.2

bin/make-base-vm --lxc --arch amd64 --suite bionic
bin/make-base-vm --lxc --arch i386 --suite bionic


I: Validating subversion 1.9.7-4ubuntu1
E: Couldn't download packages: tar libmpfr6 perl-modules-5.26 libgcc-7-dev shared-mime-info
tyler@ubuntu:~/Documents/gitian-builder$



mac

use LXC

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
brew install lxc


sudo ln -s /usr/local/bin/gsha256sum /usr/local/bin/sha256sum
sudo ln -s /usr/local/bin/gsha512sum /usr/local/bin/sha512sum

./bin/gbuild ../primecoin/contrib/gitian-descriptors/boost-win32.yml
brew install ruby coreutils
export PATH=$PATH:/opt/local/libexec/gnubin

// 使用 docker 需要替换一下国内的源节点,不然太慢了
ENV DEBIAN_FRONTEND=noninteractive
# modify to custom china source
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

sudo apt-get install docker-ce

bin/make-base-vm --docker --arch amd64 --suite precise
bin/make-base-vm --docker --arch i386 --suite precise

bin/make-base-vm --docker --arch amd64 --suite bionic
bin/make-base-vm --docker --arch i386 --suite bionic



新建目录:
gitian-builder/inputs

export USE_DOCKER=1
./bin/gbuild ../primecoin/contrib/gitian-descriptors/boost-win64-new.yml
./bin/gbuild ../primecoin/contrib/gitian-descriptors/deps-win64-new.yml
./bin/gbuild ../primecoin/contrib/gitian-descriptors/qt-win64-new.yml

指定一个 commit id 用来 build
./bin/gbuild --commit primecoin=16fe6893cc29facaeb0d200e137fa1b1f43fa816 ../primecoin/contrib/gitian-descriptors/qt-win64-new.yml

ubuntu 16.04

./configure –prefix= –enable-static –disable-shared

QR_PREFIX=/home/tyler/Documents/primecoin/deps/qrencode-3.4.4/build_unix
./configure –prefix=/home/tyler/Documents/primecoin/deps/qrencode-3.4.4/build_unix –enable-static –disable-shared

qmake INCLUDEPATH=”/home/tyler/Documents/primecoin/deps/qrencode-3.4.4/build_unix/include” LIBS=”-L/home/tyler/Documents/primecoin/deps/qrencode-3.4.4/build_unix/lib”

注意-lssl -lcrypto要写在-ldl -lpthread前面,这四个必须要。

-lQtGui -lQtNetwork -lQtCore
/usr/bin/ld: /usr/lib/i386-linux-gnu/libcrypto.a(dso_dlfcn.o): undefined reference to symbol ‘dladdr@@GLIBC_2.0’
//lib/i386-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Makefile:310: recipe for target ‘primecoin-qt’ failed
make: *** [primecoin-qt] Error 1

Gitian is an open source software program that offers what is known as a “build environment.” A build environment is perhaps best described as a “computer within a computer,” but with a specific purpose: a virtual space to compile binaries, completely free of any variables. “Gitian Building,” the process of compiling binaries in Gitian, ensures that whatever computer is used, the binaries turn out exactly the same.

This, in turn, enables different developers to reliably cross check their binaries against each other. And, of course, it allows anyone else to verify whether the binaries match the source code as well.

sudo apt-get update
sudo apt-get upgrade

sudo apt-get install ruby apache2 git apt-cacher-ng python-vm-builder qemu-kvm

- 安装 mingw-w64
use g++ to compile

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

安装完成后,mingw-gcc和mingw-g++默认使用的线程模型是win32的,但是我们需要使用posix的线程模型,因此分别执行以下命令,然后将工具链指向带-posix后缀的工具链

sudo update-alternatives –config x86_64-w64-mingw32-gcc
sudo update-alternatives –config x86_64-w64-mingw32-g++
sudo update-alternatives –config x86_64-w64-mingw32-gfortran
sudo update-alternatives –config x86_64-w64-mingw32-gnat

sudo update-alternatives –config i686-w64-mingw32-gcc
sudo update-alternatives –config i686-w64-mingw32-g++
sudo update-alternatives –config i686-w64-mingw32-gfortran
sudo update-alternatives –config i686-w64-mingw32-gnat

执行上面这一步后会让你选择,我们选择x86_64-w64-mingw32-g++-posix.

编译工具链所在的目录以及gcc文件前缀为:
/usr/bin/x86_64-w64-mingw32-

x86_64-w64-mingw32 64bit compile
i686-w64-mingw32 32bit compile


// 检查
sudo service apt-cacher-ng status # Should return apt-cacher-ng is running
ls -l /dev/kvm # Should show a /dev/kvm device

git clone git://github.com/devrandom/gitian-builder.git
mkdir gitian-builder/inputs
cd gitian-builder/inputs

# Inputs for Linux and Win32:
wget -O miniupnpc-1.6.tar.gz 'http://miniupnp.tuxfamily.org/files/download.php?file=miniupnpc-1.9.20150206.tar.gz'

wget -O miniupnpc-1.6.tar.gz 'http://miniupnp.tuxfamily.org/files/download.php?file=miniupnpc-1.6.tar.gz'
wget 'https://fukuchi.org/works/qrencode/qrencode-3.2.0.tar.bz2'

wget 'https://fukuchi.org/works/qrencode/qrencode-3.4.4.tar.gz'

# Inputs for Win32: (Linux has packages for these)
wget 'https://downloads.sourceforge.net/project/boost/boost/1.50.0/boost_1_50_0.tar.bz2'
wget 'http://www.openssl.org/source/openssl-1.0.1g.tar.gz'
wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz'
wget 'https://downloads.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz'
wget 'https://sourceforge.net/projects/libpng/files/libpng16/older-releases/1.6.16/libpng-1.6.16.tar.gz/download'
wget 'http://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz'
cd ../..

need install newly vmbuilder
https://github.com/newroco/vmbuilder
sudo python setup.py install

cd gitian-builder
bin/make-base-vm --arch amd64 --suite xenial
bin/make-base-vm --arch i386 --suite xenial

bin/make-base-vm --arch amd64 --suite precise
bin/make-base-vm --arch i386 --suite precise

./libexec/make-clean-vm --arch amd64 --suite xenial
./libexec/make-clean-vm --arch i386 --suite xenial

bin/make-base-vm --arch i386 --suite precise
bin/make-base-vm --arch amd64 --suite precise
cd ..

modify primecoin/contrib/gitian-descriptors/gitian*.yml

suites:
- "lucid"
改成
- "xenial"

修改里面的依赖文件的版本为实际的版本。

# Build Linux release:
cd bitcoin
git pull
cd ../gitian-builder
git pull
sudo ./bin/gbuild --commit primecoin=HEAD ../primecoin/contrib/gitian-descriptors/gitian.yml

sudo ./bin/gbuild ../primecoin/contrib/gitian-descriptors/gitian.yml

# Build Win32 dependencies: (only needs to be done once, or when dependency versions change)
./bin/gbuild ../primecoin/contrib/gitian-descriptors/boost-win32.yml

./bin/gbuild --commit primecoin=HEAD ../primecoin/contrib/gitian-descriptors/boost-win32.yml
./bin/gbuild --commit primecoin=HEAD ../primecoin/contrib/gitian-descriptors/deps-win32.yml
./bin/gbuild --commit primecoin=HEAD ../primecoin/contrib/gitian-descriptors/qt-win32.yml

# Build Win32 release:
./bin/gbuild --commit primecoin=HEAD ../primecoin/contrib/gitian-descriptors/gitian-win32.yml