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],
93 AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
94 [use_tests=$enableval],
97 AC_ARG_ENABLE(openssl_tests,
98 AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]),
99 [enable_openssl_tests=$enableval],
100 [enable_openssl_tests=auto])
102 AC_ARG_ENABLE(experimental,
103 AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]),
104 [use_experimental=$enableval],
105 [use_experimental=no])
107 AC_ARG_ENABLE(endomorphism,
108 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
109 [use_endomorphism=$enableval],
110 [use_endomorphism=no])
112 AC_ARG_ENABLE(ecmult_static_precomputation,
113 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]),
114 [use_ecmult_static_precomputation=$enableval],
115 [use_ecmult_static_precomputation=auto])
117 AC_ARG_ENABLE(module_ecdh,
118 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),
119 [enable_module_ecdh=$enableval],
120 [enable_module_ecdh=no])
122 AC_ARG_ENABLE(module_schnorr,
123 AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (experimental)]),
124 [enable_module_schnorr=$enableval],
125 [enable_module_schnorr=no])
127 AC_ARG_ENABLE(module_recovery,
128 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]),
129 [enable_module_recovery=$enableval],
130 [enable_module_recovery=no])
133 AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]),
134 [use_jni=$enableval],
137 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
138 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
140 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
141 [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
143 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
144 [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
146 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto]
147 [Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto])
149 AC_CHECK_TYPES([__int128])
151 AC_MSG_CHECKING([for __builtin_expect])
152 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
153 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
154 [ AC_MSG_RESULT([no])
157 if test x"$use_ecmult_static_precomputation" != x"no"; then
158 save_cross_compiling=$cross_compiling
162 AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}])
164 [AC_LANG_PROGRAM([], [return 0])],
165 [working_native_cc=yes],
166 [working_native_cc=no],[dnl])
168 cross_compiling=$save_cross_compiling
170 if test x"$working_native_cc" = x"no"; then
172 if test x"$use_ecmult_static_precomputation" = x"yes"; then
173 AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
175 AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
185 if test x"$req_asm" = x"auto"; then
187 if test x"$has_64bit_asm" = x"yes"; then
190 if test x"$set_asm" = x; then
198 if test x"$has_64bit_asm" != x"yes"; then
199 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
207 AC_MSG_ERROR([invalid assembly optimization selection])
212 if test x"$req_field" = x"auto"; then
213 if test x"set_asm" = x"x86_64"; then
216 if test x"$set_field" = x; then
218 if test x"$has_int128" = x"yes"; then
222 if test x"$set_field" = x; then
229 if test x"$set_asm" != x"x86_64"; then
231 if test x"$has_int128" != x"yes"; then
232 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
239 AC_MSG_ERROR([invalid field implementation selection])
244 if test x"$req_scalar" = x"auto"; then
246 if test x"$has_int128" = x"yes"; then
249 if test x"$set_scalar" = x; then
253 set_scalar=$req_scalar
257 if test x"$has_int128" != x"yes"; then
258 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
264 AC_MSG_ERROR([invalid scalar implementation selected])
269 if test x"$req_bignum" = x"auto"; then
271 if test x"$has_gmp" = x"yes"; then
275 if test x"$set_bignum" = x; then
279 set_bignum=$req_bignum
283 if test x"$has_gmp" != x"yes"; then
284 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
290 AC_MSG_ERROR([invalid bignum implementation selection])
295 # select assembly optimization
300 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
308 AC_MSG_ERROR([invalid assembly optimizations])
312 # select field implementation
315 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
318 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
321 AC_MSG_ERROR([invalid field implementation])
325 # select bignum implementation
328 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
329 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
330 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
331 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
334 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
335 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
336 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
339 AC_MSG_ERROR([invalid bignum implementation])
343 #select scalar implementation
346 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
349 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
352 AC_MSG_ERROR([invalid scalar implementation])
356 if test x"$use_tests" = x"yes"; then
358 if test x"$has_openssl_ec" = x"yes"; then
359 if test x"$enable_openssl_tests" != x"no"; then
360 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
361 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
362 SECP_TEST_LIBS="$CRYPTO_LIBS"
366 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
371 if test x"$enable_openssl_tests" = x"yes"; then
372 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
376 if test x"$enable_openssl_tests" = x"yes"; then
377 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
381 if test x"$use_jni" != x"no"; then
383 have_jni_dependencies=yes
384 if test x"$enable_module_schnorr" = x"no"; then
385 have_jni_dependencies=no
387 if test x"$enable_module_ecdh" = x"no"; then
388 have_jni_dependencies=no
390 if test "x$JNI_INCLUDE_DIRS" = "x"; then
391 have_jni_dependencies=no
393 if test "x$have_jni_dependencies" = "xno"; then
394 if test x"$use_jni" = x"yes"; then
395 AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and Schnorr and try again.])
397 AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
401 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
402 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
407 if test x"$set_bignum" = x"gmp"; then
408 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
409 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
412 if test x"$use_endomorphism" = x"yes"; then
413 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
416 if test x"$set_precomp" = x"yes"; then
417 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
420 if test x"$enable_module_ecdh" = x"yes"; then
421 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
424 if test x"$enable_module_schnorr" = x"yes"; then
425 AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature 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 ECDH module: $enable_module_ecdh])
445 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
446 AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
447 AC_MSG_NOTICE([Using jni: $use_jni])
449 if test x"$enable_experimental" = x"yes"; then
450 AC_MSG_NOTICE([******])
451 AC_MSG_NOTICE([WARNING: experimental build])
452 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
453 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
454 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
455 AC_MSG_NOTICE([******])
457 if test x"$enable_module_schnorr" = x"yes"; then
458 AC_MSG_ERROR([Schnorr signature module is experimental. Use --enable-experimental to allow.])
460 if test x"$enable_module_ecdh" = x"yes"; then
461 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
463 if test x"$set_asm" = x"arm"; then
464 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
468 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
469 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
470 AC_SUBST(JNI_INCLUDES)
471 AC_SUBST(SECP_INCLUDES)
473 AC_SUBST(SECP_TEST_LIBS)
474 AC_SUBST(SECP_TEST_INCLUDES)
475 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
476 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
477 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
478 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
479 AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
480 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
481 AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
482 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
483 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
485 dnl make sure nothing new is exported so that we don't break the cache
486 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
487 unset PKG_CONFIG_PATH
488 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"