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 dnl Test-only override of the (autodetected by the C code) "widemul" setting.
145 dnl Legal values are int64 (for [u]int64_t), int128 (for [unsigned] __int128), and auto (the default).
146 AC_ARG_WITH([test-override-wide-multiply], [] ,[set_widemul=$withval], [set_widemul=auto])
148 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
149 [bignum implementation to use [default=auto]])],[req_bignum=$withval], [req_bignum=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_HEADER([valgrind/memcheck.h], [enable_valgrind=yes], [enable_valgrind=no], [])
172 AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"])
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],[:])
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_bignum" = x"auto"; then
266 if test x"$has_gmp" = x"yes"; then
270 if test x"$set_bignum" = x; then
274 set_bignum=$req_bignum
278 if test x"$has_gmp" != x"yes"; then
279 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
285 AC_MSG_ERROR([invalid bignum implementation selection])
290 # select assembly optimization
295 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
303 AC_MSG_ERROR([invalid assembly optimizations])
307 # select wide multiplication implementation
310 AC_DEFINE(USE_FORCE_WIDEMUL_INT128, 1, [Define this symbol to force the use of the (unsigned) __int128 based wide multiplication implementation])
313 AC_DEFINE(USE_FORCE_WIDEMUL_INT64, 1, [Define this symbol to force the use of the (u)int64_t based wide multiplication implementation])
318 AC_MSG_ERROR([invalid wide multiplication implementation])
322 # select bignum implementation
325 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
326 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
327 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
328 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
331 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
332 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
333 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
336 AC_MSG_ERROR([invalid bignum implementation])
340 #set ecmult window size
341 if test x"$req_ecmult_window" = x"auto"; then
344 set_ecmult_window=$req_ecmult_window
347 error_window_size=['window size for ecmult precomputation not an integer in range [2..24] or "auto"']
348 case $set_ecmult_window in
351 AC_MSG_ERROR($error_window_size)
354 if test "$set_ecmult_window" -lt 2 -o "$set_ecmult_window" -gt 24 ; then
356 AC_MSG_ERROR($error_window_size)
358 AC_DEFINE_UNQUOTED(ECMULT_WINDOW_SIZE, $set_ecmult_window, [Set window size for ecmult precomputation])
362 #set ecmult gen precision
363 if test x"$req_ecmult_gen_precision" = x"auto"; then
364 set_ecmult_gen_precision=4
366 set_ecmult_gen_precision=$req_ecmult_gen_precision
369 case $set_ecmult_gen_precision in
371 AC_DEFINE_UNQUOTED(ECMULT_GEN_PREC_BITS, $set_ecmult_gen_precision, [Set ecmult gen precision bits])
374 AC_MSG_ERROR(['ecmult gen precision not 2, 4, 8 or "auto"'])
378 if test x"$use_tests" = x"yes"; then
380 if test x"$has_openssl_ec" = x"yes"; then
381 if test x"$enable_openssl_tests" != x"no"; then
382 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
383 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS $CRYPTO_CPPFLAGS"
384 SECP_TEST_LIBS="$CRYPTO_LIBS"
388 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
393 if test x"$enable_openssl_tests" = x"yes"; then
394 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
398 if test x"$enable_openssl_tests" = x"yes"; then
399 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
403 if test x"$set_bignum" = x"gmp"; then
404 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
405 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
408 if test x"$use_endomorphism" = x"yes"; then
409 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
412 if test x"$set_precomp" = x"yes"; then
413 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
416 if test x"$enable_module_ecdh" = x"yes"; then
417 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
420 if test x"$enable_module_recovery" = x"yes"; then
421 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
426 if test x"$use_external_asm" = x"yes"; then
427 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
430 if test x"$use_external_default_callbacks" = x"yes"; then
431 AC_DEFINE(USE_EXTERNAL_DEFAULT_CALLBACKS, 1, [Define this symbol if an external implementation of the default callbacks is used])
434 if test x"$enable_experimental" = x"yes"; then
435 AC_MSG_NOTICE([******])
436 AC_MSG_NOTICE([WARNING: experimental build])
437 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
438 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
439 AC_MSG_NOTICE([******])
441 if test x"$enable_module_ecdh" = x"yes"; then
442 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
444 if test x"$set_asm" = x"arm"; then
445 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
449 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
450 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
451 AC_SUBST(SECP_INCLUDES)
453 AC_SUBST(SECP_TEST_LIBS)
454 AC_SUBST(SECP_TEST_INCLUDES)
455 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
456 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
457 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
458 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
459 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
460 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
461 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
462 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
463 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
465 dnl make sure nothing new is exported so that we don't break the cache
466 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
467 unset PKG_CONFIG_PATH
468 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
473 echo "Build Options:"
474 echo " with endomorphism = $use_endomorphism"
475 echo " with ecmult precomp = $set_precomp"
476 echo " with external callbacks = $use_external_default_callbacks"
477 echo " with benchmarks = $use_benchmark"
478 echo " with coverage = $enable_coverage"
479 echo " module ecdh = $enable_module_ecdh"
480 echo " module recovery = $enable_module_recovery"
482 echo " asm = $set_asm"
483 echo " bignum = $set_bignum"
484 echo " ecmult window size = $set_ecmult_window"
485 echo " ecmult gen prec. bits = $set_ecmult_gen_precision"
486 dnl Hide test-only options unless they're used.
487 if test x"$set_widemul" != xauto; then
488 echo " wide multiplication = $set_widemul"
491 echo " valgrind = $enable_valgrind"
493 echo " CFLAGS = $CFLAGS"
494 echo " CPPFLAGS = $CPPFLAGS"
495 echo " LDFLAGS = $LDFLAGS"