Merge pull request #408 from kleetus/feature/cross_compiling_support

Enable Cross-Compiling support
This commit is contained in:
Braydon Fuller 2016-02-11 11:12:18 -05:00
commit c988fdc64d
8 changed files with 85 additions and 28 deletions

View File

@ -1,9 +1,10 @@
#!/bin/bash #!/bin/bash
root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.." root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.."
options=`cat ${root_dir}/bin/config_options.sh` options=`cat ${root_dir}/bin/config_options.sh`
host=$(${root_dir}/bin/variables.sh host) || exit -1
depends_dir=$($root_dir/bin/variables.sh depends_dir) depends_dir=$($root_dir/bin/variables.sh depends_dir)
host=$(${root_dir}/bin/variables.sh host)
btc_dir="${root_dir}/libbitcoind" btc_dir="${root_dir}/libbitcoind"
sys=$($root_dir/bin/variables.sh sys)
patch_sha=$($root_dir/bin/variables.sh patch_sha) patch_sha=$($root_dir/bin/variables.sh patch_sha)
config_lib_dir=$($root_dir/bin/variables.sh config_lib_dir) config_lib_dir=$($root_dir/bin/variables.sh config_lib_dir)
export CPPFLAGS="-I${depends_dir}/${host}/include/boost -I${depends_dir}/${host}/include -L${depends_dir}/${host}/lib" export CPPFLAGS="-I${depends_dir}/${host}/include/boost -I${depends_dir}/${host}/include -L${depends_dir}/${host}/lib"
@ -51,7 +52,7 @@ compare_patch () {
cache_files () { cache_files () {
cache_file="${root_dir}"/cache/cache.tar cache_file="${root_dir}"/cache/cache.tar
pushd "${btc_dir}" || exit -1 pushd "${btc_dir}" || exit -1
find . -type f \( -name "*.h" -or -name "*.hpp" -or -name \ find src depends/${host} -type f \( -name "*.h" -or -name "*.hpp" -or -name \
"*.ipp" -or -name "*.a" \) | tar -cf "${cache_file}" -T - "*.ipp" -or -name "*.a" \) | tar -cf "${cache_file}" -T -
if test $? -ne 0; then if test $? -ne 0; then
echo "We were trying to copy over your cached artifacts, but there was an issue." echo "We were trying to copy over your cached artifacts, but there was an issue."
@ -154,7 +155,8 @@ apply the current patch from "${root_dir}"/etc/bitcoin.patch? (y/N): "
echo './autogen.sh' echo './autogen.sh'
./autogen.sh || exit -1 ./autogen.sh || exit -1
full_options="${options} ${config_lib_dir}" config_host="--host ${host}"
full_options="${options} ${config_host} ${config_lib_dir}"
echo "running the configure script with the following options:\n :::[\"${full_options}\"]:::" echo "running the configure script with the following options:\n :::[\"${full_options}\"]:::"
${full_options} ${full_options}
@ -181,4 +183,5 @@ if test x"$1" = x'debug'; then
debug=--debug debug=--debug
fi fi
node-gyp ${debug} rebuild echo "running::: 'node-gyp ${sys} ${debug} rebuild'"
node-gyp ${sys} ${debug} rebuild

View File

@ -1,10 +1,12 @@
'use strict'; 'use strict';
var execSync = require('child_process').execSync;
function getTarballName() { function getTarballName() {
var packageRoot = __dirname + '/..'; var packageRoot = __dirname + '/..';
var version = require(packageRoot + '/package.json').version; var version = require(packageRoot + '/package.json').version;
var platform = process.platform; var platform = process.platform;
var arch = process.arch; var arch = execSync(packageRoot + '/bin/variables.sh arch').toString();
var abi = process.versions.modules; var abi = process.versions.modules;
var tarballName = 'libbitcoind-' + version + '-node' + abi + '-' + platform + '-' + arch + '.tgz'; var tarballName = 'libbitcoind-' + version + '-node' + abi + '-' + platform + '-' + arch + '.tgz';
return tarballName; return tarballName;

View File

@ -2,7 +2,7 @@
var exec = require('child_process').exec; var exec = require('child_process').exec;
var bindings = require('bindings'); var bindings = require('bindings');
var index = require('../'); var index = require('../lib');
var log = index.log; var log = index.log;
var packageRoot = bindings.getRoot(bindings.getFileName()); var packageRoot = bindings.getRoot(bindings.getFileName());

View File

@ -3,7 +3,7 @@
var fs = require('fs'); var fs = require('fs');
var AWS = require('aws-sdk'); var AWS = require('aws-sdk');
var bindings = require('bindings'); var bindings = require('bindings');
var index = require('../'); var index = require('../lib');
var log = index.log; var log = index.log;
var config = require(process.env.HOME + '/.bitcore-node-upload.json'); var config = require(process.env.HOME + '/.bitcore-node-upload.json');

View File

@ -8,18 +8,37 @@ fi
bitcoin_dir="${root_dir}"/libbitcoind bitcoin_dir="${root_dir}"/libbitcoind
cache_dir="${root_dir}"/cache cache_dir="${root_dir}"/cache
host= get_host_and_platform () {
compute_host () {
platform=`uname -a | awk '{print tolower($1)}'` platform=`uname -a | awk '{print tolower($1)}'`
arch=`uname -m` arch=`uname -m`
if [ "${arch:0:3}" == "arm" ]; then if [ "${arch:0:3}" == "arm" ]; then
host="arm-linux-gnueabihf" platform="linux-gnueabihf"
else arch="arm"
host="${arch}"-"${platform}" fi
if [ -n "${CXX}" ] && [ -n "${CC}" ]; then
cc_target=$("${CC}" -v 2>&1 | awk '/Target:/ {print $2}')
cxx_target=$("${CXX}" -v 2>&1 | awk '/Target:/ {print $2}')
IFS='-' read -ra SYS <<< "${cc_target}"
if [ "${SYS[0]}" != "${arch}" ]; then
if [ -n "${SYS[1]}" ] && [ -n "${SYS[2]}" ] && hash "${CXX}" && hash "${CC}" && [ -n "${cc_target}" ] && [ -n "${cxx_target}" ]; then
#try and see if we've got a cross compiler, if not then auto detect
arch="${SYS[0]}"
platform="${SYS[1]}"-"${SYS[2]}"
else
error_message="You've specified a cross compiler, but we could not compute the host-platform-triplet for cross compilation. Please set CC and CXX environment variables with host-platform-triplet-*. Also ensure the cross compiler exists on your system and is available on your path. Example: CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++"
return_error_message
fi
fi
fi fi
} }
compute_host return_error_message () {
echo "${error_message}"
exit -1
}
get_host_and_platform
host="${arch}"-"${platform}"
mac_response= mac_response=
check_mac_build_system () { check_mac_build_system () {
@ -115,6 +134,10 @@ if test -z "$1" -o x"$1" = x'host'; then
echo -n "${host}" echo -n "${host}"
fi fi
if test -z "$1" -o x"$1" = x'arch'; then
echo -n "${arch}"
fi
if test -z "$1" -o x"$1" = x'bdb'; then if test -z "$1" -o x"$1" = x'bdb'; then
if [ "${BITCORENODE_ENV}" == "test" ]; then if [ "${BITCORENODE_ENV}" == "test" ]; then
echo -n "${cache_dir}"/depends/"${host}"/lib/libdb_cxx.a echo -n "${cache_dir}"/depends/"${host}"/lib/libdb_cxx.a
@ -144,6 +167,12 @@ if test -z "$1" -o x"$1" = x'wallet_enabled'; then
fi fi
fi fi
if test -z "$1" -o x"$1" = x'sys'; then
if [ -n "${SYS}" ]; then
echo -n "--arch=${SYS[0]}"
fi
fi
if test -z "$1" -o x"$1" = x'bitcoind'; then if test -z "$1" -o x"$1" = x'bitcoind'; then
echo -n "${cache_dir}"/src/.libs/libbitcoind.a echo -n "${cache_dir}"/src/.libs/libbitcoind.a
fi fi

View File

@ -80,6 +80,34 @@ And finally run the build which will take several minutes. A script in the "bin"
npm install npm install
``` ```
## Cross Compilation
If you desire to cross compile to ARM or Windows from a system that has cross compilation tools available for use, please use the following directions:
Using a Debian (Jessie) system as the host system (the system that will be doing the compiling):
```bash
echo -n "deb http://emdebian.org/tools/debian/ jessie main" | sudo tee -a /etc/apt/sources.list
sudo dpkg --add-architecture armhf #or whatever arch you are interested in compiling for
sudo apt-get update #you will get GPG KEY warnings, you can decide if you would like to trust the key
sudo apt-get install crossbuild-essential-armhf
```
Next is to use the cross compilation toolchain instead of the defaults:
```bash
CXX=arm-linux-gnueabihf-g++ CC=arm-linux-gnueabihf-gcc npm install
```
The only thing different is the setting of CC/CXX environment variables. Please make sure those compilers (arm-linux-gnueabihf-gcc) actually exist and are on your path.
```bash
arm-linux-gnueabihf-g++ -v
arm-linux-gnueabihf-gcc -v
```
You should get output with the last line ending with something like this:
gcc version 4.9.2 ( 4.9.2-10)
Once everything is built, you can run bitcore-node via: Once everything is built, you can run bitcore-node via:
```bash ```bash

View File

@ -163,23 +163,21 @@ index e7aa48d..df0f7ae 100644
endef endef
diff --git a/src/Makefile.am b/src/Makefile.am diff --git a/src/Makefile.am b/src/Makefile.am
index 2461f82..7be6d6e 100644 index 2461f82..e7e9ecf 100644
--- a/src/Makefile.am --- a/src/Makefile.am
+++ b/src/Makefile.am +++ b/src/Makefile.am
@@ -1,6 +1,12 @@ @@ -1,6 +1,10 @@
DIST_SUBDIRS = secp256k1 DIST_SUBDIRS = secp256k1
AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS)
+noinst_LTLIBRARIES = +noinst_LTLIBRARIES =
+libbitcoind_la_LIBADD = +libbitcoind_la_LIBADD =
+libbitcoind_la_LDFLAGS = -no-undefined +libbitcoind_la_LDFLAGS = -no-undefined
+STATIC_BOOST_LIBS = +STATIC_EXTRA_LIBS = $(LIBLEVELDB) $(LIBMEMENV)
+STATIC_BDB_LIBS =
+STATIC_EXTRA_LIBS = $(STATIC_BOOST_LIBS) $(LIBLEVELDB) $(LIBMEMENV)
if EMBEDDED_LEVELDB if EMBEDDED_LEVELDB
LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include
@@ -49,16 +55,16 @@ BITCOIN_INCLUDES += $(BDB_CPPFLAGS) @@ -49,16 +53,16 @@ BITCOIN_INCLUDES += $(BDB_CPPFLAGS)
EXTRA_LIBRARIES += libbitcoin_wallet.a EXTRA_LIBRARIES += libbitcoin_wallet.a
endif endif
@ -203,7 +201,7 @@ index 2461f82..7be6d6e 100644
if BUILD_BITCOIND if BUILD_BITCOIND
bin_PROGRAMS += bitcoind bin_PROGRAMS += bitcoind
endif endif
@@ -66,6 +72,9 @@ endif @@ -66,6 +70,9 @@ endif
if BUILD_BITCOIN_UTILS if BUILD_BITCOIN_UTILS
bin_PROGRAMS += bitcoin-cli bitcoin-tx bin_PROGRAMS += bitcoin-cli bitcoin-tx
endif endif
@ -213,7 +211,7 @@ index 2461f82..7be6d6e 100644
.PHONY: FORCE .PHONY: FORCE
# bitcoin core # # bitcoin core #
@@ -170,8 +179,11 @@ obj/build.h: FORCE @@ -170,8 +177,11 @@ obj/build.h: FORCE
@$(MKDIR_P) $(builddir)/obj @$(MKDIR_P) $(builddir)/obj
@$(top_srcdir)/share/genbuild.sh $(abs_top_builddir)/src/obj/build.h \ @$(top_srcdir)/share/genbuild.sh $(abs_top_builddir)/src/obj/build.h \
$(abs_top_srcdir) $(abs_top_srcdir)
@ -226,7 +224,7 @@ index 2461f82..7be6d6e 100644
# server: shared between bitcoind and bitcoin-qt # server: shared between bitcoind and bitcoin-qt
libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(MINIUPNPC_CPPFLAGS) libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(MINIUPNPC_CPPFLAGS)
libbitcoin_server_a_SOURCES = \ libbitcoin_server_a_SOURCES = \
@@ -310,9 +322,18 @@ nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h @@ -310,9 +320,18 @@ nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h
bitcoind_SOURCES = bitcoind.cpp bitcoind_SOURCES = bitcoind.cpp
bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES) bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES)
bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
@ -245,17 +243,13 @@ index 2461f82..7be6d6e 100644
endif endif
bitcoind_LDADD = \ bitcoind_LDADD = \
@@ -327,10 +348,21 @@ bitcoind_LDADD = \ @@ -327,10 +346,17 @@ bitcoind_LDADD = \
if ENABLE_WALLET if ENABLE_WALLET
bitcoind_LDADD += libbitcoin_wallet.a bitcoind_LDADD += libbitcoin_wallet.a
+STATIC_EXTRA_LIBS += $(STATIC_BDB_LIBS)
+libbitcoind_la_SOURCES += $(libbitcoin_wallet_a_SOURCES) +libbitcoind_la_SOURCES += $(libbitcoin_wallet_a_SOURCES)
endif endif
+STATIC_BOOST_LIBS += ../depends/$(ARCH_PLATFORM)/lib/libboost_filesystem-mt.a ../depends/$(ARCH_PLATFORM)/lib/libboost_system-mt.a ../depends/$(ARCH_PLATFORM)/lib/libboost_chrono-mt.a ../depends/$(ARCH_PLATFORM)/lib/libboost_thread-mt.a ../depends/$(ARCH_PLATFORM)/lib/libboost_program_options-mt.a
+STATIC_BDB_LIBS += ../depends/$(ARCH_PLATFORM)/lib/libdb_cxx.a
+
bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS)
-# -#
+libbitcoind_la_LIBADD += $(SSL_LIBS) $(LIBSECP256K1) $(CRYPTO_LIBS) $(STATIC_EXTRA_LIBS) +libbitcoind_la_LIBADD += $(SSL_LIBS) $(LIBSECP256K1) $(CRYPTO_LIBS) $(STATIC_EXTRA_LIBS)

View File

@ -3,13 +3,14 @@
var should = require('chai').should(); var should = require('chai').should();
var path = require('path'); var path = require('path');
var getTarballName = require('../../bin/get-tarball-name'); var getTarballName = require('../../bin/get-tarball-name');
var execSync = require('child_process').execSync;
describe('#getTarballName', function() { describe('#getTarballName', function() {
it('will return the expected tarball name', function() { it('will return the expected tarball name', function() {
var name = getTarballName(); var name = getTarballName();
var version = require(path.resolve(__dirname + '../../../package.json')).version; var version = require(path.resolve(__dirname + '../../../package.json')).version;
var platform = process.platform; var platform = process.platform;
var arch = process.arch; var arch = execSync(path.resolve(__dirname) + '/../../bin/variables.sh arch');
var abi = process.versions.modules; var abi = process.versions.modules;
var expected = 'libbitcoind-' + version + '-node' + abi + '-' + platform + '-' + arch + '.tgz'; var expected = 'libbitcoind-' + version + '-node' + abi + '-' + platform + '-' + arch + '.tgz';
name.should.equal(expected); name.should.equal(expected);