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 no)]),
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 auto)]),
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 AC_MSG_CHECKING([for __builtin_expect])
157 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
158 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
159 [ AC_MSG_RESULT([no])
162 if test x"$enable_coverage" = x"yes"; then
163 AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code])
164 CFLAGS="$CFLAGS -O0 --coverage"
170 if test x"$use_ecmult_static_precomputation" != x"no"; then
171 save_cross_compiling=$cross_compiling
175 AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}])
177 [AC_LANG_PROGRAM([], [return 0])],
178 [working_native_cc=yes],
179 [working_native_cc=no],[dnl])
181 cross_compiling=$save_cross_compiling
183 if test x"$working_native_cc" = x"no"; then
185 if test x"$use_ecmult_static_precomputation" = x"yes"; then
186 AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
188 AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
198 if test x"$req_asm" = x"auto"; then
200 if test x"$has_64bit_asm" = x"yes"; then
203 if test x"$set_asm" = x; then
211 if test x"$has_64bit_asm" != x"yes"; then
212 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
220 AC_MSG_ERROR([invalid assembly optimization selection])
225 if test x"$req_field" = x"auto"; then
226 if test x"set_asm" = x"x86_64"; then
229 if test x"$set_field" = x; then
231 if test x"$has_int128" = x"yes"; then
235 if test x"$set_field" = x; then
242 if test x"$set_asm" != x"x86_64"; then
244 if test x"$has_int128" != x"yes"; then
245 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
252 AC_MSG_ERROR([invalid field implementation selection])
257 if test x"$req_scalar" = x"auto"; then
259 if test x"$has_int128" = x"yes"; then
262 if test x"$set_scalar" = x; then
266 set_scalar=$req_scalar
270 if test x"$has_int128" != x"yes"; then
271 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
277 AC_MSG_ERROR([invalid scalar implementation selected])
282 if test x"$req_bignum" = x"auto"; then
284 if test x"$has_gmp" = x"yes"; then
288 if test x"$set_bignum" = x; then
292 set_bignum=$req_bignum
296 if test x"$has_gmp" != x"yes"; then
297 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
303 AC_MSG_ERROR([invalid bignum implementation selection])
308 # select assembly optimization
313 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
321 AC_MSG_ERROR([invalid assembly optimizations])
325 # select field implementation
328 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
331 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
334 AC_MSG_ERROR([invalid field implementation])
338 # select bignum implementation
341 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
342 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
343 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
344 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
347 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
348 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
349 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
352 AC_MSG_ERROR([invalid bignum implementation])
356 #select scalar implementation
359 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
362 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
365 AC_MSG_ERROR([invalid scalar implementation])
369 if test x"$use_tests" = x"yes"; then
371 if test x"$has_openssl_ec" = x"yes"; then
372 if test x"$enable_openssl_tests" != x"no"; then
373 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
374 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
375 SECP_TEST_LIBS="$CRYPTO_LIBS"
379 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
384 if test x"$enable_openssl_tests" = x"yes"; then
385 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
389 if test x"$enable_openssl_tests" = x"yes"; then
390 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
394 if test x"$use_jni" != x"no"; then
396 have_jni_dependencies=yes
397 if test x"$enable_module_ecdh" = x"no"; then
398 have_jni_dependencies=no
400 if test "x$JNI_INCLUDE_DIRS" = "x"; then
401 have_jni_dependencies=no
403 if test "x$have_jni_dependencies" = "xno"; then
404 if test x"$use_jni" = x"yes"; then
405 AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.])
407 AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
411 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
412 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
417 if test x"$set_bignum" = x"gmp"; then
418 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
419 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
422 if test x"$use_endomorphism" = x"yes"; then
423 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
426 if test x"$set_precomp" = x"yes"; then
427 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
430 if test x"$enable_module_ecdh" = x"yes"; then
431 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
434 if test x"$enable_module_recovery" = x"yes"; then
435 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
440 if test x"$use_external_asm" = x"yes"; then
441 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
444 AC_MSG_NOTICE([Using static precomputation: $set_precomp])
445 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
446 AC_MSG_NOTICE([Using field implementation: $set_field])
447 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
448 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
449 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
450 AC_MSG_NOTICE([Building for coverage analysis: $enable_coverage])
451 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
452 AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
453 AC_MSG_NOTICE([Using jni: $use_jni])
455 if test x"$enable_experimental" = x"yes"; then
456 AC_MSG_NOTICE([******])
457 AC_MSG_NOTICE([WARNING: experimental build])
458 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
459 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
460 AC_MSG_NOTICE([******])
462 if test x"$enable_module_ecdh" = x"yes"; then
463 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
465 if test x"$set_asm" = x"arm"; then
466 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
470 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
471 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
472 AC_SUBST(JNI_INCLUDES)
473 AC_SUBST(SECP_INCLUDES)
475 AC_SUBST(SECP_TEST_LIBS)
476 AC_SUBST(SECP_TEST_INCLUDES)
477 AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"])
478 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
479 AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"])
480 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
481 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
482 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
483 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
484 AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
485 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
486 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
488 dnl make sure nothing new is exported so that we don't break the cache
489 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
490 unset PKG_CONFIG_PATH
491 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"