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])
142 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
143 [finite field implementation to use [default=auto]])],[req_field=$withval], [req_field=auto])
145 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
146 [bignum implementation to use [default=auto]])],[req_bignum=$withval], [req_bignum=auto])
148 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
149 [scalar implementation to use [default=auto]])],[req_scalar=$withval], [req_scalar=auto])
151 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto],
152 [assembly optimizations to useĀ (experimental: arm) [default=auto]])],[req_asm=$withval], [req_asm=auto])
154 AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE|auto],
155 [window size for ecmult precomputation for verification, specified as integer in range [2..24].]
156 [Larger values result in possibly better performance at the cost of an exponentially larger precomputed table.]
157 [The table will store 2^(SIZE-2) * 64 bytes of data but can be larger in memory due to platform-specific padding and alignment.]
158 [If the endomorphism optimization is enabled, two tables of this size are used instead of only one.]
159 ["auto" is a reasonable setting for desktop machines (currently 15). [default=auto]]
161 [req_ecmult_window=$withval], [req_ecmult_window=auto])
163 AC_ARG_WITH([ecmult-gen-precision], [AS_HELP_STRING([--with-ecmult-gen-precision=2|4|8|auto],
164 [Precision bits to tune the precomputed table size for signing.]
165 [The size of the table is 32kB for 2 bits, 64kB for 4 bits, 512kB for 8 bits of precision.]
166 [A larger table size usually results in possible faster signing.]
167 ["auto" is a reasonable setting for desktop machines (currently 4). [default=auto]]
169 [req_ecmult_gen_precision=$withval], [req_ecmult_gen_precision=auto])
171 AC_CHECK_TYPES([__int128])
173 AC_CHECK_HEADER([valgrind/memcheck.h], [enable_valgrind=yes], [enable_valgrind=no], [])
174 AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"])
176 if test x"$enable_coverage" = x"yes"; then
177 AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code])
178 CFLAGS="$CFLAGS -O0 --coverage"
179 LDFLAGS="$LDFLAGS --coverage"
184 if test x"$use_ecmult_static_precomputation" != x"no"; then
185 # Temporarily switch to an environment for the native compiler
186 save_cross_compiling=$cross_compiling
190 SAVE_CFLAGS="$CFLAGS"
191 CFLAGS="$CFLAGS_FOR_BUILD"
192 SAVE_CPPFLAGS="$CPPFLAGS"
193 CPPFLAGS="$CPPFLAGS_FOR_BUILD"
194 SAVE_LDFLAGS="$LDFLAGS"
195 LDFLAGS="$LDFLAGS_FOR_BUILD"
197 warn_CFLAGS_FOR_BUILD="-Wall -Wextra -Wno-unused-function"
198 saved_CFLAGS="$CFLAGS"
199 CFLAGS="$CFLAGS $warn_CFLAGS_FOR_BUILD"
200 AC_MSG_CHECKING([if native ${CC_FOR_BUILD} supports ${warn_CFLAGS_FOR_BUILD}])
201 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
202 [ AC_MSG_RESULT([yes]) ],
203 [ AC_MSG_RESULT([no])
204 CFLAGS="$saved_CFLAGS"
207 AC_MSG_CHECKING([for working native compiler: ${CC_FOR_BUILD}])
209 [AC_LANG_PROGRAM([], [])],
210 [working_native_cc=yes],
211 [working_native_cc=no],[dnl])
213 CFLAGS_FOR_BUILD="$CFLAGS"
215 # Restore the environment
216 cross_compiling=$save_cross_compiling
218 CFLAGS="$SAVE_CFLAGS"
219 CPPFLAGS="$SAVE_CPPFLAGS"
220 LDFLAGS="$SAVE_LDFLAGS"
222 if test x"$working_native_cc" = x"no"; then
225 m4_define([please_set_for_build], [Please set CC_FOR_BUILD, CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and/or LDFLAGS_FOR_BUILD.])
226 if test x"$use_ecmult_static_precomputation" = x"yes"; then
227 AC_MSG_ERROR([native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
229 AC_MSG_WARN([Disabling statically generated ecmult table because the native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
239 if test x"$req_asm" = x"auto"; then
241 if test x"$has_64bit_asm" = x"yes"; then
244 if test x"$set_asm" = x; then
252 if test x"$has_64bit_asm" != x"yes"; then
253 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
261 AC_MSG_ERROR([invalid assembly optimization selection])
266 if test x"$req_field" = x"auto"; then
267 if test x"set_asm" = x"x86_64"; then
270 if test x"$set_field" = x; then
272 if test x"$has_int128" = x"yes"; then
276 if test x"$set_field" = x; then
283 if test x"$set_asm" != x"x86_64"; then
285 if test x"$has_int128" != x"yes"; then
286 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
293 AC_MSG_ERROR([invalid field implementation selection])
298 if test x"$req_scalar" = x"auto"; then
300 if test x"$has_int128" = x"yes"; then
303 if test x"$set_scalar" = x; then
307 set_scalar=$req_scalar
311 if test x"$has_int128" != x"yes"; then
312 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
318 AC_MSG_ERROR([invalid scalar implementation selected])
323 if test x"$req_bignum" = x"auto"; then
325 if test x"$has_gmp" = x"yes"; then
329 if test x"$set_bignum" = x; then
333 set_bignum=$req_bignum
337 if test x"$has_gmp" != x"yes"; then
338 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
344 AC_MSG_ERROR([invalid bignum implementation selection])
349 # select assembly optimization
354 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
362 AC_MSG_ERROR([invalid assembly optimizations])
366 # select field implementation
369 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
372 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
375 AC_MSG_ERROR([invalid field implementation])
379 # select bignum implementation
382 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
383 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
384 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
385 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
388 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
389 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
390 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
393 AC_MSG_ERROR([invalid bignum implementation])
397 #select scalar implementation
400 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
403 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
406 AC_MSG_ERROR([invalid scalar implementation])
410 #set ecmult window size
411 if test x"$req_ecmult_window" = x"auto"; then
414 set_ecmult_window=$req_ecmult_window
417 error_window_size=['window size for ecmult precomputation not an integer in range [2..24] or "auto"']
418 case $set_ecmult_window in
421 AC_MSG_ERROR($error_window_size)
424 if test "$set_ecmult_window" -lt 2 -o "$set_ecmult_window" -gt 24 ; then
426 AC_MSG_ERROR($error_window_size)
428 AC_DEFINE_UNQUOTED(ECMULT_WINDOW_SIZE, $set_ecmult_window, [Set window size for ecmult precomputation])
432 #set ecmult gen precision
433 if test x"$req_ecmult_gen_precision" = x"auto"; then
434 set_ecmult_gen_precision=4
436 set_ecmult_gen_precision=$req_ecmult_gen_precision
439 case $set_ecmult_gen_precision in
441 AC_DEFINE_UNQUOTED(ECMULT_GEN_PREC_BITS, $set_ecmult_gen_precision, [Set ecmult gen precision bits])
444 AC_MSG_ERROR(['ecmult gen precision not 2, 4, 8 or "auto"'])
448 if test x"$use_tests" = x"yes"; then
450 if test x"$has_openssl_ec" = x"yes"; then
451 if test x"$enable_openssl_tests" != x"no"; then
452 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
453 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
454 SECP_TEST_LIBS="$CRYPTO_LIBS"
458 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
463 if test x"$enable_openssl_tests" = x"yes"; then
464 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
468 if test x"$enable_openssl_tests" = x"yes"; then
469 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
473 if test x"$set_bignum" = x"gmp"; then
474 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
475 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
478 if test x"$use_endomorphism" = x"yes"; then
479 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
482 if test x"$set_precomp" = x"yes"; then
483 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
486 if test x"$enable_module_ecdh" = x"yes"; then
487 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
490 if test x"$enable_module_recovery" = x"yes"; then
491 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
496 if test x"$use_external_asm" = x"yes"; then
497 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
500 if test x"$use_external_default_callbacks" = x"yes"; then
501 AC_DEFINE(USE_EXTERNAL_DEFAULT_CALLBACKS, 1, [Define this symbol if an external implementation of the default callbacks is used])
504 if test x"$enable_experimental" = x"yes"; then
505 AC_MSG_NOTICE([******])
506 AC_MSG_NOTICE([WARNING: experimental build])
507 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
508 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
509 AC_MSG_NOTICE([******])
511 if test x"$enable_module_ecdh" = x"yes"; then
512 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
514 if test x"$set_asm" = x"arm"; then
515 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
519 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
520 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
521 AC_SUBST(SECP_INCLUDES)
523 AC_SUBST(SECP_TEST_LIBS)
524 AC_SUBST(SECP_TEST_INCLUDES)
525 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
526 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
527 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
528 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
529 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
530 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
531 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
532 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
533 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
535 dnl make sure nothing new is exported so that we don't break the cache
536 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
537 unset PKG_CONFIG_PATH
538 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
543 echo "Build Options:"
544 echo " with endomorphism = $use_endomorphism"
545 echo " with ecmult precomp = $set_precomp"
546 echo " with external callbacks = $use_external_default_callbacks"
547 echo " with benchmarks = $use_benchmark"
548 echo " with coverage = $enable_coverage"
549 echo " module ecdh = $enable_module_ecdh"
550 echo " module recovery = $enable_module_recovery"
552 echo " asm = $set_asm"
553 echo " bignum = $set_bignum"
554 echo " field = $set_field"
555 echo " scalar = $set_scalar"
556 echo " ecmult window size = $set_ecmult_window"
557 echo " ecmult gen prec. bits = $set_ecmult_gen_precision"
560 echo " CFLAGS = $CFLAGS"
561 echo " CPPFLAGS = $CPPFLAGS"
562 echo " LDFLAGS = $LDFLAGS"