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 is yes)]),
89 [use_benchmark=$enableval],
92 AC_ARG_ENABLE(coverage,
93 AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis]),
94 [enable_coverage=$enableval],
98 AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
99 [use_tests=$enableval],
102 AC_ARG_ENABLE(openssl_tests,
103 AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is 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 is 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 is 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 is 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 is yes)]),
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 is no)]),
134 [enable_module_recovery=$enableval],
135 [enable_module_recovery=no])
138 AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is no)]),
139 [use_jni=$enableval],
142 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
143 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
145 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
146 [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
148 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
149 [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
151 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto]
152 [Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto])
154 AC_CHECK_TYPES([__int128])
156 if test x"$enable_coverage" = x"yes"; then
157 AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code])
158 CFLAGS="$CFLAGS -O0 --coverage"
164 if test x"$use_ecmult_static_precomputation" != x"no"; then
165 save_cross_compiling=$cross_compiling
169 AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}])
171 [AC_LANG_PROGRAM([], [return 0])],
172 [working_native_cc=yes],
173 [working_native_cc=no],[dnl])
175 cross_compiling=$save_cross_compiling
177 if test x"$working_native_cc" = x"no"; then
179 if test x"$use_ecmult_static_precomputation" = x"yes"; then
180 AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
182 AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
192 if test x"$req_asm" = x"auto"; then
194 if test x"$has_64bit_asm" = x"yes"; then
197 if test x"$set_asm" = x; then
205 if test x"$has_64bit_asm" != x"yes"; then
206 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
214 AC_MSG_ERROR([invalid assembly optimization selection])
219 if test x"$req_field" = x"auto"; then
220 if test x"set_asm" = x"x86_64"; then
223 if test x"$set_field" = x; then
225 if test x"$has_int128" = x"yes"; then
229 if test x"$set_field" = x; then
236 if test x"$set_asm" != x"x86_64"; then
238 if test x"$has_int128" != x"yes"; then
239 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
246 AC_MSG_ERROR([invalid field implementation selection])
251 if test x"$req_scalar" = x"auto"; then
253 if test x"$has_int128" = x"yes"; then
256 if test x"$set_scalar" = x; then
260 set_scalar=$req_scalar
264 if test x"$has_int128" != x"yes"; then
265 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
271 AC_MSG_ERROR([invalid scalar implementation selected])
276 if test x"$req_bignum" = x"auto"; then
278 if test x"$has_gmp" = x"yes"; then
282 if test x"$set_bignum" = x; then
286 set_bignum=$req_bignum
290 if test x"$has_gmp" != x"yes"; then
291 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
297 AC_MSG_ERROR([invalid bignum implementation selection])
302 # select assembly optimization
307 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
315 AC_MSG_ERROR([invalid assembly optimizations])
319 # select field implementation
322 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
325 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
328 AC_MSG_ERROR([invalid field implementation])
332 # select bignum implementation
335 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
336 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
337 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
338 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
341 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
342 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
343 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
346 AC_MSG_ERROR([invalid bignum implementation])
350 #select scalar implementation
353 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
356 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
359 AC_MSG_ERROR([invalid scalar implementation])
363 if test x"$use_tests" = x"yes"; then
365 if test x"$has_openssl_ec" = x"yes"; then
366 if test x"$enable_openssl_tests" != x"no"; then
367 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
368 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
369 SECP_TEST_LIBS="$CRYPTO_LIBS"
373 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
378 if test x"$enable_openssl_tests" = x"yes"; then
379 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
383 if test x"$enable_openssl_tests" = x"yes"; then
384 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
388 if test x"$use_jni" != x"no"; then
390 have_jni_dependencies=yes
391 if test x"$enable_module_ecdh" = x"no"; then
392 have_jni_dependencies=no
394 if test "x$JNI_INCLUDE_DIRS" = "x"; then
395 have_jni_dependencies=no
397 if test "x$have_jni_dependencies" = "xno"; then
398 if test x"$use_jni" = x"yes"; then
399 AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.])
401 AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
405 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
406 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
411 if test x"$set_bignum" = x"gmp"; then
412 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
413 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
416 if test x"$use_endomorphism" = x"yes"; then
417 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
420 if test x"$set_precomp" = x"yes"; then
421 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
424 if test x"$enable_module_ecdh" = x"yes"; then
425 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
428 if test x"$enable_module_recovery" = x"yes"; then
429 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
434 if test x"$use_external_asm" = x"yes"; then
435 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
438 AC_MSG_NOTICE([Using static precomputation: $set_precomp])
439 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
440 AC_MSG_NOTICE([Using field implementation: $set_field])
441 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
442 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
443 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
444 AC_MSG_NOTICE([Building benchmarks: $use_benchmark])
445 AC_MSG_NOTICE([Building for coverage analysis: $enable_coverage])
446 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
447 AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
448 AC_MSG_NOTICE([Using jni: $use_jni])
450 if test x"$enable_experimental" = x"yes"; then
451 AC_MSG_NOTICE([******])
452 AC_MSG_NOTICE([WARNING: experimental build])
453 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
454 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
455 AC_MSG_NOTICE([******])
457 if test x"$enable_module_ecdh" = x"yes"; then
458 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
460 if test x"$set_asm" = x"arm"; then
461 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
465 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
466 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
467 AC_SUBST(JNI_INCLUDES)
468 AC_SUBST(SECP_INCLUDES)
470 AC_SUBST(SECP_TEST_LIBS)
471 AC_SUBST(SECP_TEST_INCLUDES)
472 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
473 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
474 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
475 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
476 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
477 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
478 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
479 AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
480 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
481 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
483 dnl make sure nothing new is exported so that we don't break the cache
484 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
485 unset PKG_CONFIG_PATH
486 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"