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])
12 dnl make the compilation flags quiet unless V=1 is used
13 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
18 AC_PATH_TOOL(RANLIB, ranlib)
19 AC_PATH_TOOL(STRIP, strip)
25 if test x"$ac_cv_prog_cc_c89" = x"no"; then
26 AC_MSG_ERROR([c89 compiler support required])
32 if test x$cross_compiling != xyes; then
33 AC_PATH_PROG([BREW],brew,)
34 if test x$BREW != x; then
35 dnl These Homebrew packages may be keg-only, meaning that they won't be found
36 dnl in expected paths because they may conflict with system files. Ask
37 dnl Homebrew where each one is located, then adjust paths accordingly.
39 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
40 gmp_prefix=`$BREW --prefix gmp 2>/dev/null`
41 if test x$openssl_prefix != x; then
42 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
43 export PKG_CONFIG_PATH
45 if test x$gmp_prefix != x; then
46 GMP_CPPFLAGS="-I$gmp_prefix/include"
47 GMP_LIBS="-L$gmp_prefix/lib"
50 AC_PATH_PROG([PORT],port,)
51 dnl if homebrew isn't installed and macports is, add the macports default paths
53 if test x$PORT != x; then
54 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
55 LDFLAGS="$LDFLAGS -L/opt/local/lib"
64 warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings"
65 saved_CFLAGS="$CFLAGS"
66 CFLAGS="$warn_CFLAGS $CFLAGS"
67 AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
68 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
69 [ AC_MSG_RESULT([yes]) ],
71 CFLAGS="$saved_CFLAGS"
74 saved_CFLAGS="$CFLAGS"
75 CFLAGS="-fvisibility=hidden $CFLAGS"
76 AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
77 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
78 [ AC_MSG_RESULT([yes]) ],
80 CFLAGS="$saved_CFLAGS"
83 AC_ARG_ENABLE(benchmark,
84 AS_HELP_STRING([--enable-benchmark],[compile benchmark [default=yes]]),
85 [use_benchmark=$enableval],
88 AC_ARG_ENABLE(coverage,
89 AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis [default=no]]),
90 [enable_coverage=$enableval],
94 AS_HELP_STRING([--enable-tests],[compile tests [default=yes]]),
95 [use_tests=$enableval],
98 AC_ARG_ENABLE(openssl_tests,
99 AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests [default=auto]]),
100 [enable_openssl_tests=$enableval],
101 [enable_openssl_tests=auto])
103 AC_ARG_ENABLE(experimental,
104 AS_HELP_STRING([--enable-experimental],[allow experimental configure options [default=no]]),
105 [use_experimental=$enableval],
106 [use_experimental=no])
108 AC_ARG_ENABLE(exhaustive_tests,
109 AS_HELP_STRING([--enable-exhaustive-tests],[compile exhaustive tests [default=yes]]),
110 [use_exhaustive_tests=$enableval],
111 [use_exhaustive_tests=yes])
113 AC_ARG_ENABLE(endomorphism,
114 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism [default=no]]),
115 [use_endomorphism=$enableval],
116 [use_endomorphism=no])
118 AC_ARG_ENABLE(ecmult_static_precomputation,
119 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing [default=auto]]),
120 [use_ecmult_static_precomputation=$enableval],
121 [use_ecmult_static_precomputation=auto])
123 AC_ARG_ENABLE(module_ecdh,
124 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),
125 [enable_module_ecdh=$enableval],
126 [enable_module_ecdh=no])
128 AC_ARG_ENABLE(module_recovery,
129 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module [default=no]]),
130 [enable_module_recovery=$enableval],
131 [enable_module_recovery=no])
133 AC_ARG_ENABLE(external_default_callbacks,
134 AS_HELP_STRING([--enable-external-default-callbacks],[enable external default callback functions [default=no]]),
135 [use_external_default_callbacks=$enableval],
136 [use_external_default_callbacks=no])
139 AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni [default=no]]),
140 [use_jni=$enableval],
143 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
144 [finite field implementation to use [default=auto]])],[req_field=$withval], [req_field=auto])
146 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
147 [bignum implementation to use [default=auto]])],[req_bignum=$withval], [req_bignum=auto])
149 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
150 [scalar implementation to use [default=auto]])],[req_scalar=$withval], [req_scalar=auto])
152 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto],
153 [assembly optimizations to useĀ (experimental: arm) [default=auto]])],[req_asm=$withval], [req_asm=auto])
155 AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE|auto],
156 [window size for ecmult precomputation for verification, specified as integer in range [2..24].]
157 [Larger values result in possibly better performance at the cost of an exponentially larger precomputed table.]
158 [The table will store 2^(SIZE-2) * 64 bytes of data but can be larger in memory due to platform-specific padding and alignment.]
159 [If the endomorphism optimization is enabled, two tables of this size are used instead of only one.]
160 ["auto" is a reasonable setting for desktop machines (currently 15). [default=auto]]
162 [req_ecmult_window=$withval], [req_ecmult_window=auto])
164 AC_ARG_WITH([ecmult-gen-precision], [AS_HELP_STRING([--with-ecmult-gen-precision=2|4|8|auto],
165 [Precision bits to tune the precomputed table size for signing.]
166 [The size of the table is 32kB for 2 bits, 64kB for 4 bits, 512kB for 8 bits of precision.]
167 [A larger table size usually results in possible faster signing.]
168 ["auto" is a reasonable setting for desktop machines (currently 4). [default=auto]]
170 [req_ecmult_gen_precision=$withval], [req_ecmult_gen_precision=auto])
172 AC_CHECK_TYPES([__int128])
174 if test x"$enable_coverage" = x"yes"; then
175 AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code])
176 CFLAGS="-O0 --coverage $CFLAGS"
177 LDFLAGS="--coverage $LDFLAGS"
182 if test x"$use_ecmult_static_precomputation" != x"no"; then
183 # Temporarily switch to an environment for the native compiler
184 save_cross_compiling=$cross_compiling
188 SAVE_CFLAGS="$CFLAGS"
189 CFLAGS="$CFLAGS_FOR_BUILD"
190 SAVE_CPPFLAGS="$CPPFLAGS"
191 CPPFLAGS="$CPPFLAGS_FOR_BUILD"
192 SAVE_LDFLAGS="$LDFLAGS"
193 LDFLAGS="$LDFLAGS_FOR_BUILD"
195 warn_CFLAGS_FOR_BUILD="-Wall -Wextra -Wno-unused-function"
196 saved_CFLAGS="$CFLAGS"
197 CFLAGS="$warn_CFLAGS_FOR_BUILD $CFLAGS"
198 AC_MSG_CHECKING([if native ${CC_FOR_BUILD} supports ${warn_CFLAGS_FOR_BUILD}])
199 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
200 [ AC_MSG_RESULT([yes]) ],
201 [ AC_MSG_RESULT([no])
202 CFLAGS="$saved_CFLAGS"
205 AC_MSG_CHECKING([for working native compiler: ${CC_FOR_BUILD}])
207 [AC_LANG_PROGRAM([], [])],
208 [working_native_cc=yes],
209 [working_native_cc=no],[dnl])
211 CFLAGS_FOR_BUILD="$CFLAGS"
213 # Restore the environment
214 cross_compiling=$save_cross_compiling
216 CFLAGS="$SAVE_CFLAGS"
217 CPPFLAGS="$SAVE_CPPFLAGS"
218 LDFLAGS="$SAVE_LDFLAGS"
220 if test x"$working_native_cc" = x"no"; then
223 m4_define([please_set_for_build], [Please set CC_FOR_BUILD, CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and/or LDFLAGS_FOR_BUILD.])
224 if test x"$use_ecmult_static_precomputation" = x"yes"; then
225 AC_MSG_ERROR([native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
227 AC_MSG_WARN([Disabling statically generated ecmult table because the native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
237 if test x"$req_asm" = x"auto"; then
239 if test x"$has_64bit_asm" = x"yes"; then
242 if test x"$set_asm" = x; then
250 if test x"$has_64bit_asm" != x"yes"; then
251 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
259 AC_MSG_ERROR([invalid assembly optimization selection])
264 if test x"$req_field" = x"auto"; then
265 if test x"set_asm" = x"x86_64"; then
268 if test x"$set_field" = x; then
270 if test x"$has_int128" = x"yes"; then
274 if test x"$set_field" = x; then
281 if test x"$set_asm" != x"x86_64"; then
283 if test x"$has_int128" != x"yes"; then
284 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
291 AC_MSG_ERROR([invalid field implementation selection])
296 if test x"$req_scalar" = x"auto"; then
298 if test x"$has_int128" = x"yes"; then
301 if test x"$set_scalar" = x; then
305 set_scalar=$req_scalar
309 if test x"$has_int128" != x"yes"; then
310 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
316 AC_MSG_ERROR([invalid scalar implementation selected])
321 if test x"$req_bignum" = x"auto"; then
323 if test x"$has_gmp" = x"yes"; then
327 if test x"$set_bignum" = x; then
331 set_bignum=$req_bignum
335 if test x"$has_gmp" != x"yes"; then
336 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
342 AC_MSG_ERROR([invalid bignum implementation selection])
347 # select assembly optimization
352 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
360 AC_MSG_ERROR([invalid assembly optimizations])
364 # select field implementation
367 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
370 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
373 AC_MSG_ERROR([invalid field implementation])
377 # select bignum implementation
380 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
381 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
382 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
383 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
386 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
387 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
388 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
391 AC_MSG_ERROR([invalid bignum implementation])
395 #select scalar implementation
398 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
401 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
404 AC_MSG_ERROR([invalid scalar implementation])
408 #set ecmult window size
409 if test x"$req_ecmult_window" = x"auto"; then
412 set_ecmult_window=$req_ecmult_window
415 error_window_size=['window size for ecmult precomputation not an integer in range [2..24] or "auto"']
416 case $set_ecmult_window in
419 AC_MSG_ERROR($error_window_size)
422 if test "$set_ecmult_window" -lt 2 -o "$set_ecmult_window" -gt 24 ; then
424 AC_MSG_ERROR($error_window_size)
426 AC_DEFINE_UNQUOTED(ECMULT_WINDOW_SIZE, $set_ecmult_window, [Set window size for ecmult precomputation])
430 #set ecmult gen precision
431 if test x"$req_ecmult_gen_precision" = x"auto"; then
432 set_ecmult_gen_precision=4
434 set_ecmult_gen_precision=$req_ecmult_gen_precision
437 case $set_ecmult_gen_precision in
439 AC_DEFINE_UNQUOTED(ECMULT_GEN_PREC_BITS, $set_ecmult_gen_precision, [Set ecmult gen precision bits])
442 AC_MSG_ERROR(['ecmult gen precision not 2, 4, 8 or "auto"'])
446 if test x"$use_tests" = x"yes"; then
448 if test x"$has_openssl_ec" = x"yes"; then
449 if test x"$enable_openssl_tests" != x"no"; then
450 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
451 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
452 SECP_TEST_LIBS="$CRYPTO_LIBS"
456 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
461 if test x"$enable_openssl_tests" = x"yes"; then
462 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
466 if test x"$enable_openssl_tests" = x"yes"; then
467 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
471 if test x"$use_jni" != x"no"; then
473 have_jni_dependencies=yes
474 if test x"$enable_module_ecdh" = x"no"; then
475 have_jni_dependencies=no
477 if test "x$JNI_INCLUDE_DIRS" = "x"; then
478 have_jni_dependencies=no
480 if test "x$have_jni_dependencies" = "xno"; then
481 if test x"$use_jni" = x"yes"; then
482 AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.])
484 AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
488 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
489 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
494 if test x"$set_bignum" = x"gmp"; then
495 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
496 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
499 if test x"$use_endomorphism" = x"yes"; then
500 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
503 if test x"$set_precomp" = x"yes"; then
504 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
507 if test x"$enable_module_ecdh" = x"yes"; then
508 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
511 if test x"$enable_module_recovery" = x"yes"; then
512 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
517 if test x"$use_external_asm" = x"yes"; then
518 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
521 if test x"$use_external_default_callbacks" = x"yes"; then
522 AC_DEFINE(USE_EXTERNAL_DEFAULT_CALLBACKS, 1, [Define this symbol if an external implementation of the default callbacks is used])
525 if test x"$enable_experimental" = x"yes"; then
526 AC_MSG_NOTICE([******])
527 AC_MSG_NOTICE([WARNING: experimental build])
528 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
529 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
530 AC_MSG_NOTICE([******])
532 if test x"$enable_module_ecdh" = x"yes"; then
533 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
535 if test x"$set_asm" = x"arm"; then
536 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
540 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
541 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
542 AC_SUBST(JNI_INCLUDES)
543 AC_SUBST(SECP_INCLUDES)
545 AC_SUBST(SECP_TEST_LIBS)
546 AC_SUBST(SECP_TEST_INCLUDES)
547 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
548 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
549 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
550 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
551 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
552 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
553 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
554 AM_CONDITIONAL([USE_JNI], [test x"$use_jni" = x"yes"])
555 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
556 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
558 dnl make sure nothing new is exported so that we don't break the cache
559 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
560 unset PKG_CONFIG_PATH
561 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
566 echo "Build Options:"
567 echo " with endomorphism = $use_endomorphism"
568 echo " with ecmult precomp = $set_precomp"
569 echo " with external callbacks = $use_external_default_callbacks"
570 echo " with jni = $use_jni"
571 echo " with benchmarks = $use_benchmark"
572 echo " with coverage = $enable_coverage"
573 echo " module ecdh = $enable_module_ecdh"
574 echo " module recovery = $enable_module_recovery"
576 echo " asm = $set_asm"
577 echo " bignum = $set_bignum"
578 echo " field = $set_field"
579 echo " scalar = $set_scalar"
580 echo " ecmult window size = $set_ecmult_window"
581 echo " ecmult gen prec. bits = $set_ecmult_gen_precision"
584 echo " CFLAGS = $CFLAGS"
585 echo " CPPFLAGS = $CPPFLAGS"
586 echo " LDFLAGS = $LDFLAGS"