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 -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(external_default_callbacks,
140 AS_HELP_STRING([--enable-external-default-callbacks],[enable external default callback functions [default=no]]),
141 [use_external_default_callbacks=$enableval],
142 [use_external_default_callbacks=no])
144 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
145 [finite field implementation to use [default=auto]])],[req_field=$withval], [req_field=auto])
147 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
148 [bignum implementation to use [default=auto]])],[req_bignum=$withval], [req_bignum=auto])
150 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
151 [scalar implementation to use [default=auto]])],[req_scalar=$withval], [req_scalar=auto])
153 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto],
154 [assembly optimizations to useĀ (experimental: arm) [default=auto]])],[req_asm=$withval], [req_asm=auto])
156 AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE|auto],
157 [window size for ecmult precomputation for verification, specified as integer in range [2..24].]
158 [Larger values result in possibly better performance at the cost of an exponentially larger precomputed table.]
159 [The table will store 2^(SIZE-2) * 64 bytes of data but can be larger in memory due to platform-specific padding and alignment.]
160 [If the endomorphism optimization is enabled, two tables of this size are used instead of only one.]
161 ["auto" is a reasonable setting for desktop machines (currently 15). [default=auto]]
163 [req_ecmult_window=$withval], [req_ecmult_window=auto])
165 AC_ARG_WITH([ecmult-gen-precision], [AS_HELP_STRING([--with-ecmult-gen-precision=2|4|8|auto],
166 [Precision bits to tune the precomputed table size for signing.]
167 [The size of the table is 32kB for 2 bits, 64kB for 4 bits, 512kB for 8 bits of precision.]
168 [A larger table size usually results in possible faster signing.]
169 ["auto" is a reasonable setting for desktop machines (currently 4). [default=auto]]
171 [req_ecmult_gen_precision=$withval], [req_ecmult_gen_precision=auto])
173 AC_CHECK_TYPES([__int128])
175 AC_CHECK_HEADER([valgrind/memcheck.h], [enable_valgrind=yes], [enable_valgrind=no], [])
176 AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"])
178 if test x"$enable_coverage" = x"yes"; then
179 AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code])
180 CFLAGS="-O0 --coverage $CFLAGS"
181 LDFLAGS="--coverage $LDFLAGS"
186 if test x"$use_ecmult_static_precomputation" != x"no"; then
187 # Temporarily switch to an environment for the native compiler
188 save_cross_compiling=$cross_compiling
192 SAVE_CFLAGS="$CFLAGS"
193 CFLAGS="$CFLAGS_FOR_BUILD"
194 SAVE_CPPFLAGS="$CPPFLAGS"
195 CPPFLAGS="$CPPFLAGS_FOR_BUILD"
196 SAVE_LDFLAGS="$LDFLAGS"
197 LDFLAGS="$LDFLAGS_FOR_BUILD"
199 warn_CFLAGS_FOR_BUILD="-Wall -Wextra -Wno-unused-function"
200 saved_CFLAGS="$CFLAGS"
201 CFLAGS="$warn_CFLAGS_FOR_BUILD $CFLAGS"
202 AC_MSG_CHECKING([if native ${CC_FOR_BUILD} supports ${warn_CFLAGS_FOR_BUILD}])
203 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
204 [ AC_MSG_RESULT([yes]) ],
205 [ AC_MSG_RESULT([no])
206 CFLAGS="$saved_CFLAGS"
209 AC_MSG_CHECKING([for working native compiler: ${CC_FOR_BUILD}])
211 [AC_LANG_PROGRAM([], [])],
212 [working_native_cc=yes],
213 [working_native_cc=no],[:])
215 CFLAGS_FOR_BUILD="$CFLAGS"
217 # Restore the environment
218 cross_compiling=$save_cross_compiling
220 CFLAGS="$SAVE_CFLAGS"
221 CPPFLAGS="$SAVE_CPPFLAGS"
222 LDFLAGS="$SAVE_LDFLAGS"
224 if test x"$working_native_cc" = x"no"; then
227 m4_define([please_set_for_build], [Please set CC_FOR_BUILD, CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and/or LDFLAGS_FOR_BUILD.])
228 if test x"$use_ecmult_static_precomputation" = x"yes"; then
229 AC_MSG_ERROR([native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
231 AC_MSG_WARN([Disabling statically generated ecmult table because the native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
241 if test x"$req_asm" = x"auto"; then
243 if test x"$has_64bit_asm" = x"yes"; then
246 if test x"$set_asm" = x; then
254 if test x"$has_64bit_asm" != x"yes"; then
255 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
263 AC_MSG_ERROR([invalid assembly optimization selection])
268 if test x"$req_field" = x"auto"; then
269 if test x"set_asm" = x"x86_64"; then
272 if test x"$set_field" = x; then
274 if test x"$has_int128" = x"yes"; then
278 if test x"$set_field" = x; then
285 if test x"$set_asm" != x"x86_64"; then
287 if test x"$has_int128" != x"yes"; then
288 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
295 AC_MSG_ERROR([invalid field implementation selection])
300 if test x"$req_scalar" = x"auto"; then
302 if test x"$has_int128" = x"yes"; then
305 if test x"$set_scalar" = x; then
309 set_scalar=$req_scalar
313 if test x"$has_int128" != x"yes"; then
314 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
320 AC_MSG_ERROR([invalid scalar implementation selected])
325 if test x"$req_bignum" = x"auto"; then
327 if test x"$has_gmp" = x"yes"; then
331 if test x"$set_bignum" = x; then
335 set_bignum=$req_bignum
339 if test x"$has_gmp" != x"yes"; then
340 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
346 AC_MSG_ERROR([invalid bignum implementation selection])
351 # select assembly optimization
356 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
364 AC_MSG_ERROR([invalid assembly optimizations])
368 # select field implementation
371 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
374 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
377 AC_MSG_ERROR([invalid field implementation])
381 # select bignum implementation
384 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
385 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
386 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
387 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
390 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
391 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
392 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
395 AC_MSG_ERROR([invalid bignum implementation])
399 #select scalar implementation
402 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
405 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
408 AC_MSG_ERROR([invalid scalar implementation])
412 #set ecmult window size
413 if test x"$req_ecmult_window" = x"auto"; then
416 set_ecmult_window=$req_ecmult_window
419 error_window_size=['window size for ecmult precomputation not an integer in range [2..24] or "auto"']
420 case $set_ecmult_window in
423 AC_MSG_ERROR($error_window_size)
426 if test "$set_ecmult_window" -lt 2 -o "$set_ecmult_window" -gt 24 ; then
428 AC_MSG_ERROR($error_window_size)
430 AC_DEFINE_UNQUOTED(ECMULT_WINDOW_SIZE, $set_ecmult_window, [Set window size for ecmult precomputation])
434 #set ecmult gen precision
435 if test x"$req_ecmult_gen_precision" = x"auto"; then
436 set_ecmult_gen_precision=4
438 set_ecmult_gen_precision=$req_ecmult_gen_precision
441 case $set_ecmult_gen_precision in
443 AC_DEFINE_UNQUOTED(ECMULT_GEN_PREC_BITS, $set_ecmult_gen_precision, [Set ecmult gen precision bits])
446 AC_MSG_ERROR(['ecmult gen precision not 2, 4, 8 or "auto"'])
450 if test x"$use_tests" = x"yes"; then
452 if test x"$has_openssl_ec" = x"yes"; then
453 if test x"$enable_openssl_tests" != x"no"; then
454 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
455 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS $CRYPTO_CPPFLAGS"
456 SECP_TEST_LIBS="$CRYPTO_LIBS"
460 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
465 if test x"$enable_openssl_tests" = x"yes"; then
466 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
470 if test x"$enable_openssl_tests" = x"yes"; then
471 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
475 if test x"$set_bignum" = x"gmp"; then
476 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
477 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
480 if test x"$use_endomorphism" = x"yes"; then
481 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
484 if test x"$set_precomp" = x"yes"; then
485 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
488 if test x"$enable_module_ecdh" = x"yes"; then
489 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
492 if test x"$enable_module_recovery" = x"yes"; then
493 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
498 if test x"$use_external_asm" = x"yes"; then
499 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
502 if test x"$use_external_default_callbacks" = x"yes"; then
503 AC_DEFINE(USE_EXTERNAL_DEFAULT_CALLBACKS, 1, [Define this symbol if an external implementation of the default callbacks is used])
506 if test x"$enable_experimental" = x"yes"; then
507 AC_MSG_NOTICE([******])
508 AC_MSG_NOTICE([WARNING: experimental build])
509 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
510 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
511 AC_MSG_NOTICE([******])
513 if test x"$enable_module_ecdh" = x"yes"; then
514 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
516 if test x"$set_asm" = x"arm"; then
517 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
521 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
522 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
523 AC_SUBST(SECP_INCLUDES)
525 AC_SUBST(SECP_TEST_LIBS)
526 AC_SUBST(SECP_TEST_INCLUDES)
527 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
528 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
529 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
530 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
531 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
532 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
533 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
534 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
535 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
537 dnl make sure nothing new is exported so that we don't break the cache
538 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
539 unset PKG_CONFIG_PATH
540 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
545 echo "Build Options:"
546 echo " with endomorphism = $use_endomorphism"
547 echo " with ecmult precomp = $set_precomp"
548 echo " with external callbacks = $use_external_default_callbacks"
549 echo " with benchmarks = $use_benchmark"
550 echo " with coverage = $enable_coverage"
551 echo " module ecdh = $enable_module_ecdh"
552 echo " module recovery = $enable_module_recovery"
554 echo " asm = $set_asm"
555 echo " bignum = $set_bignum"
556 echo " field = $set_field"
557 echo " scalar = $set_scalar"
558 echo " ecmult window size = $set_ecmult_window"
559 echo " ecmult gen prec. bits = $set_ecmult_gen_precision"
561 echo " valgrind = $enable_valgrind"
563 echo " CFLAGS = $CFLAGS"
564 echo " CPPFLAGS = $CPPFLAGS"
565 echo " LDFLAGS = $LDFLAGS"