1 dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N)
3 define(_CLIENT_VERSION_MAJOR, 2)
4 define(_CLIENT_VERSION_MINOR, 0)
5 define(_CLIENT_VERSION_REVISION, 2)
6 define(_CLIENT_VERSION_BUILD, 50)
7 define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50)))
8 define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1)))
9 define(_CLIENT_VERSION_IS_RELEASE, true)
10 define(_COPYRIGHT_YEAR, 2018)
11 AC_INIT([Zcash],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_SUFFIX(_ZC_BUILD_VAL)],[https://github.com/zcash/zcash/issues],[zcash])
12 AC_CONFIG_SRCDIR([src/main.cpp])
13 AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
14 AC_CONFIG_AUX_DIR([build-aux])
15 AC_CONFIG_MACRO_DIR([build-aux/m4])
17 BITCOIN_DAEMON_NAME=zcashd
18 BITCOIN_CLI_NAME=zcash-cli
19 BITCOIN_TX_NAME=zcash-tx
21 dnl Unless the user specified ARFLAGS, force it to be cr
22 AC_ARG_VAR(ARFLAGS, [Flags for the archiver, defaults to <cr> if not set])
23 if test "x${ARFLAGS+set}" != "xset"; then
29 AH_TOP([#ifndef BITCOIN_CONFIG_H])
30 AH_TOP([#define BITCOIN_CONFIG_H])
31 AH_BOTTOM([#endif //BITCOIN_CONFIG_H])
33 dnl faketime breaks configure and is only needed for make. Disable it here.
36 dnl Automake init set-up and checks
37 AM_INIT_AUTOMAKE([no-define subdir-objects foreign tar-pax])
39 dnl faketime messes with timestamps and causes configure to be re-run.
40 dnl --disable-maintainer-mode can be used to bypass this.
41 AM_MAINTAINER_MODE([enable])
43 dnl make the compilation flags quiet unless V=1 is used
44 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
46 dnl Compiler checks (here before libtool).
47 if test "x${CXXFLAGS+set}" = "xset"; then
48 CXXFLAGS_overridden=yes
50 CXXFLAGS_overridden=no
54 m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX])
56 dnl By default, libtool for mingw refuses to link static libs into a dll for
57 dnl fear of mixing pic/non-pic objects, and import/export complications. Since
58 dnl we have those under control, re-enable that functionality.
61 lt_cv_deplibs_check_method="pass_all"
64 dnl Require C++11 compiler (no GNU extensions)
65 AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory], [nodefault])
66 dnl Check if -latomic is required for <std::atomic>
69 dnl Libtool init checks.
72 dnl Check/return PATH for base programs.
74 AC_PATH_TOOL(RANLIB, ranlib)
75 AC_PATH_TOOL(STRIP, strip)
76 AC_PATH_TOOL(GCOV, gcov)
77 AC_PATH_PROG(LCOV, lcov)
78 AC_PATH_PROG(GENHTML, genhtml)
79 AC_PATH_PROG([GIT], [git])
80 AC_PATH_PROG(CCACHE,ccache)
81 AC_PATH_PROG(XGETTEXT,xgettext)
82 AC_PATH_PROG(HEXDUMP,hexdump)
83 AC_PATH_TOOL(READELF,readelf)
84 AC_PATH_TOOL(CPPFILT,c++filt)
87 AC_ARG_ENABLE([wallet],
88 [AS_HELP_STRING([--enable-wallet],
89 [enable wallet (default is yes)])],
90 [enable_wallet=$enableval],
93 AC_ARG_ENABLE([mining],
94 [AS_HELP_STRING([--enable-mining],
95 [enable mining (default is yes)])],
96 [enable_mining=$enableval],
99 AC_ARG_ENABLE([proton],
100 [AS_HELP_STRING([--disable-proton],
101 [disable Proton (AMQP messaging)])],
102 [use_proton=$enableval],
106 AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
107 [use_tests=$enableval],
110 AC_ARG_ENABLE([asan],
111 [AS_HELP_STRING([--enable-asan],
112 [instrument the executables with asan (default is no)])],
113 [use_asan=$enableval],
116 AC_ARG_ENABLE([tsan],
117 [AS_HELP_STRING([--enable-tsan],
118 [instrument the executables with tsan (default is no)])],
119 [use_tsan=$enableval],
122 AC_ARG_ENABLE([hardening],
123 [AS_HELP_STRING([--enable-hardening],
124 [attempt to harden the resulting executables (default is yes)])],
125 [use_hardening=$enableval],
128 AC_ARG_ENABLE([reduce-exports],
129 [AS_HELP_STRING([--enable-reduce-exports],
130 [attempt to reduce exported symbols in the resulting executables (default is no)])],
131 [use_reduce_exports=$enableval],
132 [use_reduce_exports=no])
134 AC_ARG_ENABLE([ccache],
135 [AS_HELP_STRING([--enable-ccache],
136 [use ccache for building (default is yes if ccache is found)])],
137 [use_ccache=$enableval],
140 AC_ARG_ENABLE([lcov],
141 [AS_HELP_STRING([--enable-lcov],
142 [enable lcov testing (default is no)])],
146 AC_ARG_ENABLE([glibc-back-compat],
147 [AS_HELP_STRING([--enable-glibc-back-compat],
148 [enable backwards compatibility with glibc])],
149 [use_glibc_compat=$enableval],
150 [use_glibc_compat=no])
153 [AS_HELP_STRING([--disable-zmq],
154 [disable ZMQ notifications])],
155 [use_zmq=$enableval],
158 AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], [])
161 [AS_HELP_STRING([--disable-man],
162 [do not install man pages (default is to install)])],,
164 AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
167 AC_ARG_ENABLE([debug],
168 [AS_HELP_STRING([--enable-debug],
169 [use debug compiler flags and macros (default is no)])],
170 [enable_debug=$enableval],
173 # Turn warnings into errors
174 AC_ARG_ENABLE([werror],
175 [AS_HELP_STRING([--enable-werror],
176 [Treat all compiler warnings as errors (default is no)])],
177 [enable_werror=$enableval],
181 AX_CHECK_COMPILE_FLAG([-Werror],[CXXFLAG_WERROR="-Werror"],[CXXFLAG_WERROR=""])
183 if test "x$enable_debug" = xyes; then
184 CPPFLAGS="$CPPFLAGS -DDEBUG -DDEBUG_LOCKORDER"
185 if test "x$GCC" = xyes; then
186 CFLAGS="$CFLAGS -g3 -O0"
189 if test "x$GXX" = xyes; then
190 CXXFLAGS="$CXXFLAGS -g3 -O0"
195 if test "x$enable_werror" = "xyes"; then
196 if test "x$CXXFLAG_WERROR" = "x"; then
197 AC_MSG_ERROR("enable-werror set but -Werror is not usable")
199 ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror"
202 if test "x$CXXFLAGS_overridden" = "xno"; then
203 AX_CHECK_COMPILE_FLAG([-Wall],[CXXFLAGS="$CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]])
204 AX_CHECK_COMPILE_FLAG([-Wextra],[CXXFLAGS="$CXXFLAGS -Wextra"],,[[$CXXFLAG_WERROR]])
205 AX_CHECK_COMPILE_FLAG([-Wformat],[CXXFLAGS="$CXXFLAGS -Wformat"],,[[$CXXFLAG_WERROR]])
206 AX_CHECK_COMPILE_FLAG([-Wvla],[CXXFLAGS="$CXXFLAGS -Wvla"],,[[$CXXFLAG_WERROR]])
207 AX_CHECK_COMPILE_FLAG([-Wformat-security],[CXXFLAGS="$CXXFLAGS -Wformat-security"],,[[$CXXFLAG_WERROR]])
209 ## Some compilers (gcc) ignore unknown -Wno-* options, but warn about all
210 ## unknown options if any other warning is produced. Test the -Wfoo case, and
211 ## set the -Wno-foo case if it works.
212 AX_CHECK_COMPILE_FLAG([-Wunused-parameter],[CXXFLAGS="$CXXFLAGS -Wno-unused-parameter"],,[[$CXXFLAG_WERROR]])
213 AX_CHECK_COMPILE_FLAG([-Wself-assign],[CXXFLAGS="$CXXFLAGS -Wno-self-assign"],,[[$CXXFLAG_WERROR]])
214 AX_CHECK_COMPILE_FLAG([-Wunused-local-typedef],[CXXFLAGS="$CXXFLAGS -Wno-unused-local-typedef"],,[[$CXXFLAG_WERROR]])
215 AX_CHECK_COMPILE_FLAG([-Wdeprecated-register],[CXXFLAGS="$CXXFLAGS -Wno-deprecated-register"],,[[$CXXFLAG_WERROR]])
217 CPPFLAGS="$CPPFLAGS -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS"
220 [AS_HELP_STRING([--with-utils],
221 [build zcash-cli zcash-tx (default=yes)])],
222 [build_bitcoin_utils=$withval],
223 [build_bitcoin_utils=yes])
226 [AS_HELP_STRING([--with-libs],
227 [build libraries (default=no)])],
228 [build_bitcoin_libs=$withval],
229 [build_bitcoin_libs=no])
231 AC_ARG_WITH([daemon],
232 [AS_HELP_STRING([--with-daemon],
233 [build bitcoind daemon (default=yes)])],
234 [build_bitcoind=$withval],
235 [build_bitcoind=yes])
241 #pkgconfig does more harm than good with MinGW
245 AC_CHECK_LIB([mingwthrd], [main],, AC_MSG_ERROR(lib missing))
246 AC_CHECK_LIB([kernel32], [main],, AC_MSG_ERROR(lib missing))
247 AC_CHECK_LIB([user32], [main],, AC_MSG_ERROR(lib missing))
248 AC_CHECK_LIB([gdi32], [main],, AC_MSG_ERROR(lib missing))
249 AC_CHECK_LIB([comdlg32], [main],, AC_MSG_ERROR(lib missing))
250 AC_CHECK_LIB([winspool], [main],, AC_MSG_ERROR(lib missing))
251 AC_CHECK_LIB([winmm], [main],, AC_MSG_ERROR(lib missing))
252 AC_CHECK_LIB([shell32], [main],, AC_MSG_ERROR(lib missing))
253 AC_CHECK_LIB([comctl32], [main],, AC_MSG_ERROR(lib missing))
254 AC_CHECK_LIB([ole32], [main],, AC_MSG_ERROR(lib missing))
255 AC_CHECK_LIB([oleaut32], [main],, AC_MSG_ERROR(lib missing))
256 AC_CHECK_LIB([uuid], [main],, AC_MSG_ERROR(lib missing))
257 AC_CHECK_LIB([rpcrt4], [main],, AC_MSG_ERROR(lib missing))
258 AC_CHECK_LIB([advapi32], [main],, AC_MSG_ERROR(lib missing))
259 AC_CHECK_LIB([ws2_32], [main],, AC_MSG_ERROR(lib missing))
260 AC_CHECK_LIB([mswsock], [main],, AC_MSG_ERROR(lib missing))
261 AC_CHECK_LIB([shlwapi], [main],, AC_MSG_ERROR(lib missing))
262 AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing))
263 AC_CHECK_LIB([crypt32], [main],, AC_MSG_ERROR(lib missing))
265 # -static is interpreted by libtool, where it has a different meaning.
266 # In libtool-speak, it's -all-static.
267 AX_CHECK_LINK_FLAG([[-static]],[LIBTOOL_APP_LDFLAGS="$LIBTOOL_APP_LDFLAGS -all-static"])
269 AC_PATH_PROG([MAKENSIS], [makensis], none)
270 if test x$MAKENSIS = xnone; then
271 AC_MSG_WARN("makensis not found. Cannot create installer.")
274 AC_PATH_TOOL(WINDRES, windres, none)
275 if test x$WINDRES = xnone; then
276 AC_MSG_ERROR("windres not found")
279 CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB"
280 LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE"
281 if test "x$CXXFLAGS_overridden" = "xno"; then
282 CXXFLAGS="$CXXFLAGS -w"
285 i?86-*) WINDOWS_BITS=32 ;;
286 x86_64-*) WINDOWS_BITS=64 ;;
287 *) AC_MSG_ERROR("Could not determine win32/win64 for installer") ;;
289 AC_SUBST(WINDOWS_BITS)
291 dnl libtool insists upon adding -nostdlib and a list of objects/libs to link against.
292 dnl That breaks our ability to build dll's with static libgcc/libstdc++/libssp. Override
293 dnl its command here, with the predeps/postdeps removed, and -static inserted. Postdeps are
294 dnl also overridden to prevent their insertion later.
295 dnl This should only affect dll's.
296 archive_cmds_CXX="\$CC -shared \$libobjs \$deplibs \$compiler_flags -static -o \$output_objdir/\$soname \${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker \$lib"
302 LEVELDB_TARGET_FLAGS="TARGET_OS=Darwin"
303 if test x$cross_compiling != xyes; then
305 AC_CHECK_PROG([PORT],port, port)
306 if test x$PORT = xport; then
307 dnl add default macports paths
308 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
309 LIBS="$LIBS -L/opt/local/lib"
310 if test -d /opt/local/include/db62; then
311 CPPFLAGS="$CPPFLAGS -I/opt/local/include/db62"
312 LIBS="$LIBS -L/opt/local/lib/db62"
316 AC_CHECK_PROG([BREW],brew, brew)
317 if test x$BREW = xbrew; then
318 dnl These Homebrew packages may be keg-only, meaning that they won't be found
319 dnl in expected paths because they may conflict with system files. Ask
320 dnl Homebrew where each one is located, then adjust paths accordingly.
321 dnl It's safe to add these paths even if the functionality is disabled by
322 dnl the user (--without-wallet for example).
324 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
325 bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null`
326 if test x$openssl_prefix != x; then
327 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
328 export PKG_CONFIG_PATH
330 if test x$bdb_prefix != x; then
331 CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include"
332 LIBS="$LIBS -L$bdb_prefix/lib"
341 AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool)
342 AC_PATH_TOOL([OTOOL], [otool], otool)
343 AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage)
345 dnl libtool will try to strip the static lib, which is a problem for
346 dnl cross-builds because strip attempts to call a hard-coded ld,
347 dnl which may not exist in the path. Stripping the .a is not
348 dnl necessary, so just disable it.
354 AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"])
355 CPPFLAGS="$CPPFLAGS -DMAC_OSX"
356 OBJCXXFLAGS="$CXXFLAGS"
365 if test x$use_pkgconfig = xyes; then
366 m4_ifndef([PKG_PROG_PKG_CONFIG], [AC_MSG_ERROR(PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh.)])
367 m4_ifdef([PKG_PROG_PKG_CONFIG], [
369 if test x"$PKG_CONFIG" = "x"; then
370 AC_MSG_ERROR(pkg-config not found.)
375 if test x$use_lcov = xyes; then
376 if test x$LCOV = x; then
377 AC_MSG_ERROR("lcov testing requested but lcov not found")
379 if test x$GCOV = x; then
380 AC_MSG_ERROR("lcov testing requested but gcov not found")
382 if test x$GENHTML = x; then
383 AC_MSG_ERROR("lcov testing requested but genhtml not found")
385 LCOV="$LCOV --gcov-tool=$GCOV --rc lcov_branch_coverage=1"
386 GENHTML="$GENHTML --branch-coverage"
387 AX_CHECK_COMPILE_FLAG([--coverage],[CXXFLAGS="$CXXFLAGS --coverage"],
388 [AC_MSG_ERROR("lcov testing requested but --coverage flag does not work")])
391 dnl Check for endianness
394 dnl Check for pthread compile/link requirements
397 # The following macro will add the necessary defines to bitcoin-config.h, but
398 # they also need to be passed down to any subprojects. Pull the results out of
399 # the cache and add them to CPPFLAGS.
401 # detect POSIX or GNU variant of strerror_r
404 if test x$ac_cv_sys_file_offset_bits != x &&
405 test x$ac_cv_sys_file_offset_bits != xno &&
406 test x$ac_cv_sys_file_offset_bits != xunknown; then
407 CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
410 if test x$ac_cv_sys_large_files != x &&
411 test x$ac_cv_sys_large_files != xno &&
412 test x$ac_cv_sys_large_files != xunknown; then
413 CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files"
416 AX_CHECK_LINK_FLAG([[-Wl,--large-address-aware]], [LDFLAGS="$LDFLAGS -Wl,--large-address-aware"])
418 AX_GCC_FUNC_ATTRIBUTE([visibility])
419 AX_GCC_FUNC_ATTRIBUTE([dllexport])
420 AX_GCC_FUNC_ATTRIBUTE([dllimport])
422 if test x$use_glibc_compat != xno; then
424 #glibc absorbed clock_gettime in 2.17. librt (its previous location) is safe to link
425 #in anyway for back-compat.
426 AC_CHECK_LIB([rt],[clock_gettime],, AC_MSG_ERROR(lib missing))
428 #__fdelt_chk's params and return type have changed from long unsigned int to long int.
429 # See which one is present here.
430 AC_MSG_CHECKING(__fdelt_chk type)
431 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifdef _FORTIFY_SOURCE
432 #undef _FORTIFY_SOURCE
434 #define _FORTIFY_SOURCE 2
435 #include <sys/select.h>
436 extern "C" long unsigned int __fdelt_warn(long unsigned int);]],[[]])],
437 [ fdelt_type="long unsigned int"],
438 [ fdelt_type="long int"])
439 AC_MSG_RESULT($fdelt_type)
440 AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk])
442 AC_SEARCH_LIBS([clock_gettime],[rt])
445 if test x$TARGET_OS != xwindows; then
446 # All windows code is PIC, forcing it on just adds useless compile warnings
447 AX_CHECK_COMPILE_FLAG([-fPIC],[PIC_FLAGS="-fPIC"])
450 #asan and tsan cannot be used together
451 if test x$use_asan$use_tsan == xyesyes; then
452 AC_MSG_ERROR(asan and tsan cannot be simultaneously enabled)
455 # using asan flag to enable address sanitizer and undefined behavior sanitizer
456 if test x$use_asan == xyes; then
457 AX_CHECK_LINK_FLAG([-static-libstdc++],[SAN_LDFLAGS="$SAN_LDFLAGS -static-libstdc++"],[AC_MSG_ERROR(Cannot statically link -static-libstdc++)])
458 AX_CHECK_LINK_FLAG([-static-libasan],[SAN_LDFLAGS="$SAN_LDFLAGS -static-libasan"],[AC_MSG_ERROR(Cannot statically link -static-libasan)])
459 AX_CHECK_COMPILE_FLAG([-fsanitize=address],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fsanitize=address"],[AC_MSG_ERROR(Cannot enable -fsanitize=address)])
460 AX_CHECK_COMPILE_FLAG([-fsanitize=undefined],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fsanitize=undefined"],[AC_MSG_ERROR(Cannot enable -fsanitize=undefined)])
461 AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fno-omit-frame-pointer"],[AC_MSG_ERROR(Cannot enable -fno-omit-frame-pointer)])
464 # using tsan flag to enable address thread sanitizer
465 # TSAN is supported on Linux x84_64 and tested on Ubuntu 12.04
466 # Non-position-independent executables are not supported. Use with -fPIE and -pie flags
467 # libc/libstdc++ static linking is not supported
468 if test x$use_tsan == xyes; then
469 AX_CHECK_COMPILE_FLAG([-fsanitize=thread],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fsanitize=thread"],[AC_MSG_ERROR(Cannot enable -fsanitize=thread)])
470 AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer],[SAN_CXXFLAGS="$SAN_CXXFLAGS -fno-omit-frame-pointer"],[AC_MSG_ERROR(Cannot enable -fno-omit-frame-pointer)])
473 if test x$use_hardening != xno; then
474 AX_CHECK_COMPILE_FLAG([-Wformat],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat"],[AC_MSG_ERROR(Cannot enable -Wformat)])
475 AX_CHECK_COMPILE_FLAG([-Wformat-security],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat-security"],[AC_MSG_ERROR(Cannot enable -Wformat-security)],[-Wformat])
476 AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"],[AC_MSG_ERROR(Cannot enable -Wstack-protector)])
477 AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"],[AC_MSG_ERROR(Cannot enable -fstack-protector-all)])
479 AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[
480 AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[
481 HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE"
482 ],[AC_MSG_ERROR(Cannot enable -U_FORTIFY_SOURCE)])
483 HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"
484 ],[AC_MSG_ERROR(Cannot enable -D_FORTIFY_SOURCE=2)])
486 if test x$BUILD_OS = xdarwin || test x$TARGET_OS = xwindows; then
487 # Xcode's ld (at least ld64-302.3) doesn't support -z
488 # mingw-w64's ld (at least mingw-w64 4.0.4-2) also appears to not support -z
489 AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_WARN(Cannot enable RELRO)])
490 AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_WARN(Cannot enable BIND_NOW)])
492 AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_ERROR(Cannot enable RELRO)])
493 AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_ERROR(Cannot enable BIND_NOW)])
496 if test x$TARGET_OS != xwindows; then
497 # All windows code is PIC, forcing it on just adds useless compile warnings
498 AX_CHECK_COMPILE_FLAG([-fPIE],[PIE_FLAGS="-fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)])
499 if test x$BUILD_OS = xdarwin; then
500 AX_CHECK_LINK_FLAG([[-Wl,-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-pie"],[AC_MSG_ERROR(Cannot enable -Wl,-pie)])
502 AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"],[AC_MSG_ERROR(Cannot enable -pie)])
505 # These are only available on Windows.
506 AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"],[AC_MSG_ERROR(Cannot enable --dynamicbase)])
507 AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"],[AC_MSG_ERROR(Cannot enable --nxcompat)])
508 AX_CHECK_LINK_FLAG([[-Wl,--high-entropy-va]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"],[AC_MSG_ERROR(Cannot enable ASLR)])
513 AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing))
518 dnl this flag screws up non-darwin gcc even when the check fails. special-case it.
519 if test x$TARGET_OS = xdarwin; then
520 AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"])
523 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])
524 AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])])
525 AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])])
527 AC_CHECK_DECLS([strnlen])
529 AC_CHECK_DECLS([le16toh, le32toh, le64toh, htole16, htole32, htole64, be16toh, be32toh, be64toh, htobe16, htobe32, htobe64],,,
532 #elif HAVE_SYS_ENDIAN_H
533 #include <sys/endian.h>
536 AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64],,,
538 #include <byteswap.h>
541 dnl Check for MSG_NOSIGNAL
542 AC_MSG_CHECKING(for MSG_NOSIGNAL)
543 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]],
544 [[ int f = MSG_NOSIGNAL; ]])],
545 [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ],
549 AC_MSG_CHECKING([for visibility attribute])
550 AC_LINK_IFELSE([AC_LANG_SOURCE([
551 int foo_def( void ) __attribute__((visibility("default")));
555 AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE,1,[Define if the visibility attribute is supported.])
560 if test x$use_reduce_exports = xyes; then
561 AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduce-exports.])
566 if test x$use_reduce_exports = xyes; then
567 AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"],
568 [AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduce-exports.])])
574 AM_CONDITIONAL([EMBEDDED_LEVELDB],[true])
575 AC_SUBST(LEVELDB_CPPFLAGS)
579 if test x$enable_wallet != xno; then
580 dnl Check for libdb_cxx only if wallet enabled
584 dnl Check Qpid Proton headers and library exist
585 if test x$use_proton = xyes; then
586 AC_CHECK_HEADERS([proton/connection.hpp],
588 [AC_MSG_WARN([Proton headers not found, disabling Proton support])
590 AC_CHECK_LIB([qpid-proton-cpp], [main],
591 [PROTON_LIBS="-lqpid-proton-cpp -lqpid-proton"],
592 [AC_MSG_WARN([Proton libraries not found, disabling Proton support])
595 if test x$use_proton = xyes; then
596 AC_DEFINE(ENABLE_PROTON, 1, [Define to 1 to enable Proton functions])
598 AC_DEFINE(ENABLE_PROTON, 0, [Define to 1 to enable Proton functions])
601 if test x$build_bitcoin_utils$build_bitcoind$use_tests = xnonono; then
607 if test x$use_boost = xyes; then
609 dnl Check for boost libs
610 dnl We need Boost >= 1.62 to fix a potential security bug (https://github.com/zcash/zcash/issues/1241)
611 AX_BOOST_BASE([1.62])
614 AX_BOOST_PROGRAM_OPTIONS
620 if test x$use_reduce_exports = xyes; then
621 CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS"
622 AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"])
625 if test x$use_tests = xyes; then
627 if test x$HEXDUMP = x; then
628 AC_MSG_ERROR(hexdump is required for tests)
632 if test x$use_boost = xyes; then
634 AX_BOOST_UNIT_TEST_FRAMEWORK
636 dnl Determine if -DBOOST_TEST_DYN_LINK is needed
637 AC_MSG_CHECKING([for dynamic linked boost test])
639 LIBS="$LIBS $BOOST_LDFLAGS $BOOST_UNIT_TEST_FRAMEWORK_LIB"
640 TEMP_CPPFLAGS="$CPPFLAGS"
641 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
642 AC_LINK_IFELSE([AC_LANG_SOURCE([
643 #define BOOST_TEST_DYN_LINK
644 #define BOOST_TEST_MAIN
645 #include <boost/test/unit_test.hpp>
649 [TESTDEFS="$TESTDEFS -DBOOST_TEST_DYN_LINK"],
652 CPPFLAGS="$TEMP_CPPFLAGS"
657 if test x$use_boost = xyes; then
658 BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB"
661 if test x$use_pkgconfig = xyes; then
666 PKG_CHECK_MODULES([SSL], [libssl],, [AC_MSG_ERROR(openssl not found.)])
667 PKG_CHECK_MODULES([CRYPTO], [libcrypto],,[AC_MSG_ERROR(libcrypto not found.)])
668 if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then
669 PKG_CHECK_MODULES([EVENT], [libevent],, [AC_MSG_ERROR(libevent not found.)])
670 if test x$TARGET_OS != xwindows; then
671 PKG_CHECK_MODULES([EVENT_PTHREADS], [libevent_pthreads],, [AC_MSG_ERROR(libevent_pthreads not found.)])
675 if test "x$use_zmq" = "xyes"; then
676 PKG_CHECK_MODULES([ZMQ],[libzmq >= 4],
677 [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])],
678 [AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])
679 AC_MSG_WARN([libzmq version 4.x or greater not found, disabling])
682 AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])
688 echo 'BUG: configure does not yet check for the following dependencies if pkg-config is not on the system: libcrypto++, libgmp'
690 AC_CHECK_HEADER([openssl/crypto.h],,AC_MSG_ERROR(libcrypto headers missing))
691 AC_CHECK_LIB([crypto], [main],CRYPTO_LIBS=-lcrypto, AC_MSG_ERROR(libcrypto missing))
693 AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),)
694 AC_CHECK_LIB([ssl], [main],SSL_LIBS=-lssl, AC_MSG_ERROR(libssl missing))
696 if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then
697 AC_CHECK_HEADER([event2/event.h],, AC_MSG_ERROR(libevent headers missing),)
698 AC_CHECK_LIB([event],[main],EVENT_LIBS=-levent,AC_MSG_ERROR(libevent missing))
699 if test x$TARGET_OS != xwindows; then
700 AC_CHECK_LIB([event_pthreads],[main],EVENT_PTHREADS_LIBS=-levent_pthreads,AC_MSG_ERROR(libevent_pthreads missing))
704 if test "x$use_zmq" = "xyes"; then
705 AC_CHECK_HEADER([zmq.h],
706 [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])],
707 [AC_MSG_WARN([zmq.h not found, disabling zmq support])
709 AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])])
710 AC_CHECK_LIB([zmq],[zmq_ctx_shutdown],ZMQ_LIBS=-lzmq,
711 [AC_MSG_WARN([libzmq >= 4.0 not found, disabling zmq support])
713 AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])])
715 AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])
718 if test "x$use_zmq" = "xyes"; then
719 dnl Assume libzmq was built for static linking
722 ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC"
728 # These packages don't provide pkgconfig config files across all
729 # platforms, so we use older autoconf detection mechanisms:
730 AC_CHECK_HEADER([gmp.h],,AC_MSG_ERROR(libgmp headers missing))
731 AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing)])
733 AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing))
734 AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)])
736 RUST_LIBS="-lrustzcash"
741 RUST_LIBS="$RUST_LIBS -ldl"
745 dnl Check for OpenMP support
747 [AC_DEFINE(HAVE_OPENMP, 1, [Define if OpenMP is enabled])
748 AM_CONDITIONAL([HAVE_OPENMP], [true])
749 CPPFLAGS="$CPPFLAGS -DMULTICORE"
750 CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS"],
751 [AC_MSG_WARN([OpenMP not supported, disabling multithreading])
752 AC_DEFINE(HAVE_OPENMP, 0, [Define if OpenMP is enabled])
753 AM_CONDITIONAL([HAVE_OPENMP], [false])])
755 # Gitian uses a config.site that sets depends_prefix, and then sets --prefix=/
756 # build.sh just uses --prefix
757 if test x$depends_prefix != x; then
758 LIBSNARK_DEPINST="$depends_prefix"
760 LIBSNARK_DEPINST="$prefix"
763 # Additional Zcash flags
764 AX_CHECK_COMPILE_FLAG([-fwrapv],[CXXFLAGS="$CXXFLAGS -fwrapv"])
765 AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing],[CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"])
766 AX_CHECK_COMPILE_FLAG([-Wno-builtin-declaration-mismatch],[CXXFLAGS="$CXXFLAGS -Wno-builtin-declaration-mismatch"],,[[$CXXFLAG_WERROR]])
768 LIBZCASH_LIBS="-lgmp -lgmpxx $BOOST_SYSTEM_LIB -lcrypto -lsodium $RUST_LIBS"
770 AC_MSG_CHECKING([whether to build bitcoind])
771 AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes])
772 AC_MSG_RESULT($build_bitcoind)
774 AC_MSG_CHECKING([whether to build utils (zcash-cli zcash-tx)])
775 AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes])
776 AC_MSG_RESULT($build_bitcoin_utils)
778 AC_MSG_CHECKING([whether to build libraries])
779 AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes])
780 if test x$build_bitcoin_libs = xyes; then
781 AC_DEFINE(HAVE_CONSENSUS_LIB, 1, [Define this symbol if the consensus lib has been built])
782 AC_CONFIG_FILES([libzcashconsensus.pc:libzcashconsensus.pc.in])
785 AC_MSG_RESULT($build_bitcoin_libs)
789 if test "x$use_ccache" != "xno"; then
790 AC_MSG_CHECKING(if ccache should be used)
791 if test x$CCACHE = x; then
792 if test "x$use_ccache" = "xyes"; then
793 AC_MSG_ERROR([ccache not found.]);
799 CC="$ac_cv_path_CCACHE $CC"
800 CXX="$ac_cv_path_CCACHE $CXX"
802 AC_MSG_RESULT($use_ccache)
804 if test "x$use_ccache" = "xyes"; then
805 AX_CHECK_PREPROC_FLAG([-Qunused-arguments],[CPPFLAGS="-Qunused-arguments $CPPFLAGS"])
809 AC_MSG_CHECKING([if wallet should be enabled])
810 if test x$enable_wallet != xno; then
812 AC_DEFINE_UNQUOTED([ENABLE_WALLET],[1],[Define to 1 to enable wallet functions])
819 AC_MSG_CHECKING([if mining should be enabled])
820 if test x$enable_mining != xno; then
822 AC_DEFINE(ENABLE_MINING, 1, [Define to 1 to enable mining functions])
828 AM_CONDITIONAL([ENABLE_ZMQ], [test "x$use_zmq" = "xyes"])
830 AM_CONDITIONAL([ENABLE_PROTON], [test "x$use_proton" = "xyes"])
832 AC_MSG_CHECKING([whether to build test_bitcoin])
833 if test x$use_tests = xyes; then
841 AC_MSG_CHECKING([whether to reduce exports])
842 if test x$use_reduce_exports = xyes; then
848 if test x$build_bitcoin_utils$build_bitcoin_libs$build_bitcoind$use_tests = xnononono; then
849 AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon or --enable-tests])
852 AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin])
853 AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin])
854 AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows])
855 AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes])
856 AM_CONDITIONAL([ENABLE_MINING],[test x$enable_mining = xyes])
857 AM_CONDITIONAL([ENABLE_TESTS],[test x$BUILD_TEST = xyes])
858 AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes])
859 AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes])
860 AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes])
861 AM_CONDITIONAL([ASAN],[test x$use_asan = xyes])
862 AM_CONDITIONAL([TSAN],[test x$use_tsan = xyes])
864 AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version])
865 AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version])
866 AC_DEFINE(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION, [Build revision])
867 AC_DEFINE(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD, [Version Build])
868 AC_DEFINE(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE, [Version is release])
869 AC_DEFINE(COPYRIGHT_YEAR, _COPYRIGHT_YEAR, [Version is release])
870 AC_SUBST(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR)
871 AC_SUBST(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR)
872 AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION)
873 AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD)
874 AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE)
875 AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR)
876 AC_SUBST(BITCOIN_DAEMON_NAME)
877 AC_SUBST(BITCOIN_CLI_NAME)
878 AC_SUBST(BITCOIN_TX_NAME)
881 AC_SUBST(ERROR_CXXFLAGS)
882 AC_SUBST(SAN_CXXFLAGS)
883 AC_SUBST(SAN_LDFLAGS)
884 AC_SUBST(HARDENED_CXXFLAGS)
885 AC_SUBST(HARDENED_CPPFLAGS)
886 AC_SUBST(HARDENED_LDFLAGS)
889 AC_SUBST(LIBTOOL_APP_LDFLAGS)
892 AC_SUBST(LEVELDB_TARGET_FLAGS)
893 AC_SUBST(CRYPTO_LIBS)
896 AC_SUBST(EVENT_PTHREADS_LIBS)
900 AC_SUBST(LIBSNARK_DEPINST)
901 AC_SUBST(LIBZCASH_LIBS)
902 AC_SUBST(PROTON_LIBS)
903 AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile src/test/buildenv.py])
904 AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh])
905 AC_CONFIG_FILES([qa/pull-tester/tests-config.sh],[chmod +x qa/pull-tester/tests-config.sh])
907 dnl boost's m4 checks do something really nasty: they export these vars. As a
908 dnl result, they leak into secp256k1's configure and crazy things happen.
909 dnl Until this is fixed upstream and we've synced, we'll just un-export them.
910 CPPFLAGS_TEMP="$CPPFLAGS"
912 CPPFLAGS="$CPPFLAGS_TEMP"
914 LDFLAGS_TEMP="$LDFLAGS"
916 LDFLAGS="$LDFLAGS_TEMP"
922 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
923 unset PKG_CONFIG_PATH
924 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
926 PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR"
927 unset PKG_CONFIG_LIBDIR
928 PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP"
930 ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no --enable-module-recovery"
931 AC_CONFIG_SUBDIRS([src/secp256k1 src/snark src/univalue])
935 dnl Taken from https://wiki.debian.org/RpathIssue
938 AC_MSG_RESULT([Fixing libtool for -rpath problems.])
939 sed < libtool > libtool-2 \
940 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/'
947 echo "Options used to compile and link:"
948 echo " with wallet = $enable_wallet"
949 echo " with proton = $use_proton"
950 echo " with zmq = $use_zmq"
951 echo " with test = $use_tests"
952 echo " debug enabled = $enable_debug"
953 echo " werror = $enable_werror"
955 echo " target os = $TARGET_OS"
956 echo " build os = $BUILD_OS"
959 echo " CFLAGS = $CFLAGS"
960 echo " CPPFLAGS = $CPPFLAGS"
962 echo " CXXFLAGS = $CXXFLAGS"
963 echo " LDFLAGS = $LDFLAGS"
964 echo " ARFLAGS = $ARFLAGS"