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)
22 if test "x$CFLAGS" = "x"; then
29 if test x"$ac_cv_prog_cc_c89" = x"no"; then
30 AC_MSG_ERROR([c89 compiler support required])
36 if test x$cross_compiling != xyes; then
37 AC_PATH_PROG([BREW],brew,)
38 if test x$BREW != x; then
39 dnl These Homebrew packages may be keg-only, meaning that they won't be found
40 dnl in expected paths because they may conflict with system files. Ask
41 dnl Homebrew where each one is located, then adjust paths accordingly.
43 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
44 gmp_prefix=`$BREW --prefix gmp 2>/dev/null`
45 if test x$openssl_prefix != x; then
46 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
47 export PKG_CONFIG_PATH
49 if test x$gmp_prefix != x; then
50 GMP_CPPFLAGS="-I$gmp_prefix/include"
51 GMP_LIBS="-L$gmp_prefix/lib"
54 AC_PATH_PROG([PORT],port,)
55 dnl if homebrew isn't installed and macports is, add the macports default paths
57 if test x$PORT != x; then
58 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
59 LDFLAGS="$LDFLAGS -L/opt/local/lib"
68 warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings"
69 saved_CFLAGS="$CFLAGS"
70 CFLAGS="$CFLAGS $warn_CFLAGS"
71 AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
72 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
73 [ AC_MSG_RESULT([yes]) ],
75 CFLAGS="$saved_CFLAGS"
78 saved_CFLAGS="$CFLAGS"
79 CFLAGS="$CFLAGS -fvisibility=hidden"
80 AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
81 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
82 [ AC_MSG_RESULT([yes]) ],
84 CFLAGS="$saved_CFLAGS"
87 AC_ARG_ENABLE(benchmark,
88 AS_HELP_STRING([--enable-benchmark],[compile benchmark [default=yes]]),
89 [use_benchmark=$enableval],
92 AC_ARG_ENABLE(coverage,
93 AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis [default=no]]),
94 [enable_coverage=$enableval],
98 AS_HELP_STRING([--enable-tests],[compile tests [default=yes]]),
99 [use_tests=$enableval],
102 AC_ARG_ENABLE(openssl_tests,
103 AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests [default=auto]]),
104 [enable_openssl_tests=$enableval],
105 [enable_openssl_tests=auto])
107 AC_ARG_ENABLE(experimental,
108 AS_HELP_STRING([--enable-experimental],[allow experimental configure options [default=no]]),
109 [use_experimental=$enableval],
110 [use_experimental=no])
112 AC_ARG_ENABLE(exhaustive_tests,
113 AS_HELP_STRING([--enable-exhaustive-tests],[compile exhaustive tests [default=yes]]),
114 [use_exhaustive_tests=$enableval],
115 [use_exhaustive_tests=yes])
117 AC_ARG_ENABLE(endomorphism,
118 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism [default=no]]),
119 [use_endomorphism=$enableval],
120 [use_endomorphism=no])
122 AC_ARG_ENABLE(ecmult_static_precomputation,
123 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing [default=auto]]),
124 [use_ecmult_static_precomputation=$enableval],
125 [use_ecmult_static_precomputation=auto])
127 AC_ARG_ENABLE(module_ecdh,
128 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),
129 [enable_module_ecdh=$enableval],
130 [enable_module_ecdh=no])
132 AC_ARG_ENABLE(module_recovery,
133 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module [default=no]]),
134 [enable_module_recovery=$enableval],
135 [enable_module_recovery=no])
137 AC_ARG_ENABLE(external_default_callbacks,
138 AS_HELP_STRING([--enable-external-default-callbacks],[enable external default callback functions [default=no]]),
139 [use_external_default_callbacks=$enableval],
140 [use_external_default_callbacks=no])
143 AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni [default=no]]),
144 [use_jni=$enableval],
147 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
148 [finite field implementation to use [default=auto]])],[req_field=$withval], [req_field=auto])
150 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
151 [bignum implementation to use [default=auto]])],[req_bignum=$withval], [req_bignum=auto])
153 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
154 [scalar implementation to use [default=auto]])],[req_scalar=$withval], [req_scalar=auto])
156 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto],
157 [assembly optimizations to useĀ (experimental: arm) [default=auto]])],[req_asm=$withval], [req_asm=auto])
159 AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE|auto],
160 [window size for ecmult precomputation for verification, specified as integer in range [2..24].]
161 [Larger values result in possibly better performance at the cost of an exponentially larger precomputed table.]
162 [The table will store 2^(SIZE-2) * 64 bytes of data but can be larger in memory due to platform-specific padding and alignment.]
163 [If the endomorphism optimization is enabled, two tables of this size are used instead of only one.]
164 ["auto" is a reasonable setting for desktop machines (currently 15). [default=auto]]
166 [req_ecmult_window=$withval], [req_ecmult_window=auto])
168 AC_ARG_WITH([ecmult-gen-precision], [AS_HELP_STRING([--with-ecmult-gen-precision=2|4|8|auto],
169 [Precision bits to tune the precomputed table size for signing.]
170 [The size of the table is 32kB for 2 bits, 64kB for 4 bits, 512kB for 8 bits of precision.]
171 [A larger table size usually results in possible faster signing.]
172 ["auto" is a reasonable setting for desktop machines (currently 4). [default=auto]]
174 [req_ecmult_gen_precision=$withval], [req_ecmult_gen_precision=auto])
176 AC_CHECK_TYPES([__int128])
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="$CFLAGS -O0 --coverage"
181 LDFLAGS="$LDFLAGS --coverage"
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="$CFLAGS $warn_CFLAGS_FOR_BUILD"
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],[dnl])
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"
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"$use_jni" != x"no"; then
477 have_jni_dependencies=yes
478 if test x"$enable_module_ecdh" = x"no"; then
479 have_jni_dependencies=no
481 if test "x$JNI_INCLUDE_DIRS" = "x"; then
482 have_jni_dependencies=no
484 if test "x$have_jni_dependencies" = "xno"; then
485 if test x"$use_jni" = x"yes"; then
486 AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.])
488 AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
492 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
493 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
498 if test x"$set_bignum" = x"gmp"; then
499 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
500 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
503 if test x"$use_endomorphism" = x"yes"; then
504 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
507 if test x"$set_precomp" = x"yes"; then
508 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
511 if test x"$enable_module_ecdh" = x"yes"; then
512 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
515 if test x"$enable_module_recovery" = x"yes"; then
516 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
521 if test x"$use_external_asm" = x"yes"; then
522 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
525 if test x"$use_external_default_callbacks" = x"yes"; then
526 AC_DEFINE(USE_EXTERNAL_DEFAULT_CALLBACKS, 1, [Define this symbol if an external implementation of the default callbacks is used])
529 if test x"$enable_experimental" = x"yes"; then
530 AC_MSG_NOTICE([******])
531 AC_MSG_NOTICE([WARNING: experimental build])
532 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
533 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
534 AC_MSG_NOTICE([******])
536 if test x"$enable_module_ecdh" = x"yes"; then
537 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
539 if test x"$set_asm" = x"arm"; then
540 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
544 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
545 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
546 AC_SUBST(JNI_INCLUDES)
547 AC_SUBST(SECP_INCLUDES)
549 AC_SUBST(SECP_TEST_LIBS)
550 AC_SUBST(SECP_TEST_INCLUDES)
551 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
552 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
553 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
554 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
555 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
556 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
557 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
558 AM_CONDITIONAL([USE_JNI], [test x"$use_jni" = x"yes"])
559 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
560 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
562 dnl make sure nothing new is exported so that we don't break the cache
563 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
564 unset PKG_CONFIG_PATH
565 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
570 echo "Build Options:"
571 echo " with endomorphism = $use_endomorphism"
572 echo " with ecmult precomp = $set_precomp"
573 echo " with external callbacks = $use_external_default_callbacks"
574 echo " with jni = $use_jni"
575 echo " with benchmarks = $use_benchmark"
576 echo " with coverage = $enable_coverage"
577 echo " module ecdh = $enable_module_ecdh"
578 echo " module recovery = $enable_module_recovery"
580 echo " asm = $set_asm"
581 echo " bignum = $set_bignum"
582 echo " field = $set_field"
583 echo " scalar = $set_scalar"
584 echo " ecmult window size = $set_ecmult_window"
585 echo " ecmult gen prec. bits = $set_ecmult_gen_precision"
588 echo " CFLAGS = $CFLAGS"
589 echo " CPPFLAGS = $CPPFLAGS"
590 echo " LDFLAGS = $LDFLAGS"