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])
138 AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni [default=no]]),
139 [use_jni=$enableval],
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_CHECK_TYPES([__int128])
165 if test x"$enable_coverage" = x"yes"; then
166 AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code])
167 CFLAGS="$CFLAGS -O0 --coverage"
168 LDFLAGS="$LDFLAGS --coverage"
173 if test x"$use_ecmult_static_precomputation" != x"no"; then
174 # Temporarily switch to an environment for the native compiler
175 save_cross_compiling=$cross_compiling
179 SAVE_CFLAGS="$CFLAGS"
180 CFLAGS="$CFLAGS_FOR_BUILD"
181 SAVE_CPPFLAGS="$CPPFLAGS"
182 CPPFLAGS="$CPPFLAGS_FOR_BUILD"
183 SAVE_LDFLAGS="$LDFLAGS"
184 LDFLAGS="$LDFLAGS_FOR_BUILD"
186 warn_CFLAGS_FOR_BUILD="-Wall -Wextra -Wno-unused-function"
187 saved_CFLAGS="$CFLAGS"
188 CFLAGS="$CFLAGS $warn_CFLAGS_FOR_BUILD"
189 AC_MSG_CHECKING([if native ${CC_FOR_BUILD} supports ${warn_CFLAGS_FOR_BUILD}])
190 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
191 [ AC_MSG_RESULT([yes]) ],
192 [ AC_MSG_RESULT([no])
193 CFLAGS="$saved_CFLAGS"
196 AC_MSG_CHECKING([for working native compiler: ${CC_FOR_BUILD}])
198 [AC_LANG_PROGRAM([], [])],
199 [working_native_cc=yes],
200 [working_native_cc=no],[dnl])
202 CFLAGS_FOR_BUILD="$CFLAGS"
204 # Restore the environment
205 cross_compiling=$save_cross_compiling
207 CFLAGS="$SAVE_CFLAGS"
208 CPPFLAGS="$SAVE_CPPFLAGS"
209 LDFLAGS="$SAVE_LDFLAGS"
211 if test x"$working_native_cc" = x"no"; then
214 m4_define([please_set_for_build], [Please set CC_FOR_BUILD, CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and/or LDFLAGS_FOR_BUILD.])
215 if test x"$use_ecmult_static_precomputation" = x"yes"; then
216 AC_MSG_ERROR([native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
218 AC_MSG_WARN([Disabling statically generated ecmult table because the native compiler ${CC_FOR_BUILD} does not produce working binaries. please_set_for_build])
228 if test x"$req_asm" = x"auto"; then
230 if test x"$has_64bit_asm" = x"yes"; then
233 if test x"$set_asm" = x; then
241 if test x"$has_64bit_asm" != x"yes"; then
242 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
250 AC_MSG_ERROR([invalid assembly optimization selection])
255 if test x"$req_field" = x"auto"; then
256 if test x"set_asm" = x"x86_64"; then
259 if test x"$set_field" = x; then
261 if test x"$has_int128" = x"yes"; then
265 if test x"$set_field" = x; then
272 if test x"$set_asm" != x"x86_64"; then
274 if test x"$has_int128" != x"yes"; then
275 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
282 AC_MSG_ERROR([invalid field implementation selection])
287 if test x"$req_scalar" = x"auto"; then
289 if test x"$has_int128" = x"yes"; then
292 if test x"$set_scalar" = x; then
296 set_scalar=$req_scalar
300 if test x"$has_int128" != x"yes"; then
301 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
307 AC_MSG_ERROR([invalid scalar implementation selected])
312 if test x"$req_bignum" = x"auto"; then
314 if test x"$has_gmp" = x"yes"; then
318 if test x"$set_bignum" = x; then
322 set_bignum=$req_bignum
326 if test x"$has_gmp" != x"yes"; then
327 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
333 AC_MSG_ERROR([invalid bignum implementation selection])
338 # select assembly optimization
343 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
351 AC_MSG_ERROR([invalid assembly optimizations])
355 # select field implementation
358 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
361 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
364 AC_MSG_ERROR([invalid field implementation])
368 # select bignum implementation
371 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
372 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
373 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
374 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
377 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
378 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
379 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
382 AC_MSG_ERROR([invalid bignum implementation])
386 #select scalar implementation
389 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
392 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
395 AC_MSG_ERROR([invalid scalar implementation])
399 #set ecmult window size
400 if test x"$req_ecmult_window" = x"auto"; then
403 set_ecmult_window=$req_ecmult_window
406 error_window_size=['window size for ecmult precomputation not an integer in range [2..24] or "auto"']
407 case $set_ecmult_window in
410 AC_MSG_ERROR($error_window_size)
413 if test "$set_ecmult_window" -lt 2 -o "$set_ecmult_window" -gt 24 ; then
415 AC_MSG_ERROR($error_window_size)
417 AC_DEFINE_UNQUOTED(ECMULT_WINDOW_SIZE, $set_ecmult_window, [Set window size for ecmult precomputation])
421 if test x"$use_tests" = x"yes"; then
423 if test x"$has_openssl_ec" = x"yes"; then
424 if test x"$enable_openssl_tests" != x"no"; then
425 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
426 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
427 SECP_TEST_LIBS="$CRYPTO_LIBS"
431 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
436 if test x"$enable_openssl_tests" = x"yes"; then
437 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
441 if test x"$enable_openssl_tests" = x"yes"; then
442 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
446 if test x"$use_jni" != x"no"; then
448 have_jni_dependencies=yes
449 if test x"$enable_module_ecdh" = x"no"; then
450 have_jni_dependencies=no
452 if test "x$JNI_INCLUDE_DIRS" = "x"; then
453 have_jni_dependencies=no
455 if test "x$have_jni_dependencies" = "xno"; then
456 if test x"$use_jni" = x"yes"; then
457 AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.])
459 AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
463 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
464 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
469 if test x"$set_bignum" = x"gmp"; then
470 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
471 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
474 if test x"$use_endomorphism" = x"yes"; then
475 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
478 if test x"$set_precomp" = x"yes"; then
479 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
482 if test x"$enable_module_ecdh" = x"yes"; then
483 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
486 if test x"$enable_module_recovery" = x"yes"; then
487 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
492 if test x"$use_external_asm" = x"yes"; then
493 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
496 if test x"$enable_experimental" = x"yes"; then
497 AC_MSG_NOTICE([******])
498 AC_MSG_NOTICE([WARNING: experimental build])
499 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
500 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
501 AC_MSG_NOTICE([******])
503 if test x"$enable_module_ecdh" = x"yes"; then
504 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
506 if test x"$set_asm" = x"arm"; then
507 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
511 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
512 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
513 AC_SUBST(JNI_INCLUDES)
514 AC_SUBST(SECP_INCLUDES)
516 AC_SUBST(SECP_TEST_LIBS)
517 AC_SUBST(SECP_TEST_INCLUDES)
518 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
519 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
520 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
521 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
522 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
523 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
524 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
525 AM_CONDITIONAL([USE_JNI], [test x"$use_jni" = x"yes"])
526 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
527 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
529 dnl make sure nothing new is exported so that we don't break the cache
530 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
531 unset PKG_CONFIG_PATH
532 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
537 echo "Build Options:"
538 echo " with endomorphism = $use_endomorphism"
539 echo " with ecmult precomp = $set_precomp"
540 echo " with jni = $use_jni"
541 echo " with benchmarks = $use_benchmark"
542 echo " with coverage = $enable_coverage"
543 echo " module ecdh = $enable_module_ecdh"
544 echo " module recovery = $enable_module_recovery"
546 echo " asm = $set_asm"
547 echo " bignum = $set_bignum"
548 echo " field = $set_field"
549 echo " scalar = $set_scalar"
550 echo " ecmult window size = $set_ecmult_window"
553 echo " CFLAGS = $CFLAGS"
554 echo " CPPFLAGS = $CPPFLAGS"
555 echo " LDFLAGS = $LDFLAGS"