2 AC_INIT([libsecp256k1],[0.1])
3 AC_CONFIG_AUX_DIR([build-aux])
4 AC_CONFIG_MACRO_DIR([build-aux/m4])
6 AH_TOP([#ifndef LIBSECP256K1_CONFIG_H])
7 AH_TOP([#define LIBSECP256K1_CONFIG_H])
8 AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/])
9 AM_INIT_AUTOMAKE([foreign subdir-objects])
11 # Set -g if CFLAGS are not already set, which matches the default autoconf
12 # behavior (see PROG_CC in the Autoconf manual) with the exception that we don't
13 # set -O2 here because we set it in any case (see further down).
17 dnl make the compilation flags quiet unless V=1 is used
18 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
23 AC_PATH_TOOL(RANLIB, ranlib)
24 AC_PATH_TOOL(STRIP, strip)
30 if test x"$ac_cv_prog_cc_c89" = x"no"; then
31 AC_MSG_ERROR([c89 compiler support required])
37 if test x$cross_compiling != xyes; then
38 AC_PATH_PROG([BREW],brew,)
39 if test x$BREW != x; then
40 dnl These Homebrew packages may be keg-only, meaning that they won't be found
41 dnl in expected paths because they may conflict with system files. Ask
42 dnl Homebrew where each one is located, then adjust paths accordingly.
44 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
45 gmp_prefix=`$BREW --prefix gmp 2>/dev/null`
46 if test x$openssl_prefix != x; then
47 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
48 export PKG_CONFIG_PATH
49 CRYPTO_CPPFLAGS="-I$openssl_prefix/include"
51 if test x$gmp_prefix != x; then
52 GMP_CPPFLAGS="-I$gmp_prefix/include"
53 GMP_LIBS="-L$gmp_prefix/lib"
56 AC_PATH_PROG([PORT],port,)
57 dnl if homebrew isn't installed and macports is, add the macports default paths
59 if test x$PORT != x; then
60 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
61 LDFLAGS="$LDFLAGS -L/opt/local/lib"
70 warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wundef -Wno-unused-function -Wno-long-long -Wno-overlength-strings"
71 saved_CFLAGS="$CFLAGS"
72 CFLAGS="$warn_CFLAGS $CFLAGS"
73 AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
74 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
75 [ AC_MSG_RESULT([yes]) ],
77 CFLAGS="$saved_CFLAGS"
80 saved_CFLAGS="$CFLAGS"
81 CFLAGS="-fvisibility=hidden $CFLAGS"
82 AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
83 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
84 [ AC_MSG_RESULT([yes]) ],
86 CFLAGS="$saved_CFLAGS"
89 AC_ARG_ENABLE(benchmark,
90 AS_HELP_STRING([--enable-benchmark],[compile benchmark [default=yes]]),
91 [use_benchmark=$enableval],
94 AC_ARG_ENABLE(coverage,
95 AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis [default=no]]),
96 [enable_coverage=$enableval],
100 AS_HELP_STRING([--enable-tests],[compile tests [default=yes]]),
101 [use_tests=$enableval],
104 AC_ARG_ENABLE(openssl_tests,
105 AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests [default=auto]]),
106 [enable_openssl_tests=$enableval],
107 [enable_openssl_tests=auto])
109 AC_ARG_ENABLE(experimental,
110 AS_HELP_STRING([--enable-experimental],[allow experimental configure options [default=no]]),
111 [use_experimental=$enableval],
112 [use_experimental=no])
114 AC_ARG_ENABLE(exhaustive_tests,
115 AS_HELP_STRING([--enable-exhaustive-tests],[compile exhaustive tests [default=yes]]),
116 [use_exhaustive_tests=$enableval],
117 [use_exhaustive_tests=yes])
119 AC_ARG_ENABLE(endomorphism,
120 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism [default=no]]),
121 [use_endomorphism=$enableval],
122 [use_endomorphism=no])
124 AC_ARG_ENABLE(ecmult_static_precomputation,
125 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing [default=auto]]),
126 [use_ecmult_static_precomputation=$enableval],
127 [use_ecmult_static_precomputation=auto])
129 AC_ARG_ENABLE(module_ecdh,
130 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),
131 [enable_module_ecdh=$enableval],
132 [enable_module_ecdh=no])
134 AC_ARG_ENABLE(module_recovery,
135 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module [default=no]]),
136 [enable_module_recovery=$enableval],
137 [enable_module_recovery=no])
139 AC_ARG_ENABLE(module_extrakeys,
140 AS_HELP_STRING([--enable-module-extrakeys],[enable extrakeys module (experimental)]),
141 [enable_module_extrakeys=$enableval],
142 [enable_module_extrakeys=no])
144 AC_ARG_ENABLE(module_schnorrsig,
145 AS_HELP_STRING([--enable-module-schnorrsig],[enable schnorrsig module (experimental)]),
146 [enable_module_schnorrsig=$enableval],
147 [enable_module_schnorrsig=no])
149 AC_ARG_ENABLE(external_default_callbacks,
150 AS_HELP_STRING([--enable-external-default-callbacks],[enable external default callback functions [default=no]]),
151 [use_external_default_callbacks=$enableval],
152 [use_external_default_callbacks=no])
154 dnl Test-only override of the (autodetected by the C code) "widemul" setting.
155 dnl Legal values are int64 (for [u]int64_t), int128 (for [unsigned] __int128), and auto (the default).
156 AC_ARG_WITH([test-override-wide-multiply], [] ,[set_widemul=$withval], [set_widemul=auto])
158 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
159 [bignum implementation to use [default=auto]])],[req_bignum=$withval], [req_bignum=auto])
161 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto],
162 [assembly optimizations to useĀ (experimental: arm) [default=auto]])],[req_asm=$withval], [req_asm=auto])
164 AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE|auto],
165 [window size for ecmult precomputation for verification, specified as integer in range [2..24].]
166 [Larger values result in possibly better performance at the cost of an exponentially larger precomputed table.]
167 [The table will store 2^(SIZE-2) * 64 bytes of data but can be larger in memory due to platform-specific padding and alignment.]
168 [If the endomorphism optimization is enabled, two tables of this size are used instead of only one.]
169 ["auto" is a reasonable setting for desktop machines (currently 15). [default=auto]]
171 [req_ecmult_window=$withval], [req_ecmult_window=auto])
173 AC_ARG_WITH([ecmult-gen-precision], [AS_HELP_STRING([--with-ecmult-gen-precision=2|4|8|auto],
174 [Precision bits to tune the precomputed table size for signing.]
175 [The size of the table is 32kB for 2 bits, 64kB for 4 bits, 512kB for 8 bits of precision.]
176 [A larger table size usually results in possible faster signing.]
177 ["auto" is a reasonable setting for desktop machines (currently 4). [default=auto]]
179 [req_ecmult_gen_precision=$withval], [req_ecmult_gen_precision=auto])
181 AC_CHECK_HEADER([valgrind/memcheck.h], [enable_valgrind=yes], [enable_valgrind=no], [])
182 AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"])
184 if test x"$enable_coverage" = x"yes"; then
185 AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code])
186 CFLAGS="-O0 --coverage $CFLAGS"
187 LDFLAGS="--coverage $LDFLAGS"
192 if test x"$use_ecmult_static_precomputation" != x"no"; then
193 # Temporarily switch to an environment for the native compiler
194 save_cross_compiling=$cross_compiling
198 SAVE_CFLAGS="$CFLAGS"
199 CFLAGS="$CFLAGS_FOR_BUILD"
200 SAVE_CPPFLAGS="$CPPFLAGS"
201 CPPFLAGS="$CPPFLAGS_FOR_BUILD"
202 SAVE_LDFLAGS="$LDFLAGS"
203 LDFLAGS="$LDFLAGS_FOR_BUILD"
205 warn_CFLAGS_FOR_BUILD="-Wall -Wextra -Wno-unused-function"
206 saved_CFLAGS="$CFLAGS"
207 CFLAGS="$warn_CFLAGS_FOR_BUILD $CFLAGS"
208 AC_MSG_CHECKING([if native ${CC_FOR_BUILD} supports ${warn_CFLAGS_FOR_BUILD}])
209 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
210 [ AC_MSG_RESULT([yes]) ],
211 [ AC_MSG_RESULT([no])
212 CFLAGS="$saved_CFLAGS"
215 AC_MSG_CHECKING([for working native compiler: ${CC_FOR_BUILD}])
217 [AC_LANG_PROGRAM([], [])],
218 [working_native_cc=yes],
219 [working_native_cc=no],[:])
221 CFLAGS_FOR_BUILD="$CFLAGS"
223 # Restore the environment
224 cross_compiling=$save_cross_compiling
226 CFLAGS="$SAVE_CFLAGS"
227 CPPFLAGS="$SAVE_CPPFLAGS"
228 LDFLAGS="$SAVE_LDFLAGS"
230 if test x"$working_native_cc" = x"no"; then
233 m4_define([please_set_for_build], [Please set CC_FOR_BUILD, CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and/or LDFLAGS_FOR_BUILD.])
234 if test x"$use_ecmult_static_precomputation" = x"yes"; then
235 AC_MSG_ERROR([native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
237 AC_MSG_WARN([Disabling statically generated ecmult table because the native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
247 if test x"$req_asm" = x"auto"; then
249 if test x"$has_64bit_asm" = x"yes"; then
252 if test x"$set_asm" = x; then
260 if test x"$has_64bit_asm" != x"yes"; then
261 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
269 AC_MSG_ERROR([invalid assembly optimization selection])
274 if test x"$req_bignum" = x"auto"; then
276 if test x"$has_gmp" = x"yes"; then
280 if test x"$set_bignum" = x; then
284 set_bignum=$req_bignum
288 if test x"$has_gmp" != x"yes"; then
289 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
295 AC_MSG_ERROR([invalid bignum implementation selection])
300 # select assembly optimization
305 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
313 AC_MSG_ERROR([invalid assembly optimizations])
317 # select wide multiplication implementation
320 AC_DEFINE(USE_FORCE_WIDEMUL_INT128, 1, [Define this symbol to force the use of the (unsigned) __int128 based wide multiplication implementation])
323 AC_DEFINE(USE_FORCE_WIDEMUL_INT64, 1, [Define this symbol to force the use of the (u)int64_t based wide multiplication implementation])
328 AC_MSG_ERROR([invalid wide multiplication implementation])
332 # select bignum implementation
335 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
336 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
337 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
338 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
341 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
342 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
343 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
346 AC_MSG_ERROR([invalid bignum implementation])
350 #set ecmult window size
351 if test x"$req_ecmult_window" = x"auto"; then
354 set_ecmult_window=$req_ecmult_window
357 error_window_size=['window size for ecmult precomputation not an integer in range [2..24] or "auto"']
358 case $set_ecmult_window in
361 AC_MSG_ERROR($error_window_size)
364 if test "$set_ecmult_window" -lt 2 -o "$set_ecmult_window" -gt 24 ; then
366 AC_MSG_ERROR($error_window_size)
368 AC_DEFINE_UNQUOTED(ECMULT_WINDOW_SIZE, $set_ecmult_window, [Set window size for ecmult precomputation])
372 #set ecmult gen precision
373 if test x"$req_ecmult_gen_precision" = x"auto"; then
374 set_ecmult_gen_precision=4
376 set_ecmult_gen_precision=$req_ecmult_gen_precision
379 case $set_ecmult_gen_precision in
381 AC_DEFINE_UNQUOTED(ECMULT_GEN_PREC_BITS, $set_ecmult_gen_precision, [Set ecmult gen precision bits])
384 AC_MSG_ERROR(['ecmult gen precision not 2, 4, 8 or "auto"'])
388 if test x"$use_tests" = x"yes"; then
390 if test x"$has_openssl_ec" = x"yes"; then
391 if test x"$enable_openssl_tests" != x"no"; then
392 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
393 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS $CRYPTO_CPPFLAGS"
394 SECP_TEST_LIBS="$CRYPTO_LIBS"
398 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
403 if test x"$enable_openssl_tests" = x"yes"; then
404 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
408 if test x"$enable_openssl_tests" = x"yes"; then
409 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
413 if test x"$set_bignum" = x"gmp"; then
414 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
415 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
418 if test x"$use_endomorphism" = x"yes"; then
419 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
422 if test x"$set_precomp" = x"yes"; then
423 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
426 if test x"$enable_module_ecdh" = x"yes"; then
427 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
430 if test x"$enable_module_recovery" = x"yes"; then
431 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
434 if test x"$enable_module_schnorrsig" = x"yes"; then
435 AC_DEFINE(ENABLE_MODULE_SCHNORRSIG, 1, [Define this symbol to enable the schnorrsig module])
436 enable_module_extrakeys=yes
439 # Test if extrakeys is set after the schnorrsig module to allow the schnorrsig
440 # module to set enable_module_extrakeys=yes
441 if test x"$enable_module_extrakeys" = x"yes"; then
442 AC_DEFINE(ENABLE_MODULE_EXTRAKEYS, 1, [Define this symbol to enable the extrakeys module])
445 if test x"$use_external_asm" = x"yes"; then
446 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
449 if test x"$use_external_default_callbacks" = x"yes"; then
450 AC_DEFINE(USE_EXTERNAL_DEFAULT_CALLBACKS, 1, [Define this symbol if an external implementation of the default callbacks is used])
453 if test x"$enable_experimental" = x"yes"; then
454 AC_MSG_NOTICE([******])
455 AC_MSG_NOTICE([WARNING: experimental build])
456 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
457 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
458 AC_MSG_NOTICE([Building extrakeys module: $enable_module_extrakeys])
459 AC_MSG_NOTICE([Building schnorrsig module: $enable_module_schnorrsig])
460 AC_MSG_NOTICE([******])
462 if test x"$enable_module_ecdh" = x"yes"; then
463 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
465 if test x"$enable_module_extrakeys" = x"yes"; then
466 AC_MSG_ERROR([extrakeys module is experimental. Use --enable-experimental to allow.])
468 if test x"$enable_module_schnorrsig" = x"yes"; then
469 AC_MSG_ERROR([schnorrsig module is experimental. Use --enable-experimental to allow.])
471 if test x"$set_asm" = x"arm"; then
472 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
476 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
477 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
478 AC_SUBST(SECP_INCLUDES)
480 AC_SUBST(SECP_TEST_LIBS)
481 AC_SUBST(SECP_TEST_INCLUDES)
482 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
483 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
484 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
485 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
486 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
487 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
488 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
489 AM_CONDITIONAL([ENABLE_MODULE_EXTRAKEYS], [test x"$enable_module_extrakeys" = x"yes"])
490 AM_CONDITIONAL([ENABLE_MODULE_SCHNORRSIG], [test x"$enable_module_schnorrsig" = x"yes"])
491 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
492 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
494 dnl make sure nothing new is exported so that we don't break the cache
495 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
496 unset PKG_CONFIG_PATH
497 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
502 echo "Build Options:"
503 echo " with endomorphism = $use_endomorphism"
504 echo " with ecmult precomp = $set_precomp"
505 echo " with external callbacks = $use_external_default_callbacks"
506 echo " with benchmarks = $use_benchmark"
507 echo " with coverage = $enable_coverage"
508 echo " module ecdh = $enable_module_ecdh"
509 echo " module recovery = $enable_module_recovery"
510 echo " module extrakeys = $enable_module_extrakeys"
511 echo " module schnorrsig = $enable_module_schnorrsig"
513 echo " asm = $set_asm"
514 echo " bignum = $set_bignum"
515 echo " ecmult window size = $set_ecmult_window"
516 echo " ecmult gen prec. bits = $set_ecmult_gen_precision"
517 dnl Hide test-only options unless they're used.
518 if test x"$set_widemul" != xauto; then
519 echo " wide multiplication = $set_widemul"
522 echo " valgrind = $enable_valgrind"
524 echo " CFLAGS = $CFLAGS"
525 echo " CPPFLAGS = $CPPFLAGS"
526 echo " LDFLAGS = $LDFLAGS"