1AC_PREREQ([2.60])
2AC_INIT([libwallycore],[0.8.3])
3AC_CONFIG_AUX_DIR([tools/build-aux])
4AC_CONFIG_MACRO_DIR([tools/build-aux/m4])
5AC_CONFIG_SRCDIR([src/mnemonic.h])
6AC_CONFIG_HEADERS([src/config.h])
7AC_CANONICAL_HOST
8AH_TOP([#ifndef LIBWALLYCORE_CONFIG_H
9#define LIBWALLYCORE_CONFIG_H])
10AH_BOTTOM([#include "ccan_config.h"
11#endif /*LIBWALLYCORE_CONFIG_H*/])
12
13LDPATH_VAR=LD_LIBRARY_PATH
14case $host_os in
15*darwin*)
16    is_osx="yes"
17    LDPATH_VAR=DYLD_LIBRARY_PATH
18    ;;
19esac
20AM_CONDITIONAL([IS_OSX], [test "x$is_osx" == "xyes"])
21AC_SUBST([LDPATH_VAR])
22
23AM_INIT_AUTOMAKE([foreign subdir-objects])
24saved_cflags="$CFLAGS"
25LT_INIT([disable-static])
26CFLAGS="$saved_cflags"
27
28m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
29
30AC_PROG_CC
31
32# Prefer the compilers native ar/ranlib if available
33# We have to manually loop to test these as autoconf inexplicably does
34# not provide an AC_PATH_TOOLS macro for this purpose.
35candidate_ars="ar"
36candidate_ranlibs="ranlib"
37case $CC in
38*gcc*)
39    candidate_ars="gcc-ar ar"
40    candidate_ranlibs="gcc-ranlib ranlib"
41    ;;
42*clang*)
43    ver=$($CC --version | head -n 1 | cut -d' '  -f3 | cut -d'.' -f1)
44    candidate_ars="llvm-ar-$ver llvm-ar ar"
45    candidate_ranlibs="llvm-ranlib-$ver llvm-ranlib ranlib"
46    ;;
47esac
48
49if test "x$is_osx" == "xyes"; then
50    candidate_ars="libtool $candidate_ars"
51    CCDIR=`dirname $CC`
52    if test x"$CCDIR" != x"."; then
53        if test -x $CCDIR/libtool; then
54            # Use libtool from the same directory as our clang
55            AR=$CCDIR/libtool
56            candidate_ars=""
57        fi
58    fi
59fi
60
61if test -n "$candidate_ars"; then
62    for candidate in $candidate_ars; do
63        AC_PATH_TOOL(AR, $candidate)
64        if test "x$HAVE_AR" == "xyes"; then
65            break
66        fi
67    done
68fi
69case $AR in
70*libtool)
71    ARFLAGS="-static -o"
72    AR_FLAGS="-static -o"
73    AC_SUBST([ARFLAGS])
74    AC_SUBST([AR_FLAGS])
75    ;;
76esac
77
78for candidate in $candidate_ranlibs; do
79    AC_PATH_TOOL(RANLIB, $candidate)
80    if test "x$HAVE_RANLIB" == "xyes"; then
81        break
82    fi
83done
84
85AC_SUBST([AR])
86AC_SUBST([RANLIB])
87
88GNU_SED=sed
89AC_CHECK_PROG(HAVE_GSED,gsed,yes,no)
90if test "x$HAVE_GSED" == "xyes"; then
91  GNU_SED=gsed
92else
93    if test "x$is_osx" == "xyes"; then
94        AC_MSG_ERROR([gsed must be available to build this library])
95    fi
96fi
97AC_SUBST([GNU_SED])
98
99#
100# C facilities
101#
102AC_ARG_ENABLE(debug,
103    AS_HELP_STRING([--enable-debug],[enable debugging (default: no)]),
104    [debug=$enableval], [debug=no])
105AC_ARG_ENABLE(coverage,
106    AS_HELP_STRING([--enable-coverage],[enable code coverage (default: no)]),
107    [coverage=$enableval], [coverage=no])
108AC_ARG_ENABLE(tests,
109    AS_HELP_STRING([--enable-tests],[enable code tests (default: yes)]),
110    [tests=$enableval], [tests=yes])
111AC_ARG_ENABLE(elements,
112    AS_HELP_STRING([--enable-elements],[enable elements tx code (default: no)]),
113    [elements=$enableval], [elements=no])
114AC_ARG_ENABLE(builtin-memset,
115    AS_HELP_STRING([--enable-builtin-memset],[disable to add -fno-builtin-memset to compiler flags. helps with explicit_bzero/memset being elided on Linux clang 7.0.1 and up (default: yes)]),
116    [builtin_memset=$enableval], [builtin_memset=yes])
117AM_CONDITIONAL([RUN_TESTS], [test "x$tests" == "xyes"])
118AM_CONDITIONAL([BUILD_ELEMENTS], [test "x$elements" == "xyes"])
119
120AC_C_BIGENDIAN()
121AC_C_INLINE
122AC_TYPE_SIZE_T
123AC_TYPE_UINT64_T
124AC_TYPE_UINT32_T
125AC_TYPE_UINT16_T
126AC_TYPE_UINT8_T
127
128AM_CFLAGS=
129AX_CHECK_COMPILE_FLAG([-O0], [NOOPT_CFLAGS="-O0"])
130
131if test "x$debug" == "xyes"; then
132    # Make debugging easier, leave assertions in
133    AM_CFLAGS="$AM_CFLAGS $NOOPT_CFLAGS"
134    AX_CHECK_COMPILE_FLAG([-ggdb], [AM_CFLAGS="$AM_CFLAGS -ggdb"])
135    AX_CHECK_LINK_FLAG([-O0], [LDFLAGS="$LDFLAGS -O0"])
136    AX_CHECK_LINK_FLAG([-ggdb], [LDFLAGS="$LDFLAGS -ggdb"])
137    if test "x$coverage" == "xyes"; then
138        AX_CHECK_COMPILE_FLAG([-fprofile-arcs -ftest-coverage], [AM_CFLAGS="$AM_CFLAGS -fprofile-arcs -ftest-coverage"])
139        AX_CHECK_LINK_FLAG([-lgcov], [LDFLAGS="$LDFLAGS -lgcov"])
140    fi
141else
142    # Optimise and harden if we can
143    AX_CHECK_COMPILE_FLAG([-O2], [AM_CFLAGS="-O2 $AM_CFLAGS"])
144    AC_CHECK_DEFINE([_FORTIFY_SOURCE], [], [
145      AX_CHECK_COMPILE_FLAG([-D_FORTIFY_SOURCE=2],
146        [CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=2"])
147    ])
148    AX_CHECK_COMPILE_FLAG([-fstack-protector-strong], [AM_CFLAGS="$AM_CFLAGS -fstack-protector-strong"])
149    AX_CHECK_COMPILE_FLAG([-DNDEBUG=1], [AM_CFLAGS="$AM_CFLAGS -DNDEBUG=1"])
150    AX_CHECK_LINK_FLAG([-O2], [LDFLAGS="-O2 $LDFLAGS"])
151    AX_CHECK_LINK_FLAG([-Wl,-z,relro], [LDFLAGS="$LDFLAGS -Wl,-z,relro"])
152fi
153
154if test "x$elements" == "xyes"; then
155    AX_CHECK_COMPILE_FLAG([-DBUILD_ELEMENTS=1], [AM_CFLAGS="$AM_CFLAGS -DBUILD_ELEMENTS=1"])
156fi
157
158if test "x$builtin_memset" == "xno"; then
159    AX_CHECK_COMPILE_FLAG([-fno-builtin-memset], [AM_CFLAGS="$AM_CFLAGS -fno-builtin"])
160fi
161
162# -flax-vector-conversions is needed for our arm assembly
163AX_CHECK_COMPILE_FLAG([-flax-vector-conversions], [AM_CFLAGS="$AM_CFLAGS -flax-vector-conversions"])
164AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing], [NOALIAS_CFLAGS="-fno-strict-aliasing"])
165AX_CHECK_COMPILE_FLAG([-fno-builtin], [NOBUILTIN_CFLAGS="-fno-builtin"])
166
167AX_CHECK_COMPILE_FLAG([-Wformat-nonliteral], [AM_CFLAGS="-Wformat-nonliteral $AM_CFLAGS"])
168AX_CHECK_COMPILE_FLAG([-Wformat-security], [AM_CFLAGS="-Wformat-security $AM_CFLAGS"])
169AX_CHECK_COMPILE_FLAG([-Wformat], [AM_CFLAGS="-Wformat $AM_CFLAGS"])
170AX_CHECK_COMPILE_FLAG([-Wstrict-prototypes], [AM_CFLAGS="-Wstrict-prototypes $AM_CFLAGS"])
171AX_CHECK_COMPILE_FLAG([-Wshadow], [AM_CFLAGS="-Wshadow $AM_CFLAGS"])
172AX_CHECK_COMPILE_FLAG([-Wnested-externs], [AM_CFLAGS="-Wnested-externs $AM_CFLAGS"])
173AX_CHECK_COMPILE_FLAG([-Wcast-align], [AM_CFLAGS="-Wcast-align $AM_CFLAGS"])
174AX_CHECK_COMPILE_FLAG([-Wpedantic], [AM_CFLAGS="-Wpedantic $AM_CFLAGS"])
175AX_CHECK_COMPILE_FLAG([-Wextra], [AM_CFLAGS="-Wextra $AM_CFLAGS"])
176AX_CHECK_COMPILE_FLAG([-Wall], [AM_CFLAGS="-Wall $AM_CFLAGS"])
177
178# Needed for Ubuntu 20.04LTS when compiling as a library
179AX_CHECK_COMPILE_FLAG([-D_DEFAULT_SOURCE=1], [AM_CFLAGS="-D_DEFAULT_SOURCE=1 $AM_CFLAGS"])
180
181# Disable some unhelpful errors from those enabled above
182AX_CHECK_COMPILE_FLAG([-Wno-unused-function], [AM_CFLAGS="$AM_CFLAGS -Wno-unused-function"])
183AX_CHECK_COMPILE_FLAG([-Wno-long-long], [AM_CFLAGS="$AM_CFLAGS -Wno-long-long"])
184AX_CHECK_COMPILE_FLAG([-Wno-overlength-strings], [AM_CFLAGS="$AM_CFLAGS -Wno-overlength-strings"])
185AX_CHECK_COMPILE_FLAG([-Wno-variadic-macros], [AM_CFLAGS="$AM_CFLAGS -Wno-variadic-macros"])
186
187if [[ "$CC" == *"clang"* ]]; then
188    AX_CHECK_COMPILE_FLAG([-Wno-gnu-statement-expression], [AM_CFLAGS="$AM_CFLAGS -Wno-gnu-statement-expression"])
189    AX_CHECK_COMPILE_FLAG([-Wno-zero-length-array], [AM_CFLAGS="$AM_CFLAGS -Wno-zero-length-array"])
190    AX_CHECK_COMPILE_FLAG([-Wno-language-extension-token], [AM_CFLAGS="$AM_CFLAGS -Wno-language-extension-token"])
191    AX_CHECK_COMPILE_FLAG([-Wno-unknown-attributes], [AM_CFLAGS="$AM_CFLAGS -Wno-unknown-attributes"])
192fi
193AC_SUBST([NOOPT_CFLAGS])
194AC_SUBST([NOALIAS_CFLAGS])
195AC_SUBST([NOBUILTIN_CFLAGS])
196
197# Under OSX the compiler accepts this flag but the linker then fails.
198if test "x$is_osx" != "xyes"; then
199    AX_CHECK_COMPILE_FLAG([-Wl,--whole-archive], [whole_archive=yes])
200fi
201
202# SWIG versions vary in generated code quality; skip warnings
203SWIG_WARN_CFLAGS="-fno-strict-aliasing"
204AX_CHECK_COMPILE_FLAG([-Wno-shadow], [SWIG_WARN_CFLAGS="$SWIG_WARN_CFLAGS -Wno-shadow"])
205AX_CHECK_COMPILE_FLAG([-Wno-self-assign], [SWIG_WARN_CFLAGS="$SWIG_WARN_CFLAGS -Wno-self-assign"])
206AX_CHECK_COMPILE_FLAG([-Wno-missing-field-initializers], [SWIG_WARN_CFLAGS="$SWIG_WARN_CFLAGS -Wno-missing-field-initializers"])
207AC_SUBST([SWIG_WARN_CFLAGS])
208
209AC_ARG_ENABLE(export-all,
210    AS_HELP_STRING([--enable-export-all],[export all functions (for testing, default: no)]),
211    [export_all=$enableval], [export_all=no])
212AM_CONDITIONAL([EXPORT_ALL], [test "x$export_all" == "xyes"])
213
214if test "x$export_all" != "xyes"; then
215    AX_CHECK_COMPILE_FLAG([-fvisibility=hidden], [AM_CFLAGS="$AM_CFLAGS -fvisibility=hidden"])
216fi
217
218# Assume we have no unaligned access if cross-compiling
219AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(void){static int a[2];return *((int*)(((char*)a)+1)) != 0;}]])],
220              have_unaligned=1, have_unaligned=0, have_unaligned=0)
221AC_DEFINE_UNQUOTED([HAVE_UNALIGNED_ACCESS], [$have_unaligned], [Define if we have unaligned access])
222
223if test "x$is_osx" != "xyes"; then
224    # Assume we are using gcc (i.e. have this attribute) if cross-compiling
225    AC_COMPILE_IFELSE([AC_LANG_SOURCE([extern int foo(int) __attribute__((weak)); int main(void){return 0;}])],
226                      [AC_DEFINE([HAVE_ATTRIBUTE_WEAK], 1, [Define if we have __attribute__((weak))])])
227fi
228
229AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/mman.h>]],[[mmap(0,0,0,0,0,0)]])],
230               [AC_DEFINE(HAVE_MMAP, 1, [Define if we have mmap])])
231
232AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>]],[[return posix_memalign(NULL,0,0)]])],
233               [AC_DEFINE(HAVE_POSIX_MEMALIGN, 1, [Define if we have posix_memalign])])
234
235AC_CHECK_FUNCS([memset_s explicit_bzero explicit_memset])
236
237AC_MSG_CHECKING(whether we can use inline asm code)
238AC_LINK_IFELSE([AC_LANG_PROGRAM([[
239]], [[
240int a = 42;
241int *pnt = &a;
242__asm__ __volatile__ ("" : : "r"(pnt) : "memory");
243]])],
244  [AC_MSG_RESULT(yes)
245   AC_DEFINE([HAVE_INLINE_ASM], [1], [inline asm code can be used])],
246  [AC_MSG_RESULT(no)]
247)
248
249AC_CHECK_HEADERS([byteswap.h, sys/mman.h])
250
251AC_ARG_ENABLE(clear-tests,
252    AS_HELP_STRING([--enable-clear-tests],[enable tests for memory clearing (default: yes)]),
253    [clear_tests=$enableval], [clear_tests=yes])
254
255AX_PTHREAD([ac_have_pthread=yes], [ac_have_pthread=no])
256AM_CONDITIONAL([USE_PTHREAD], [test "x$ac_have_pthread" == "xyes" -a "x$clear_tests" == "xyes"])
257if test "x$ac_have_pthread" == "xyes"; then
258    AC_DEFINE([HAVE_PTHREAD], 1, [Define if we have pthread support])
259    AC_CHECK_HEADERS([asm/page.h])
260fi
261
262#
263# libsecp256k1
264#
265# FIXME: This is needed to force libtool to use all object files from secp.
266#        We can only build secp properly by recursively invoking
267#        configure/make, and can't include it as a noinst_ library. Libtool
268#        assumes that such libraries will be installed along with our library
269#        target and so won't force all object files in the library to be
270#        included in ours - despite the fact that we are making a shared
271#        library and linking to a static one. This is broken and we work
272#        around it by hacking the whole-archive flags into the _LDADD variable
273#        for wallycore.
274#        Because automake tries to police its users very strictly and fails
275#        hard when flags are passed in this way, we have to substitute the
276#        flags here.
277#        Because libtool both intercepts -Wl and arbitrarily re-orders its
278#        command line inputs, we have to concoct a single expression to
279#        enforce linking that cannot be split, hence the below expression.
280LIBADD_SECP256K1="secp256k1/.libs/libsecp256k1.a"
281if test "x$whole_archive" == "xyes"; then
282    LIBADD_SECP256K1="-Wl,--whole-archive,secp256k1/.libs/libsecp256k1.a,--no-whole-archive"
283fi
284AC_SUBST([LIBADD_SECP256K1])
285
286#
287# Python facilities
288#
289AC_ARG_ENABLE(python-manylinux,
290    AS_HELP_STRING([--enable-python-manylinux],[enable manylinux Python compatibility (default: no)]),
291    [python_manylinux=$enableval], [python_manylinux=no])
292AM_CONDITIONAL([PYTHON_MANYLINUX], [test "x$python_manylinux" == "xyes"])
293
294AX_PYTHON_DEVEL([>= '2.7.0'])
295AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ""])
296AM_CONDITIONAL([RUN_PYTHON_TESTS], [test "$PYTHON" != "" -a "x$pythonexists" == "xyes"])
297
298#
299# SWIG
300#
301AC_PROG_SWIG
302
303AC_ARG_ENABLE(swig-python,
304    AS_HELP_STRING([--enable-swig-python],[enable the SWIG Python interface (default: no)]),
305    [swig_python=$enableval], [swig_python=no])
306AM_CONDITIONAL([USE_SWIG_PYTHON], [test "x$swig_python" == "xyes"])
307
308if test "x$swig_python" == "xyes"; then
309    if test "x$pythonexists" != "xyes"; then
310        AC_MSG_FAILURE([ERROR: No usable Python was found for swig-python])
311    fi
312    SWIG_PYTHON
313    AX_CHECK_COMPILE_FLAG([-DSWIG_PYTHON_BUILD=1], [AM_CFLAGS="$AM_CFLAGS -DSWIG_PYTHON_BUILD=1"])
314fi
315
316AC_ARG_ENABLE(js-wrappers,
317    AS_HELP_STRING([--enable-js-wrappers],[enable the Javascript interface wrappers (default: no)]),
318    [js_wrappers=$enableval], [js_wrappers=no])
319AM_CONDITIONAL([USE_JS_WRAPPERS], [test "x$js_wrappers" == "xyes"])
320
321if test "x$js_wrappers" == "xyes"; then
322    if test "x$pythonexists" != "xyes"; then
323        AC_MSG_FAILURE([ERROR: No usable Python was found for generating js wrappers])
324    fi
325    if test "x$swig_python" != "xyes"; then
326        SWIG_PYTHON
327    fi
328    AX_CHECK_COMPILE_FLAG([-DSWIG_JAVASCRIPT_BUILD=1], [AM_CFLAGS="$AM_CFLAGS -DSWIG_JAVASCRIPT_BUILD=1"])
329    AC_CHECK_PROG(HAVE_YARN,yarn,yes,no)
330    if test "x$HAVE_YARN" != "xyes"; then
331        AC_MSG_FAILURE([ERROR: No usable yarn was found, please install yarn before re-running])
332    fi
333fi
334
335# Set node-gyp flags regardless of  JS enablement; they are used for wrapper
336# generation which can be usefully run without enabling JS/requiring yarn
337NODE_GYP_DIR="Release"
338if test "x$debug" == "xyes"; then
339    NODE_GYP_FLAGS="--debug"
340    NODE_GYP_DIR="Debug"
341fi
342AC_SUBST([NODE_GYP_FLAGS])
343AC_SUBST([NODE_GYP_DIR])
344
345AC_ARG_ENABLE(swig-java,
346    AS_HELP_STRING([--enable-swig-java],[enable the SWIG java (JNI) interface (default: no)]),
347    [swig_java=$enableval], [swig_java=no])
348AM_CONDITIONAL([USE_SWIG_JAVA], [test "x$swig_java" == "xyes"])
349
350if test "x$swig_java" == "xyes"; then
351    saved_JAVA_HOME=$JAVA_HOME
352    if test x"$cross_compiling" = "xyes"; then
353        # For cross compiling we assume the users host O/S Java install is not
354        # usable and that they have provided suitable FLAGS/LDFLAGS
355        JAVA_HOME=/does_not_exist
356    fi
357    export JAVA_HOME
358    AX_JNI_INCLUDE_DIR
359    export JAVA_HOME=$saved_JAVA_HOME
360    for JNI_DIR in $JNI_INCLUDE_DIRS; do
361        SWIG_JAVA_CPPFLAGS="$SWIG_JAVA_CPPFLAGS -I$JNI_DIR"
362    done
363    SWIG_JAVA_OPT="-java"
364    AC_SUBST([SWIG_JAVA_CPPFLAGS])
365    AC_SUBST([SWIG_JAVA_OPT])
366    AX_CHECK_COMPILE_FLAG([-DSWIG_JAVA_BUILD=1], [AM_CFLAGS="$AM_CFLAGS -DSWIG_JAVA_BUILD=1"])
367fi
368
369if test "x$JAVA_HOME" != "x"; then
370    JAVA="$JAVA_HOME/bin/java"
371    AC_SUBST([JAVA])
372    JAVAC="$JAVA_HOME/bin/javac"
373    AC_SUBST([JAVAC])
374    JAR="$JAVA_HOME/bin/jar"
375    AC_SUBST([JAR])
376else
377    AC_CHECK_PROGS(JAVA, [java])
378    AC_CHECK_PROGS(JAVAC, [javac])
379    AC_CHECK_PROGS(JAR, [jar])
380fi
381AM_CONDITIONAL([HAVE_JAVA], [test "x$JAVA" != "x"])
382AM_CONDITIONAL([HAVE_JAVAC], [test "x$JAVAC" != "x"])
383if test "x$swig_java" == "xyes"; then
384    if test "x$JAVAC" != "x"; then
385        if test "x$JAVA" != "x"; then
386            # Only run tests if we have java-swig, compiler and interpreter
387            run_java_tests="yes"
388        fi
389    fi
390fi
391AM_CONDITIONAL([RUN_JAVA_TESTS], [test "x$run_java_tests" != "x"])
392JAVAC_TARGET=1.7
393AC_SUBST([JAVAC_TARGET])
394
395AC_SUBST([AM_CFLAGS])
396
397if test "x$enable_static" == "xyes"; then
398    CTEST_EXTRA_STATIC='$(libwallycore_la_LIBADD)'
399fi
400AC_SUBST([CTEST_EXTRA_STATIC])
401
402AM_CONDITIONAL([SHARED_BUILD_ENABLED], [test "x$enable_shared" == "xyes"])
403
404AC_CONFIG_FILES([
405 Makefile
406 src/Makefile
407 src/wallycore.pc
408])
409
410secp_asm="--with-asm=auto"
411if test "x$debug" == "xyes"; then
412    secp_asm="--with-asm=no"
413fi
414
415if test x"$cross_compiling" = "xyes"; then
416    # For cross compiling we assume the users host O/S Java install is not
417    # usable and that they have provided suitable FLAGS/LDFLAGS
418    export JAVA_HOME=/does_not_exist
419fi
420export CC
421export CFLAGS
422export AR
423export ARFLAGS
424export AR_FLAGS
425export LD
426export LDFLAGS
427ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no --enable-experimental --enable-module-ecdh --enable-module-recovery --enable-module-ecdsa-s2c --enable-module-rangeproof --enable-module-surjectionproof --enable-module-whitelist --enable-module-generator --enable-openssl-tests=no --enable-tests=no --enable-exhaustive-tests=no --enable-benchmark=no --disable-dependency-tracking ${secp_asm}"
428AC_CONFIG_SUBDIRS([src/secp256k1])
429
430
431AC_OUTPUT
432