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(experimental,
98 AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]),
99 [use_experimental=$enableval],
100 [use_experimental=no])
102 AC_ARG_ENABLE(endomorphism,
103 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
104 [use_endomorphism=$enableval],
105 [use_endomorphism=no])
107 AC_ARG_ENABLE(ecmult_static_precomputation,
108 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]),
109 [use_ecmult_static_precomputation=$enableval],
110 [use_ecmult_static_precomputation=yes])
112 AC_ARG_ENABLE(module_ecdh,
113 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),
114 [enable_module_ecdh=$enableval],
115 [enable_module_ecdh=no])
117 AC_ARG_ENABLE(module_schnorr,
118 AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (experimental)]),
119 [enable_module_schnorr=$enableval],
120 [enable_module_schnorr=no])
122 AC_ARG_ENABLE(module_recovery,
123 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]),
124 [enable_module_recovery=$enableval],
125 [enable_module_recovery=no])
128 AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]),
129 [use_jni=$enableval],
132 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
133 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
135 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
136 [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
138 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
139 [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
141 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto]
142 [Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto])
144 AC_CHECK_TYPES([__int128])
146 AC_MSG_CHECKING([for __builtin_expect])
147 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
148 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
149 [ AC_MSG_RESULT([no])
152 if test x"$req_asm" = x"auto"; then
154 if test x"$has_64bit_asm" = x"yes"; then
157 if test x"$set_asm" = x; then
165 if test x"$has_64bit_asm" != x"yes"; then
166 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
174 AC_MSG_ERROR([invalid assembly optimization selection])
179 if test x"$req_field" = x"auto"; then
180 if test x"set_asm" = x"x86_64"; then
183 if test x"$set_field" = x; then
185 if test x"$has_int128" = x"yes"; then
189 if test x"$set_field" = x; then
196 if test x"$set_asm" != x"x86_64"; then
198 if test x"$has_int128" != x"yes"; then
199 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
206 AC_MSG_ERROR([invalid field implementation selection])
211 if test x"$req_scalar" = x"auto"; then
213 if test x"$has_int128" = x"yes"; then
216 if test x"$set_scalar" = x; then
220 set_scalar=$req_scalar
224 if test x"$has_int128" != x"yes"; then
225 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
231 AC_MSG_ERROR([invalid scalar implementation selected])
236 if test x"$req_bignum" = x"auto"; then
238 if test x"$has_gmp" = x"yes"; then
242 if test x"$set_bignum" = x; then
246 set_bignum=$req_bignum
250 if test x"$has_gmp" != x"yes"; then
251 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
257 AC_MSG_ERROR([invalid bignum implementation selection])
262 # select assembly optimization
267 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
275 AC_MSG_ERROR([invalid assembly optimizations])
279 # select field implementation
282 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
285 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
288 AC_MSG_ERROR([invalid field implementation])
292 # select bignum implementation
295 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
296 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
297 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
298 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
301 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
302 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
303 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
306 AC_MSG_ERROR([invalid bignum implementation])
310 #select scalar implementation
313 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
316 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
319 AC_MSG_ERROR([invalid scalar implementation])
323 if test x"$use_tests" = x"yes"; then
325 if test x"$has_openssl_ec" = x"yes"; then
326 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
327 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
328 SECP_TEST_LIBS="$CRYPTO_LIBS"
332 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
339 if test x"$use_jni" != x"no"; then
341 have_jni_dependencies=yes
342 if test x"$enable_module_schnorr" = x"no"; then
343 have_jni_dependencies=no
345 if test x"$enable_module_ecdh" = x"no"; then
346 have_jni_dependencies=no
348 if test "x$JNI_INCLUDE_DIRS" = "x"; then
349 have_jni_dependencies=no
351 if test "x$have_jni_dependencies" = "xno"; then
352 if test x"$use_jni" = x"yes"; then
353 AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and Schnorr and try again.])
355 AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
359 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
360 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
365 if test x"$set_bignum" = x"gmp"; then
366 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
367 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
370 if test x"$use_endomorphism" = x"yes"; then
371 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
374 if test x"$use_ecmult_static_precomputation" = x"yes"; then
375 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
378 if test x"$enable_module_ecdh" = x"yes"; then
379 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
382 if test x"$enable_module_schnorr" = x"yes"; then
383 AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module])
386 if test x"$enable_module_recovery" = x"yes"; then
387 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
392 if test x"$use_external_asm" = x"yes"; then
393 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
396 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
397 AC_MSG_NOTICE([Using field implementation: $set_field])
398 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
399 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
400 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
401 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
402 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
403 AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
404 AC_MSG_NOTICE([Using jni: $use_jni])
406 if test x"$enable_experimental" = x"yes"; then
407 AC_MSG_NOTICE([******])
408 AC_MSG_NOTICE([WARNING: experimental build])
409 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
410 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
411 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
412 AC_MSG_NOTICE([******])
414 if test x"$enable_module_schnorr" = x"yes"; then
415 AC_MSG_ERROR([Schnorr signature module is experimental. Use --enable-experimental to allow.])
417 if test x"$enable_module_ecdh" = x"yes"; then
418 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
420 if test x"$set_asm" = x"arm"; then
421 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
425 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
426 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
427 AC_SUBST(JNI_INCLUDES)
428 AC_SUBST(SECP_INCLUDES)
430 AC_SUBST(SECP_TEST_LIBS)
431 AC_SUBST(SECP_TEST_INCLUDES)
432 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
433 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
434 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$use_ecmult_static_precomputation" = x"yes"])
435 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
436 AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
437 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
438 AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
439 AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
440 AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
442 dnl make sure nothing new is exported so that we don't break the cache
443 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
444 unset PKG_CONFIG_PATH
445 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"