diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2014-01-21 08:52:52 +0100 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2014-01-21 08:55:07 +0100 |
commit | a682bc7e46f5a269fd8b6f58bdbe73384f6c76aa (patch) | |
tree | a9f1760e66b5ab730ad1d3ec25f7ade6d4e709b4 | |
parent | 1ab310e7df58476b4ad7242c190810315f40e6a2 (diff) | |
parent | 2041365c8c2d0f8e83715b2a643c3fd2cf6eb4cb (diff) |
Merge pull request #3242
2041365 Bugfix: Use BOOST_CPPFLAGS when testing for boost sleep vs sleep_for (Luke Dashjr)
e18e100 configure: Minor grammatical changes to be more clear (Luke Dashjr)
a9dbcf0 configure: Change --with[out]-qt to --with[out]-gui and add --with[out]-cli and --with[out]-daemon to support more build configurations (Luke Dashjr)
f472990 Bugfix: Correct captitalisation of Qt (Luke Dashjr)
f930341 configure: Internal changes to make building bitcoind and bitcoin-cli optional (Luke Dashjr)
4a290b5 Cleanup LevelDB library dependencies (Luke Dashjr)
9b4e03b Bugfix: Undefine _FORTIFY_SOURCE before redefining it, to avoid warnings on compilers that define it by default (Luke Dashjr)
123e4f8 Bugfix: configure: Allow user-provided CXXFLAGS to override default optimisation, debug, and warning flags (Luke Dashjr)
-rw-r--r-- | configure.ac | 93 | ||||
-rw-r--r-- | src/Makefile.am | 18 | ||||
-rw-r--r-- | src/Makefile.include | 15 | ||||
-rw-r--r-- | src/m4/bitcoin_qt.m4 | 36 |
4 files changed, 114 insertions, 48 deletions
diff --git a/configure.ac b/configure.ac index 9737b884b4..973f4398df 100644 --- a/configure.ac +++ b/configure.ac @@ -24,6 +24,12 @@ m4_include([pkg.m4]) dnl faketime breaks configure and is only needed for make. Disable it here. unset FAKETIME +if test "x${CXXFLAGS+set}" = "xset"; then + CXXFLAGS_overridden=yes +else + CXXFLAGS_overridden=no +fi + dnl ============================================================== dnl Setup for automake dnl ============================================================== @@ -92,7 +98,7 @@ AC_ARG_ENABLE([hardening], AC_ARG_ENABLE([ccache], [AS_HELP_STRING([--enable-ccache], - [enable building with ccache (default is yes if ccache is found)])], + [use ccache for building (default is yes if ccache is found)])], [use_ccache=$enableval], [use_ccache=auto]) @@ -134,7 +140,9 @@ PKG_PROG_PKG_CONFIG ## TODO: Remove these hard-coded paths and flags. They are here for the sake of ## compatibility with the legacy buildsystem. ## -CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" +if test "x$CXXFLAGS_overridden" = "xno"; then + CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" +fi CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" AC_LANG_PUSH([C++]) @@ -182,7 +190,9 @@ case $host in CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -D__USE_MINGW_ANSI_STDIO" LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE" - CXXFLAGS="$CXXFLAGS -w" + if test "x$CXXFLAGS_overridden" = "xno"; then + CXXFLAGS="$CXXFLAGS -w" + fi ;; *darwin*) TARGET_OS=darwin @@ -276,7 +286,12 @@ if test x$use_hardening != xno; then AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"]) AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"]) - AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"]) + AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[ + AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[ + HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE" + ]) + HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2" + ]) AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"]) AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"]) @@ -313,6 +328,14 @@ AC_TRY_COMPILE([#include <sys/socket.h>], [ AC_MSG_RESULT(no)] ) +LEVELDB_CPPFLAGS= +LIBLEVELDB= +LIBMEMENV= +AM_CONDITIONAL([EMBEDDED_LEVELDB],[true]) +AC_SUBST(LEVELDB_CPPFLAGS) +AC_SUBST(LIBLEVELDB) +AC_SUBST(LIBMEMENV) + if test x$enable_wallet != xno; then dnl Check for libdb_cxx only if wallet enabled BITCOIN_FIND_BDB48 @@ -423,6 +446,18 @@ if test x$boost_sleep != xyes; then AC_MSG_ERROR(No working boost sleep implementation found. If on ubuntu 13.10 with libboost1.54-all-dev remove libboost.1.54-all-dev and use libboost1.53-all-dev) fi +AC_ARG_WITH([cli], + [AS_HELP_STRING([--with-cli], + [with CLI (default is yes)])], + [build_bitcoin_cli=$withval], + [build_bitcoin_cli=yes]) + +AC_ARG_WITH([daemon], + [AS_HELP_STRING([--with-daemon], + [with daemon (default is yes)])], + [build_bitcoind=$withval], + [build_bitcoind=yes]) + BITCOIN_QT_INIT if test x$use_pkgconfig = xyes; then @@ -459,13 +494,21 @@ fi BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path) +AC_MSG_CHECKING([whether to build bitcoind]) +AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) +AC_MSG_RESULT($build_bitcoind) + +AC_MSG_CHECKING([whether to build bitcoin-cli]) +AM_CONDITIONAL([BUILD_BITCOIN_CLI], [test x$build_bitcoin_cli = xyes]) +AC_MSG_RESULT($build_bitcoin_cli) + dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) if test x$use_ipv6 = xyes; then dnl Check for ipv6 build requirements - AC_MSG_CHECKING(for IPV6 build support) + AC_MSG_CHECKING(for operating system IPv6 support) AC_TRY_LINK([ #if defined(_WINDOWS) #include <winsock2.h> @@ -480,18 +523,17 @@ if test x$use_ipv6 = xyes; then struct sockaddr_in6 addr; #endif int temp = socket(AF_INET6, SOCK_STREAM, 0);], - [AC_MSG_RESULT(yes); have_ipv6=yes; AC_DEFINE(HAVE_IPV6, 1, [Define this symbol if you have ipv6 build support])], + [AC_MSG_RESULT(yes); have_ipv6=yes; AC_DEFINE(HAVE_IPV6, 1, [Define this symbol if you have operating system IPv6 support])], [AC_MSG_RESULT(no)]; have_ipv6=no) fi AC_LANG_POP if test "x$use_ccache" != "xno"; then - AC_MSG_CHECKING(if ccache should be enabled) + AC_MSG_CHECKING(if ccache should be used) if test x$CCACHE = x; then if test "x$use_ccache" = "xyes"; then AC_MSG_ERROR([ccache not found.]); else - AC_MSG_NOTICE([ccache not found. Falling back to default CC]) use_ccache=no fi else @@ -513,32 +555,32 @@ else fi dnl enable ipv6 support -AC_MSG_CHECKING([if ipv6 should be enabled]) +AC_MSG_CHECKING([whether to build with support for IPv6]) if test x$have_ipv6 = xno; then if test x$use_ipv6 = xyes; then - AC_MSG_ERROR("ipv6 requested but cannot be built. use --disable-ipv6") + AC_MSG_ERROR([IPv6 requested, but cannot be built. use --disable-ipv6]) fi AC_MSG_RESULT(no) else if test x$use_ipv6 = xyes; then AC_MSG_RESULT(yes) - AC_DEFINE([USE_IPV6],[1],[Define if ipv6 support should be compiled in]) + AC_DEFINE([USE_IPV6],[1],[Define if IPv6 support should be compiled in]) else AC_MSG_RESULT(no) fi fi dnl enable upnp support -AC_MSG_CHECKING([if upnp should be enabled]) +AC_MSG_CHECKING([whether to build with support for UPnP]) if test x$have_miniupnpc = xno; then if test x$use_upnp = xyes; then - AC_MSG_ERROR("upnp requested but cannot be built. use --without-miniupnpc") + AC_MSG_ERROR("UPnP requested but cannot be built. use --without-miniupnpc") fi AC_MSG_RESULT(no) else if test x$use_upnp != xno; then AC_MSG_RESULT(yes) - AC_MSG_CHECKING([if upnp should be on by default]) + AC_MSG_CHECKING([whether to build with UPnP enabled by default]) use_upnp=yes upnp_setting=0 if test x$use_upnp_default != xno; then @@ -546,7 +588,7 @@ else upnp_setting=1 fi AC_MSG_RESULT($use_upnp_default) - AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[Define to 1 for upnp runtime support]) + AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[UPnP support not compiled if undefined, otherwise value (0 or 1) determines default state]) if test x$TARGET_OS = xwindows; then CPPFLAGS="$CPPFLAGS -DSTATICLIB" fi @@ -559,14 +601,14 @@ dnl these are only used when qt is enabled if test x$bitcoin_enable_qt != xno; then BUILD_QT=qt dnl enable dbus support - AC_MSG_CHECKING([if dbus should be enabled]) + AC_MSG_CHECKING([whether to build GUI with support for D-Bus]) if test x$bitcoin_enable_qt_dbus != xno; then AC_DEFINE([USE_DBUS],[1],[Define if dbus support should be compiled in]) fi AC_MSG_RESULT($bitcoin_enable_qt_dbus) dnl enable qr support - AC_MSG_CHECKING([if qr should be enabled]) + AC_MSG_CHECKING([whether to build GUI with support for QR codes]) if test x$have_qrencode = xno; then if test x$use_qr == xyes; then AC_MSG_ERROR("QR support requested but cannot be built. use --without-qrencode") @@ -586,16 +628,25 @@ if test x$bitcoin_enable_qt != xno; then AC_MSG_WARN("xgettext is required to update qt translations") fi - if test x$use_tests = xyes; then + AC_MSG_CHECKING([whether to build test_bitcoin-qt]) + if test x$use_tests$bitcoin_enable_qt_test = xyesyes; then + AC_MSG_RESULT([yes]) BUILD_TEST_QT="test" - if test x$bitcoin_enable_qt_test != xyes; then - AC_MSG_ERROR("QT Test lib not found. Use --disable-tests or --without-qt.") - fi + else + AC_MSG_RESULT([no]) fi fi +AC_MSG_CHECKING([whether to build test_bitcoin]) if test x$use_tests = xyes; then + AC_MSG_RESULT([yes]) BUILD_TEST="test" +else + AC_MSG_RESULT([no]) +fi + +if test "x$use_tests$build_bitcoind$use_qt" = "xnonono"; then + AC_MSG_ERROR([No targets! Please specify at least one of: --enable-cli --enable-daemon --enable-gui or --enable-tests]) fi AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) diff --git a/src/Makefile.am b/src/Makefile.am index 9917be2481..f27f16ab91 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,6 @@ include Makefile.include -AM_CPPFLAGS += -I$(top_srcdir)/src/leveldb/helpers/memenv \ - -I$(builddir) +AM_CPPFLAGS += -I$(builddir) noinst_LIBRARIES = \ libbitcoin_server.a \ @@ -11,7 +10,15 @@ if ENABLE_WALLET noinst_LIBRARIES += libbitcoin_wallet.a endif -bin_PROGRAMS = bitcoind bitcoin-cli +bin_PROGRAMS = + +if BUILD_BITCOIND + bin_PROGRAMS += bitcoind +endif + +if BUILD_BITCOIN_CLI + bin_PROGRAMS += bitcoin-cli +endif SUBDIRS = . $(BUILD_QT) $(BUILD_TEST) DIST_SUBDIRS = . qt test @@ -140,8 +147,8 @@ bitcoind_LDADD = \ libbitcoin_server.a \ libbitcoin_cli.a \ libbitcoin_common.a \ - leveldb/libleveldb.a \ - leveldb/libmemenv.a + $(LIBLEVELDB) \ + $(LIBMEMENV) if ENABLE_WALLET bitcoind_LDADD += libbitcoin_wallet.a endif @@ -167,6 +174,7 @@ if TARGET_WINDOWS bitcoin_cli_SOURCES += bitcoin-cli-res.rc endif +# NOTE: This dependency is not strictly necessary, but without it make may try to build both in parallel, which breaks the LevelDB build system in a race leveldb/libleveldb.a: leveldb/libmemenv.a leveldb/%.a: diff --git a/src/Makefile.include b/src/Makefile.include index b9e6c262ca..01b47d1aa0 100644 --- a/src/Makefile.include +++ b/src/Makefile.include @@ -1,23 +1,30 @@ +if EMBEDDED_LEVELDB +LEVELDB_CPPFLAGS += -I$(top_srcdir)/src/leveldb/include +LEVELDB_CPPFLAGS += -I$(top_srcdir)/src/leveldb/helpers/memenv +LIBLEVELDB += $(top_builddir)/src/leveldb/libleveldb.a +LIBMEMENV += $(top_builddir)/src/leveldb/libmemenv.a +endif + AM_CPPFLAGS = $(INCLUDES) \ -I$(top_builddir)/src/obj \ - -I$(top_srcdir)/src/leveldb/include \ $(BDB_CPPFLAGS) \ - $(BOOST_INCLUDES) + $(BOOST_CPPFLAGS) $(BOOST_INCLUDES) +AM_CPPFLAGS += $(LEVELDB_CPPFLAGS) AM_LDFLAGS = $(PTHREAD_CFLAGS) LIBBITCOIN_SERVER=$(top_builddir)/src/libbitcoin_server.a LIBBITCOIN_WALLET=$(top_builddir)/src/libbitcoin_wallet.a LIBBITCOIN_COMMON=$(top_builddir)/src/libbitcoin_common.a LIBBITCOIN_CLI=$(top_builddir)/src/libbitcoin_cli.a -LIBLEVELDB=$(top_builddir)/src/leveldb/libleveldb.a -LIBMEMENV=$(top_builddir)/src/leveldb/libmemenv.a LIBBITCOINQT=$(top_builddir)/src/qt/libbitcoinqt.a $(LIBBITCOIN): $(MAKE) -C $(top_builddir)/src $(@F) +if EMBEDDED_LEVELDB $(LIBLEVELDB) $(LIBMEMENV): $(MAKE) -C $(top_builddir)/src leveldb/$(@F) +endif $(LIBBITCOINQT): $(MAKE) -C $(top_builddir)/src/qt $(@F) diff --git a/src/m4/bitcoin_qt.m4 b/src/m4/bitcoin_qt.m4 index 758aea3499..5ed9692186 100644 --- a/src/m4/bitcoin_qt.m4 +++ b/src/m4/bitcoin_qt.m4 @@ -22,7 +22,7 @@ AC_DEFUN([BITCOIN_QT_CHECK],[ ]) dnl BITCOIN_QT_PATH_PROGS([FOO], [foo foo2], [/path/to/search/first], [continue if missing]) -dnl Helper for finding the path of programs needed for QT. +dnl Helper for finding the path of programs needed for Qt. dnl Inputs: $1: Variable to be set dnl Inputs: $2: List of programs to search for dnl Inputs: $3: Look for $2 here before $PATH @@ -47,9 +47,9 @@ dnl input variables are set correctly. dnl CAUTION: Do not use this inside of a conditional. AC_DEFUN([BITCOIN_QT_INIT],[ dnl enable qt support - AC_ARG_WITH([qt], - [AS_HELP_STRING([--with-qt], - [with qt (no|qt4|qt5|auto. default is auto, qt4 tried first.)])], + AC_ARG_WITH([gui], + [AS_HELP_STRING([--with-gui], + [with GUI (no|qt4|qt5|auto. default is auto, qt4 tried first.)])], [ bitcoin_qt_want_version=$withval if test x$bitcoin_qt_want_version = xyes; then @@ -59,10 +59,10 @@ AC_DEFUN([BITCOIN_QT_INIT],[ ], [bitcoin_qt_want_version=auto]) - AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) - AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) - AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) - AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) + AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-gui-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) + AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-gui-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) + AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-gui-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) + AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-gui-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) AC_ARG_WITH([qtdbus], [AS_HELP_STRING([--with-qtdbus], @@ -73,7 +73,7 @@ AC_DEFUN([BITCOIN_QT_INIT],[ dnl Find the appropriate version of Qt libraries and includes. dnl Inputs: $1: Whether or not pkg-config should be used. yes|no. Default: yes. -dnl Inputs: $2: If $1 is "yes" and --with-qt=auto, which qt version should be +dnl Inputs: $2: If $1 is "yes" and --with-gui=auto, which qt version should be dnl tried first. dnl Outputs: See _BITCOIN_QT_FIND_LIBS_* dnl Outputs: Sets variables for all qt-related tools. @@ -113,7 +113,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ dnl enable qt support - AC_MSG_CHECKING(if QT should be enabled) + AC_MSG_CHECKING(whether to build Bitcoin Core GUI) BITCOIN_QT_CHECK([ bitcoin_enable_qt=yes bitcoin_enable_qt_test=yes @@ -149,11 +149,11 @@ dnl All macros below are internal and should _not_ be used from the main dnl configure.ac. dnl ---- -dnl Internal. Check if the included version of QT is Qt5. +dnl Internal. Check if the included version of Qt is Qt5. dnl Requires: INCLUDES must be populated as necessary. dnl Output: bitcoin_cv_qt5=yes|no AC_DEFUN([_BITCOIN_QT_CHECK_QT5],[ - AC_CACHE_CHECK(for QT 5, bitcoin_cv_qt5,[ + AC_CACHE_CHECK(for Qt 5, bitcoin_cv_qt5,[ AC_TRY_COMPILE( [#include <QtCore>], [ @@ -167,13 +167,13 @@ AC_DEFUN([_BITCOIN_QT_CHECK_QT5],[ bitcoin_cv_qt5=no) ])]) -dnl Internal. Check if the linked version of QT was built as static libs. +dnl Internal. Check if the linked version of Qt was built as static libs. dnl Requires: Qt5. This check cannot determine if Qt4 is static. dnl Requires: INCLUDES and LIBS must be populated as necessary. dnl Output: bitcoin_cv_static_qt=yes|no dnl Output: Defines QT_STATICPLUGIN if plugins are static. AC_DEFUN([_BITCOIN_QT_IS_STATIC],[ - AC_CACHE_CHECK(for static QT, bitcoin_cv_static_qt,[ + AC_CACHE_CHECK(for static Qt, bitcoin_cv_static_qt,[ AC_TRY_COMPILE( [#include <QtCore>], [ @@ -187,7 +187,7 @@ AC_DEFUN([_BITCOIN_QT_IS_STATIC],[ [bitcoin_cv_static_qt=no]) ]) if test xbitcoin_cv_static_qt = xyes; then - AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol for static QT plugins]) + AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol for static Qt plugins]) fi ]) @@ -197,7 +197,7 @@ dnl Inputs: $1: A series of Q_IMPORT_PLUGIN(). dnl Inputs: $2: The libraries that resolve $1. dnl Output: QT_LIBS is prepended or configure exits. AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_PLUGINS],[ - AC_MSG_CHECKING(for static QT plugins: $2) + AC_MSG_CHECKING(for static Qt plugins: $2) CHECK_STATIC_PLUGINS_TEMP_LIBS="$LIBS" LIBS="$2 $QT_LIBS $LIBS" AC_TRY_LINK([ @@ -211,7 +211,7 @@ AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_PLUGINS],[ ]) dnl Internal. Find Qt libraries using pkg-config. -dnl Inputs: bitcoin_qt_want_version (from --with-qt=). The version to check +dnl Inputs: bitcoin_qt_want_version (from --with-gui=). The version to check dnl first. dnl Inputs: $1: If bitcoin_qt_want_version is "auto", check for this version dnl first. @@ -265,7 +265,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ dnl Internal. Find Qt libraries without using pkg-config. Version is deduced dnl from the discovered headers. -dnl Inputs: bitcoin_qt_want_version (from --with-qt=). The version to use. +dnl Inputs: bitcoin_qt_want_version (from --with-gui=). The version to use. dnl If "auto", the version will be discovered by _BITCOIN_QT_CHECK_QT5. dnl Outputs: All necessary QT_* variables are set. dnl Outputs: bitcoin_qt_got_major_vers is set to "4" or "5". |