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])
35 if test x$cross_compiling != xyes; then
36 AC_PATH_PROG([BREW],brew,)
37 if test x$BREW != x; then
38 dnl These Homebrew packages may be keg-only, meaning that they won't be found
39 dnl in expected paths because they may conflict with system files. Ask
40 dnl Homebrew where each one is located, then adjust paths accordingly.
42 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
43 gmp_prefix=`$BREW --prefix gmp 2>/dev/null`
44 if test x$openssl_prefix != x; then
45 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
46 export PKG_CONFIG_PATH
48 if test x$gmp_prefix != x; then
49 GMP_CPPFLAGS="-I$gmp_prefix/include"
50 GMP_LIBS="-L$gmp_prefix/lib"
53 AC_PATH_PROG([PORT],port,)
54 dnl if homebrew isn't installed and macports is, add the macports default paths
56 if test x$PORT != x; then
57 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
58 LDFLAGS="$LDFLAGS -L/opt/local/lib"
67 warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings"
68 saved_CFLAGS="$CFLAGS"
69 CFLAGS="$CFLAGS $warn_CFLAGS"
70 AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
71 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
72 [ AC_MSG_RESULT([yes]) ],
74 CFLAGS="$saved_CFLAGS"
77 saved_CFLAGS="$CFLAGS"
78 CFLAGS="$CFLAGS -fvisibility=hidden"
79 AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
80 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
81 [ AC_MSG_RESULT([yes]) ],
83 CFLAGS="$saved_CFLAGS"
86 AC_ARG_ENABLE(benchmark,
87 AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]),
88 [use_benchmark=$enableval],
92 AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
93 [use_tests=$enableval],
96 AC_ARG_ENABLE(experimental,
97 AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]),
98 [use_experimental=$enableval],
99 [use_experimental=no])
101 AC_ARG_ENABLE(endomorphism,
102 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
103 [use_endomorphism=$enableval],
104 [use_endomorphism=no])
106 AC_ARG_ENABLE(ecmult_static_precomputation,
107 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]),
108 [use_ecmult_static_precomputation=$enableval],
109 [use_ecmult_static_precomputation=yes])
111 AC_ARG_ENABLE(module_ecdh,
112 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),
113 [enable_module_ecdh=$enableval],
114 [enable_module_ecdh=no])
116 AC_ARG_ENABLE(module_schnorr,
117 AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (experimental)]),
118 [enable_module_schnorr=$enableval],
119 [enable_module_schnorr=no])
121 AC_ARG_ENABLE(module_recovery,
122 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]),
123 [enable_module_recovery=$enableval],
124 [enable_module_recovery=no])
127 AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]),
128 [use_jni=$enableval],
131 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
132 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
134 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
135 [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
137 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
138 [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
140 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto]
141 [Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto])
143 AC_CHECK_TYPES([__int128])
145 AC_MSG_CHECKING([for __builtin_expect])
146 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
147 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
148 [ AC_MSG_RESULT([no])
151 if test x"$req_asm" = x"auto"; then
153 if test x"$has_64bit_asm" = x"yes"; then
156 if test x"$set_asm" = x; then
164 if test x"$has_64bit_asm" != x"yes"; then
165 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
171 AC_MSG_ERROR([invalid assembly optimization selection])
176 if test x"$req_field" = x"auto"; then
177 if test x"set_asm" = x"x86_64"; then
180 if test x"$set_field" = x; then
182 if test x"$has_int128" = x"yes"; then
186 if test x"$set_field" = x; then
193 if test x"$set_asm" != x"x86_64"; then
195 if test x"$has_int128" != x"yes"; then
196 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
203 AC_MSG_ERROR([invalid field implementation selection])
208 if test x"$req_scalar" = x"auto"; then
210 if test x"$has_int128" = x"yes"; then
213 if test x"$set_scalar" = x; then
217 set_scalar=$req_scalar
221 if test x"$has_int128" != x"yes"; then
222 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
228 AC_MSG_ERROR([invalid scalar implementation selected])
233 if test x"$req_bignum" = x"auto"; then
235 if test x"$has_gmp" = x"yes"; then
239 if test x"$set_bignum" = x; then
243 set_bignum=$req_bignum
247 if test x"$has_gmp" != x"yes"; then
248 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
254 AC_MSG_ERROR([invalid bignum implementation selection])
259 # select assembly optimization
262 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
267 AC_MSG_ERROR([invalid assembly optimizations])
271 # select field implementation
274 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
277 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
280 AC_MSG_ERROR([invalid field implementation])
284 # select bignum implementation
287 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
288 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
289 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
290 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
293 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
294 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
295 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
298 AC_MSG_ERROR([invalid bignum implementation])
302 #select scalar implementation
305 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
308 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
311 AC_MSG_ERROR([invalid scalar implementation])
315 if test x"$use_tests" = x"yes"; then
317 if test x"$has_openssl_ec" = x"yes"; then
318 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
319 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
320 SECP_TEST_LIBS="$CRYPTO_LIBS"
324 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
331 if test x"$use_jni" != x"no"; then
333 if test "x$JNI_INCLUDE_DIRS" = "x"; then
334 if test x"$use_jni" = x"yes"; then
335 AC_MSG_ERROR([jni support explicitly requested but headers were not found])
337 AC_MSG_WARN([jni headers not found. jni support disabled])
341 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
342 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
347 if test x"$set_bignum" = x"gmp"; then
348 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
349 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
352 if test x"$use_endomorphism" = x"yes"; then
353 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
356 if test x"$use_ecmult_static_precomputation" = x"yes"; then
357 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
360 if test x"$enable_module_ecdh" = x"yes"; then
361 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
364 if test x"$enable_module_schnorr" = x"yes"; then
365 AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module])
368 if test x"$enable_module_recovery" = x"yes"; then
369 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
374 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
375 AC_MSG_NOTICE([Using field implementation: $set_field])
376 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
377 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
378 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
379 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
380 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
381 AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
382 AC_MSG_NOTICE([Using jni: $use_jni])
384 if test x"$enable_experimental" = x"yes"; then
385 AC_MSG_NOTICE([******])
386 AC_MSG_NOTICE([WARNING: experimental build])
387 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
388 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
389 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
390 AC_MSG_NOTICE([******])
392 if test x"$enable_module_schnorr" = x"yes"; then
393 AC_MSG_ERROR([Schnorr signature module is experimental. Use --enable-experimental to allow.])
395 if test x"$enable_module_ecdh" = x"yes"; then
396 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
400 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
401 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
402 AC_SUBST(JNI_INCLUDES)
403 AC_SUBST(SECP_INCLUDES)
405 AC_SUBST(SECP_TEST_LIBS)
406 AC_SUBST(SECP_TEST_INCLUDES)
407 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
408 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
409 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$use_ecmult_static_precomputation" = x"yes"])
410 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
411 AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
412 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
413 AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
415 dnl make sure nothing new is exported so that we don't break the cache
416 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
417 unset PKG_CONFIG_PATH
418 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"