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