Enable Cross-Compiling support

1. To use this feature, set CC and CXX env variables to the appropriate cross compiler
2. Example, for cross compiling to ARM, use: CC=arm-linux-gnueabihf-gcc-4.9 CXX=arm-linux-gnueabihf-g++-4.9 npm install
3. You can still compile without setting CC and CXX, you can still just run npm install
This commit is contained in:
Chris Kleeschulte 2016-02-09 14:32:51 -05:00
parent 53735025dd
commit 4894f1abec
6 changed files with 55 additions and 27 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-*. 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

@ -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)