1 dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N)
3 define(_CLIENT_VERSION_MAJOR, 1)
4 define(_CLIENT_VERSION_MINOR, 0)
5 define(_CLIENT_VERSION_REVISION, 0)
6 define(_CLIENT_VERSION_BUILD, 0)
7 define(_CLIENT_VERSION_IS_RELEASE, false)
8 define(_COPYRIGHT_YEAR, 2016)
9 AC_INIT([Zcash],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/zcash/zcash/issues],[zcash])
10 AC_CONFIG_SRCDIR([src/main.cpp])
11 AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
12 AC_CONFIG_AUX_DIR([build-aux])
13 AC_CONFIG_MACRO_DIR([build-aux/m4])
17 AH_TOP([#ifndef BITCOIN_CONFIG_H])
18 AH_TOP([#define BITCOIN_CONFIG_H])
19 AH_BOTTOM([#endif //BITCOIN_CONFIG_H])
21 dnl faketime breaks configure and is only needed for make. Disable it here.
24 dnl Automake init set-up and checks
25 AM_INIT_AUTOMAKE([no-define subdir-objects foreign])
27 dnl faketime messes with timestamps and causes configure to be re-run.
28 dnl --disable-maintainer-mode can be used to bypass this.
29 AM_MAINTAINER_MODE([enable])
31 dnl make the compilation flags quiet unless V=1 is used
32 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
34 dnl Compiler checks (here before libtool).
35 if test "x${CXXFLAGS+set}" = "xset"; then
36 CXXFLAGS_overridden=yes
38 CXXFLAGS_overridden=no
41 # Zcash requries C++11 compatibility; set it early:
42 CXXFLAGS="-std=c++11 $CXXFLAGS"
45 m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX])
47 dnl By default, libtool for mingw refuses to link static libs into a dll for
48 dnl fear of mixing pic/non-pic objects, and import/export complications. Since
49 dnl we have those under control, re-enable that functionality.
52 lt_cv_deplibs_check_method="pass_all"
55 dnl Libtool init checks.
58 dnl Check/return PATH for base programs.
60 AC_PATH_TOOL(RANLIB, ranlib)
61 AC_PATH_TOOL(STRIP, strip)
62 AC_PATH_TOOL(GCOV, gcov)
63 AC_PATH_PROG(LCOV, lcov)
64 AC_PATH_PROG(JAVA, java)
65 AC_PATH_PROG(GENHTML, genhtml)
66 AC_PATH_PROG([GIT], [git])
67 AC_PATH_PROG(CCACHE,ccache)
68 AC_PATH_PROG(XGETTEXT,xgettext)
69 AC_PATH_PROG(HEXDUMP,hexdump)
70 AC_PATH_TOOL(READELF,readelf)
71 AC_PATH_TOOL(CPPFILT,c++filt)
77 AC_ARG_ENABLE([wallet],
78 [AS_HELP_STRING([--enable-wallet],
79 [enable wallet (default is yes)])],
80 [enable_wallet=$enableval],
83 AC_ARG_WITH([miniupnpc],
84 [AS_HELP_STRING([--with-miniupnpc],
85 [enable UPNP (default is yes if libminiupnpc is found)])],
89 AC_ARG_ENABLE([upnp-default],
90 [AS_HELP_STRING([--enable-upnp-default],
91 [if UPNP is enabled, turn it on at startup (default is no)])],
92 [use_upnp_default=$enableval],
93 [use_upnp_default=no])
96 AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
97 [use_tests=$enableval],
100 AC_ARG_WITH([comparison-tool],
101 AS_HELP_STRING([--with-comparison-tool],[path to java comparison tool (requires --enable-tests)]),
102 [use_comparison_tool=$withval],
103 [use_comparison_tool=no])
105 AC_ARG_ENABLE([comparison-tool-reorg-tests],
106 AS_HELP_STRING([--enable-comparison-tool-reorg-tests],[enable expensive reorg tests in the comparison tool (default no)]),
107 [use_comparison_tool_reorg_tests=$enableval],
108 [use_comparison_tool_reorg_tests=no])
110 AC_ARG_WITH([qrencode],
111 [AS_HELP_STRING([--with-qrencode],
112 [enable QR code support (default is yes if qt is enabled and libqrencode is found)])],
116 AC_ARG_ENABLE([hardening],
117 [AS_HELP_STRING([--enable-hardening],
118 [attempt to harden the resulting executables (default is yes)])],
119 [use_hardening=$enableval],
122 AC_ARG_ENABLE([reduce-exports],
123 [AS_HELP_STRING([--enable-reduce-exports],
124 [attempt to reduce exported symbols in the resulting executables (default is no)])],
125 [use_reduce_exports=$enableval],
126 [use_reduce_exports=no])
128 AC_ARG_ENABLE([ccache],
129 [AS_HELP_STRING([--enable-ccache],
130 [use ccache for building (default is yes if ccache is found)])],
131 [use_ccache=$enableval],
134 AC_ARG_ENABLE([lcov],
135 [AS_HELP_STRING([--enable-lcov],
136 [enable lcov testing (default is no)])],
140 AC_ARG_ENABLE([glibc-back-compat],
141 [AS_HELP_STRING([--enable-glibc-back-compat],
142 [enable backwards compatibility with glibc])],
143 [use_glibc_compat=$enableval],
144 [use_glibc_compat=no])
146 AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], [])
149 AC_ARG_ENABLE([debug],
150 [AS_HELP_STRING([--enable-debug],
151 [use debug compiler flags and macros (default is no)])],
152 [enable_debug=$enableval],
155 if test "x$enable_debug" = xyes; then
156 if test "x$GCC" = xyes; then
157 CFLAGS="-g3 -O0 -DDEBUG"
160 if test "x$GXX" = xyes; then
161 CXXFLAGS="-g3 -O0 -DDEBUG"
165 ## TODO: Remove these hard-coded paths and flags. They are here for the sake of
166 ## compatibility with the legacy buildsystem.
168 if test "x$CXXFLAGS_overridden" = "xno"; then
169 CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter -Wno-self-assign"
171 CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS"
174 [AS_HELP_STRING([--with-utils],
175 [build bitcoin-cli bitcoin-tx (default=yes)])],
176 [build_bitcoin_utils=$withval],
177 [build_bitcoin_utils=yes])
180 [AS_HELP_STRING([--with-libs],
181 [build libraries (default=yes)])],
182 [build_bitcoin_libs=$withval],
183 [build_bitcoin_libs=yes])
185 AC_ARG_WITH([daemon],
186 [AS_HELP_STRING([--with-daemon],
187 [build bitcoind daemon (default=yes)])],
188 [build_bitcoind=$withval],
189 [build_bitcoind=yes])
197 #pkgconfig does more harm than good with MinGW
201 AC_CHECK_LIB([mingwthrd], [main],, AC_MSG_ERROR(lib missing))
202 AC_CHECK_LIB([kernel32], [main],, AC_MSG_ERROR(lib missing))
203 AC_CHECK_LIB([user32], [main],, AC_MSG_ERROR(lib missing))
204 AC_CHECK_LIB([gdi32], [main],, AC_MSG_ERROR(lib missing))
205 AC_CHECK_LIB([comdlg32], [main],, AC_MSG_ERROR(lib missing))
206 AC_CHECK_LIB([winspool], [main],, AC_MSG_ERROR(lib missing))
207 AC_CHECK_LIB([winmm], [main],, AC_MSG_ERROR(lib missing))
208 AC_CHECK_LIB([shell32], [main],, AC_MSG_ERROR(lib missing))
209 AC_CHECK_LIB([comctl32], [main],, AC_MSG_ERROR(lib missing))
210 AC_CHECK_LIB([ole32], [main],, AC_MSG_ERROR(lib missing))
211 AC_CHECK_LIB([oleaut32], [main],, AC_MSG_ERROR(lib missing))
212 AC_CHECK_LIB([uuid], [main],, AC_MSG_ERROR(lib missing))
213 AC_CHECK_LIB([rpcrt4], [main],, AC_MSG_ERROR(lib missing))
214 AC_CHECK_LIB([advapi32], [main],, AC_MSG_ERROR(lib missing))
215 AC_CHECK_LIB([ws2_32], [main],, AC_MSG_ERROR(lib missing))
216 AC_CHECK_LIB([mswsock], [main],, AC_MSG_ERROR(lib missing))
217 AC_CHECK_LIB([shlwapi], [main],, AC_MSG_ERROR(lib missing))
218 AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing))
219 AC_CHECK_LIB([crypt32], [main],, AC_MSG_ERROR(lib missing))
221 # -static is interpreted by libtool, where it has a different meaning.
222 # In libtool-speak, it's -all-static.
223 AX_CHECK_LINK_FLAG([[-static]],[LIBTOOL_APP_LDFLAGS="$LIBTOOL_APP_LDFLAGS -all-static"])
225 AC_PATH_PROG([MAKENSIS], [makensis], none)
226 if test x$MAKENSIS = xnone; then
227 AC_MSG_WARN("makensis not found. Cannot create installer.")
230 AC_PATH_TOOL(WINDRES, windres, none)
231 if test x$WINDRES = xnone; then
232 AC_MSG_ERROR("windres not found")
235 CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB"
236 LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE"
237 if test "x$CXXFLAGS_overridden" = "xno"; then
238 CXXFLAGS="$CXXFLAGS -w"
241 i?86-*) WINDOWS_BITS=32 ;;
242 x86_64-*) WINDOWS_BITS=64 ;;
243 *) AC_MSG_ERROR("Could not determine win32/win64 for installer") ;;
245 AC_SUBST(WINDOWS_BITS)
247 dnl libtool insists upon adding -nostdlib and a list of objects/libs to link against.
248 dnl That breaks our ability to build dll's with static libgcc/libstdc++/libssp. Override
249 dnl its command here, with the predeps/postdeps removed, and -static inserted. Postdeps are
250 dnl also overridden to prevent their insertion later.
251 dnl This should only affect dll's.
252 archive_cmds_CXX="\$CC -shared \$libobjs \$deplibs \$compiler_flags -static -o \$output_objdir/\$soname \${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker \$lib"
258 LEVELDB_TARGET_FLAGS="TARGET_OS=Darwin"
259 if test x$cross_compiling != xyes; then
261 AC_CHECK_PROG([PORT],port, port)
262 if test x$PORT = xport; then
263 dnl add default macports paths
264 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
265 LIBS="$LIBS -L/opt/local/lib"
266 if test -d /opt/local/include/db48; then
267 CPPFLAGS="$CPPFLAGS -I/opt/local/include/db48"
268 LIBS="$LIBS -L/opt/local/lib/db48"
272 AC_CHECK_PROG([BREW],brew, brew)
273 if test x$BREW = xbrew; then
274 dnl These Homebrew packages may be keg-only, meaning that they won't be found
275 dnl in expected paths because they may conflict with system files. Ask
276 dnl Homebrew where each one is located, then adjust paths accordingly.
277 dnl It's safe to add these paths even if the functionality is disabled by
278 dnl the user (--without-wallet or --without-gui for example).
280 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
281 bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null`
282 qt5_prefix=`$BREW --prefix qt5 2>/dev/null`
283 if test x$openssl_prefix != x; then
284 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
285 export PKG_CONFIG_PATH
287 if test x$bdb_prefix != x; then
288 CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include"
289 LIBS="$LIBS -L$bdb_prefix/lib"
291 if test x$qt5_prefix != x; then
292 PKG_CONFIG_PATH="$qt5_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
293 export PKG_CONFIG_PATH
302 AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool)
303 AC_PATH_TOOL([OTOOL], [otool], otool)
304 AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage)
306 dnl libtool will try to strip the static lib, which is a problem for
307 dnl cross-builds because strip attempts to call a hard-coded ld,
308 dnl which may not exist in the path. Stripping the .a is not
309 dnl necessary, so just disable it.
315 AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"])
316 CPPFLAGS="$CPPFLAGS -DMAC_OSX"
325 if test x$use_comparison_tool != xno; then
326 if test x$JAVA = x; then
327 AC_MSG_ERROR("comparison tool set but java not found")
329 AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool)
332 if test x$use_comparison_tool_reorg_tests != xno; then
333 if test x$use_comparison_tool = x; then
334 AC_MSG_ERROR("comparison tool reorg tests but comparison tool was not specified")
336 AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 1)
338 AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 0)
341 if test x$use_lcov = xyes; then
342 if test x$LCOV = x; then
343 AC_MSG_ERROR("lcov testing requested but lcov not found")
345 if test x$GCOV = x; then
346 AC_MSG_ERROR("lcov testing requested but gcov not found")
348 if test x$JAVA = x; then
349 AC_MSG_ERROR("lcov testing requested but java not found")
351 if test x$GENHTML = x; then
352 AC_MSG_ERROR("lcov testing requested but genhtml not found")
354 if test x$use_comparison_tool = x; then
355 AC_MSG_ERROR("lcov testing requested but comparison tool was not specified")
357 LCOV="$LCOV --gcov-tool=$GCOV --rc lcov_branch_coverage=1"
358 GENHTML="$GENHTML --branch-coverage"
359 AX_CHECK_COMPILE_FLAG([--coverage],[CXXFLAGS="$CXXFLAGS --coverage"],
360 [AC_MSG_ERROR("lcov testing requested but --coverage flag does not work")])
363 dnl Check for endianness
366 dnl Check for pthread compile/link requirements
369 # The following macro will add the necessary defines to bitcoin-config.h, but
370 # they also need to be passed down to any subprojects. Pull the results out of
371 # the cache and add them to CPPFLAGS.
373 # detect POSIX or GNU variant of strerror_r
376 if test x$ac_cv_sys_file_offset_bits != x &&
377 test x$ac_cv_sys_file_offset_bits != xno &&
378 test x$ac_cv_sys_file_offset_bits != xunknown; then
379 CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
382 if test x$ac_cv_sys_large_files != x &&
383 test x$ac_cv_sys_large_files != xno &&
384 test x$ac_cv_sys_large_files != xunknown; then
385 CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files"
388 AX_CHECK_LINK_FLAG([[-Wl,--large-address-aware]], [LDFLAGS="$LDFLAGS -Wl,--large-address-aware"])
390 AX_GCC_FUNC_ATTRIBUTE([visibility])
391 AX_GCC_FUNC_ATTRIBUTE([dllexport])
392 AX_GCC_FUNC_ATTRIBUTE([dllimport])
394 if test x$use_glibc_compat != xno; then
396 #__fdelt_chk's params and return type have changed from long unsigned int to long int.
397 # See which one is present here.
398 AC_MSG_CHECKING(__fdelt_chk type)
399 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifdef _FORTIFY_SOURCE
400 #undef _FORTIFY_SOURCE
402 #define _FORTIFY_SOURCE 2
403 #include <sys/select.h>
404 extern "C" long unsigned int __fdelt_warn(long unsigned int);]],[[]])],
405 [ fdelt_type="long unsigned int"],
406 [ fdelt_type="long int"])
407 AC_MSG_RESULT($fdelt_type)
408 AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk])
412 if test x$use_hardening != xno; then
413 AX_CHECK_COMPILE_FLAG([-Wformat],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat"],[AC_MSG_ERROR(Cannot enable -Wformat)])
414 AX_CHECK_COMPILE_FLAG([-Wformat-security],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat-security"],[AC_MSG_ERROR(Cannot enable -Wformat-security)],[-Wformat])
415 AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"],[AC_MSG_ERROR(Cannot enable -Wstack-protector)])
416 AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"],[AC_MSG_ERROR(Cannot enable -fstack-protector-all)])
418 AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[
419 AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[
420 HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE"
421 ],[AC_MSG_ERROR(Cannot enable -U_FORTIFY_SOURCE)])
422 HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"
423 ],[AC_MSG_ERROR(Cannot enable -D_FORTIFY_SOURCE=2)])
425 AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_ERROR(Cannot enable RELRO)])
426 AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_ERROR(Cannot enable BIND_NOW)])
428 if test x$TARGET_OS != xwindows; then
429 # All windows code is PIC, forcing it on just adds useless compile warnings
430 AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)])
431 AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"],[AC_MSG_ERROR(Cannot enable -pie)])
433 # These are only available on Windows.
434 AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"],[AC_MSG_ERROR(Cannot enable --dynamicbase)])
435 AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"],[AC_MSG_ERROR(Cannot enable --nxcompat)])
440 AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing))
444 CXXFLAGS="$CXXFLAGS $HARDENED_CXXFLAGS"
445 CPPFLAGS="$CPPFLAGS $HARDENED_CPPFLAGS"
446 LDFLAGS="$LDFLAGS $HARDENED_LDFLAGS"
447 OBJCXXFLAGS="$CXXFLAGS"
450 dnl this flag screws up non-darwin gcc even when the check fails. special-case it.
451 if test x$TARGET_OS = xdarwin; then
452 AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"])
455 AC_CHECK_HEADERS([endian.h sys/endian.h byteswap.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h])
456 AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])])
457 AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])])
459 AC_CHECK_DECLS([strnlen])
461 AC_CHECK_DECLS([le16toh, le32toh, le64toh, htole16, htole32, htole64, be16toh, be32toh, be64toh, htobe16, htobe32, htobe64],,,
464 #elif HAVE_SYS_ENDIAN_H
465 #include <sys/endian.h>
468 AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64],,,
470 #include <byteswap.h>
473 dnl Check for MSG_NOSIGNAL
474 AC_MSG_CHECKING(for MSG_NOSIGNAL)
475 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]],
476 [[ int f = MSG_NOSIGNAL; ]])],
477 [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ],
481 AC_SEARCH_LIBS([clock_gettime],[rt])
483 AC_MSG_CHECKING([for visibility attribute])
484 AC_LINK_IFELSE([AC_LANG_SOURCE([
485 int foo_def( void ) __attribute__((visibility("default")));
489 AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE,1,[Define if the visibility attribute is supported.])
494 if test x$use_reduce_exports = xyes; then
495 AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduce-exports.])
500 if test x$use_reduce_exports = xyes; then
501 AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"],
502 [AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduce-exports.])])
508 AM_CONDITIONAL([EMBEDDED_LEVELDB],[true])
509 AC_SUBST(LEVELDB_CPPFLAGS)
513 if test x$enable_wallet != xno; then
514 dnl Check for libdb_cxx only if wallet enabled
518 dnl Check for libminiupnpc (optional)
519 if test x$use_upnp != xno; then
521 [miniupnpc/miniwget.h miniupnpc/miniupnpc.h miniupnpc/upnpcommands.h miniupnpc/upnperrors.h],
522 [AC_CHECK_LIB([miniupnpc], [main],[MINIUPNPC_LIBS=-lminiupnpc], [have_miniupnpc=no])],
529 dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus
530 BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4])
532 if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then
538 if test x$use_boost = xyes; then
540 dnl Check for boost libs
544 AX_BOOST_PROGRAM_OPTIONS
549 if test x$use_reduce_exports = xyes; then
550 AC_MSG_CHECKING([for working boost reduced exports])
551 TEMP_CPPFLAGS="$CPPFLAGS"
552 CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
553 AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[
554 @%:@include <boost/version.hpp>
556 #if BOOST_VERSION >= 104900
557 // Everything is okay
559 # error Boost version is too old
564 AC_MSG_ERROR([boost versions < 1.49 are known to be broken with reduced exports. Use --disable-reduce-exports.])
566 CPPFLAGS="$TEMP_CPPFLAGS"
570 if test x$use_reduce_exports = xyes; then
571 CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS"
572 AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"])
575 if test x$use_tests = xyes; then
577 if test x$HEXDUMP = x; then
578 AC_MSG_ERROR(hexdump is required for tests)
582 if test x$use_boost = xyes; then
584 AX_BOOST_UNIT_TEST_FRAMEWORK
586 dnl Determine if -DBOOST_TEST_DYN_LINK is needed
587 AC_MSG_CHECKING([for dynamic linked boost test])
589 LIBS="$LIBS $BOOST_LDFLAGS $BOOST_UNIT_TEST_FRAMEWORK_LIB"
590 TEMP_CPPFLAGS="$CPPFLAGS"
591 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
592 AC_LINK_IFELSE([AC_LANG_SOURCE([
593 #define BOOST_TEST_DYN_LINK
594 #define BOOST_TEST_MAIN
595 #include <boost/test/unit_test.hpp>
599 [TESTDEFS="$TESTDEFS -DBOOST_TEST_DYN_LINK"],
602 CPPFLAGS="$TEMP_CPPFLAGS"
607 if test x$use_boost = xyes; then
609 BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB"
611 dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however
612 dnl it was broken from 1.50 to 1.52 when backed by nanosleep. Use sleep_for if
613 dnl a working version is available, else fall back to sleep. sleep was removed
615 dnl If neither is available, abort.
617 LIBS="$BOOST_LIBS $LIBS"
618 TEMP_CPPFLAGS="$CPPFLAGS"
619 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
620 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
621 #include <boost/thread/thread.hpp>
622 #include <boost/version.hpp>
624 #if BOOST_VERSION >= 105000 && (!defined(BOOST_HAS_NANOSLEEP) || BOOST_VERSION >= 105200)
625 boost::this_thread::sleep_for(boost::chrono::milliseconds(0));
631 AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])],
634 CPPFLAGS="$TEMP_CPPFLAGS"
636 if test x$boost_sleep != xyes; then
638 LIBS="$BOOST_LIBS $LIBS"
639 TEMP_CPPFLAGS="$CPPFLAGS"
640 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
641 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
642 #include <boost/version.hpp>
643 #include <boost/thread.hpp>
644 #include <boost/date_time/posix_time/posix_time_types.hpp>
646 #if BOOST_VERSION <= 105600
647 boost::this_thread::sleep(boost::posix_time::milliseconds(0));
652 [boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])],
655 CPPFLAGS="$TEMP_CPPFLAGS"
658 if test x$boost_sleep != xyes; then
659 AC_MSG_ERROR(No working boost sleep implementation found.)
664 if test x$use_pkgconfig = xyes; then
666 if test x"$PKG_CONFIG" = "x"; then
667 AC_MSG_ERROR(pkg-config not found.)
674 PKG_CHECK_MODULES([SSL], [libssl],, [AC_MSG_ERROR(openssl not found.)])
675 PKG_CHECK_MODULES([CRYPTO], [libcrypto],,[AC_MSG_ERROR(libcrypto not found.)])
676 BITCOIN_QT_CHECK([PKG_CHECK_MODULES([PROTOBUF], [protobuf], [have_protobuf=yes], [BITCOIN_QT_FAIL(libprotobuf not found)])])
677 if test x$use_qr != xno; then
678 BITCOIN_QT_CHECK([PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no])])
684 echo 'BUG: configure does not yet check for the following dependencies if pkg-config is not on the system: libcrypto++, libgmp'
686 AC_CHECK_HEADER([openssl/crypto.h],,AC_MSG_ERROR(libcrypto headers missing))
687 AC_CHECK_LIB([crypto], [main],CRYPTO_LIBS=-lcrypto, AC_MSG_ERROR(libcrypto missing))
689 AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),)
690 AC_CHECK_LIB([ssl], [main],SSL_LIBS=-lssl, AC_MSG_ERROR(libssl missing))
692 BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],[PROTOBUF_LIBS=-lprotobuf], BITCOIN_QT_FAIL(libprotobuf not found)))
693 if test x$use_qr != xno; then
694 BITCOIN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],[QR_LIBS=-lqrencode], [have_qrencode=no])])
695 BITCOIN_QT_CHECK([AC_CHECK_HEADER([qrencode.h],, have_qrencode=no)])
699 # These packages don't provide pkgconfig config files across all
700 # platforms, so we use older autoconf detection mechanisms:
701 AC_CHECK_HEADER([gmp.h],,AC_MSG_ERROR(libgmp headers missing))
702 AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing)])
704 AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing))
705 AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)])
707 # libsnark header layout is broken unless cpp's -I is passed with the
708 # libsnark directory, so for now we use this hideous workaround:
709 echo 'Hunting for libsnark include directory...'
710 [LIBSNARK_INCDIR="$(echo "$CPPFLAGS" | sed 's,^.*-I\([^ ]*/include\).*$,\1/libsnark,')"]
711 if test -d "$LIBSNARK_INCDIR"; then
712 echo "Found libsnark include directory: $LIBSNARK_INCDIR"
714 AC_MSG_ERROR(libsnark include directory not found)
717 CPPFLAGS="-I$LIBSNARK_INCDIR $CPPFLAGS"
719 # Now check for libsnark compilability using traditional autoconf tests:
720 AC_CHECK_HEADER([libsnark/gadgetlib1/gadget.hpp],,AC_MSG_ERROR(libsnark headers missing))
721 AC_CHECK_LIB([snark],[main],LIBSNARK_LIBS=-lsnark, [AC_MSG_ERROR(libsnark missing)], [-lgmpxx])
723 LIBZCASH_LIBS="-lsnark -lgmp -lgmpxx -lboost_system-mt -lcrypto -lsodium -fopenmp"
725 AC_CHECK_LIB([crypto],[RAND_egd],[],[
726 AC_ARG_WITH([libressl],
727 [AS_HELP_STRING([--with-libressl],[Build with system LibreSSL (default is no; DANGEROUS; NOT SUPPORTED)])],
728 [AC_MSG_WARN([Detected LibreSSL: This is NOT supported, and may break consensus compatibility!])],
729 [AC_MSG_ERROR([Detected LibreSSL: This is NOT supported, and may break consensus compatibility!])]
733 CFLAGS_TEMP="$CFLAGS"
735 CFLAGS="$CFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS"
736 LIBS="$LIBS $SSL_LIBS $CRYPTO_LIBS $GMP_LIBS $GMPXX_LIBS"
737 AC_CHECK_HEADER([openssl/ec.h],, AC_MSG_ERROR(OpenSSL ec header missing),)
739 AC_MSG_CHECKING(for a supported OpenSSL version)
740 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
741 #include <openssl/rand.h>
743 [[RAND_egd(NULL);]])],
744 [AC_MSG_RESULT(yes)],
746 AC_ARG_WITH([libressl],
747 [AS_HELP_STRING([--with-libressl],[Build with system LibreSSL (default is no; DANGEROUS; NOT SUPPORTED)])],
748 [AC_MSG_WARN([Detected LibreSSL: This is NOT supported, and may break consensus compatibility!])],
749 [AC_MSG_ERROR([Detected LibreSSL: This is NOT supported, and may break consensus compatibility!])]
753 CFLAGS="$CFLAGS_TEMP"
756 BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path)
758 AC_MSG_CHECKING([whether to build bitcoind])
759 AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes])
760 AC_MSG_RESULT($build_bitcoind)
762 AC_MSG_CHECKING([whether to build utils (bitcoin-cli bitcoin-tx)])
763 AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes])
764 AC_MSG_RESULT($build_bitcoin_utils)
766 AC_MSG_CHECKING([whether to build libraries])
767 AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes])
768 if test x$build_bitcoin_libs = xyes; then
769 AC_DEFINE(HAVE_CONSENSUS_LIB, 1, [Define this symbol if the consensus lib has been built])
770 AC_CONFIG_FILES([libbitcoinconsensus.pc:libbitcoinconsensus.pc.in])
773 AC_MSG_RESULT($build_bitcoin_libs)
777 if test "x$use_ccache" != "xno"; then
778 AC_MSG_CHECKING(if ccache should be used)
779 if test x$CCACHE = x; then
780 if test "x$use_ccache" = "xyes"; then
781 AC_MSG_ERROR([ccache not found.]);
787 CC="$ac_cv_path_CCACHE $CC"
788 CXX="$ac_cv_path_CCACHE $CXX"
790 AC_MSG_RESULT($use_ccache)
792 if test "x$use_ccache" = "xyes"; then
793 AX_CHECK_PREPROC_FLAG([-Qunused-arguments],[CPPFLAGS="-Qunused-arguments $CPPFLAGS"])
797 AC_MSG_CHECKING([if wallet should be enabled])
798 if test x$enable_wallet != xno; then
800 AC_DEFINE_UNQUOTED([ENABLE_WALLET],[1],[Define to 1 to enable wallet functions])
806 dnl enable upnp support
807 AC_MSG_CHECKING([whether to build with support for UPnP])
808 if test x$have_miniupnpc = xno; then
809 if test x$use_upnp = xyes; then
810 AC_MSG_ERROR("UPnP requested but cannot be built. use --without-miniupnpc")
814 if test x$use_upnp != xno; then
816 AC_MSG_CHECKING([whether to build with UPnP enabled by default])
819 if test x$use_upnp_default != xno; then
823 AC_MSG_RESULT($use_upnp_default)
824 AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[UPnP support not compiled if undefined, otherwise value (0 or 1) determines default state])
825 if test x$TARGET_OS = xwindows; then
826 MINIUPNPC_CPPFLAGS="-DSTATICLIB -DMINIUPNP_STATICLIB"
833 dnl these are only used when qt is enabled
834 if test x$bitcoin_enable_qt != xno; then
836 dnl enable dbus support
837 AC_MSG_CHECKING([whether to build GUI with support for D-Bus])
838 if test x$bitcoin_enable_qt_dbus != xno; then
839 AC_DEFINE([USE_DBUS],[1],[Define if dbus support should be compiled in])
841 AC_MSG_RESULT($bitcoin_enable_qt_dbus)
843 dnl enable qr support
844 AC_MSG_CHECKING([whether to build GUI with support for QR codes])
845 if test x$have_qrencode = xno; then
846 if test x$use_qr = xyes; then
847 AC_MSG_ERROR("QR support requested but cannot be built. use --without-qrencode")
851 if test x$use_qr != xno; then
853 AC_DEFINE([USE_QRCODE],[1],[Define if QR support should be compiled in])
860 if test x$XGETTEXT = x; then
861 AC_MSG_WARN("xgettext is required to update qt translations")
864 AC_MSG_CHECKING([whether to build test_bitcoin-qt])
865 if test x$use_tests$bitcoin_enable_qt_test = xyesyes; then
873 AC_MSG_CHECKING([whether to build test_bitcoin])
874 if test x$use_tests = xyes; then
881 AC_MSG_CHECKING([whether to reduce exports])
882 if test x$use_reduce_exports = xyes; then
888 if test x$build_bitcoin_utils$build_bitcoin_libs$build_bitcoind$bitcoin_enable_qt$use_tests = xnonononono; then
889 AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon --with-gui or --enable-tests])
892 AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin])
893 AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin])
894 AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows])
895 AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes])
896 AM_CONDITIONAL([ENABLE_TESTS],[test x$use_tests = xyes])
897 AM_CONDITIONAL([ENABLE_QT],[test x$bitcoin_enable_qt = xyes])
898 AM_CONDITIONAL([ENABLE_QT_TESTS],[test x$use_tests$bitcoin_enable_qt_test = xyesyes])
899 AM_CONDITIONAL([USE_QRCODE], [test x$use_qr = xyes])
900 AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes])
901 AM_CONDITIONAL([USE_COMPARISON_TOOL],[test x$use_comparison_tool != xno])
902 AM_CONDITIONAL([USE_COMPARISON_TOOL_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno])
903 AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes])
904 AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes])
906 AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version])
907 AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version])
908 AC_DEFINE(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION, [Build revision])
909 AC_DEFINE(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD, [Version Build])
910 AC_DEFINE(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE, [Version is release])
911 AC_DEFINE(COPYRIGHT_YEAR, _COPYRIGHT_YEAR, [Version is release])
912 AC_SUBST(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR)
913 AC_SUBST(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR)
914 AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION)
915 AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD)
916 AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE)
917 AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR)
920 AC_SUBST(LIBTOOL_APP_LDFLAGS)
925 AC_SUBST(LEVELDB_TARGET_FLAGS)
928 AC_SUBST(BUILD_TEST_QT)
929 AC_SUBST(MINIUPNPC_CPPFLAGS)
930 AC_SUBST(MINIUPNPC_LIBS)
933 AC_SUBST(LIBSNARK_LIBS)
934 AC_SUBST(LIBZCASH_LIBS)
935 AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py])
936 AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh])
937 AC_CONFIG_FILES([qa/pull-tester/tests-config.sh],[chmod +x qa/pull-tester/tests-config.sh])
939 dnl boost's m4 checks do something really nasty: they export these vars. As a
940 dnl result, they leak into secp256k1's configure and crazy things happen.
941 dnl Until this is fixed upstream and we've synced, we'll just un-export them.
942 CPPFLAGS_TEMP="$CPPFLAGS"
944 CPPFLAGS="$CPPFLAGS_TEMP"
946 LDFLAGS_TEMP="$LDFLAGS"
948 LDFLAGS="$LDFLAGS_TEMP"
954 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
955 unset PKG_CONFIG_PATH
956 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
958 PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR"
959 unset PKG_CONFIG_LIBDIR
960 PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP"
962 ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no"
963 AC_CONFIG_SUBDIRS([src/secp256k1])
967 dnl Taken from https://wiki.debian.org/RpathIssue
970 AC_MSG_RESULT([Fixing libtool for -rpath problems.])
971 sed < libtool > libtool-2 \
972 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/'