1AC_PREREQ([2.60])
2AC_INIT([libsecp256k1],[0.1])
3AC_CONFIG_AUX_DIR([build-aux])
4AC_CONFIG_MACRO_DIR([build-aux/m4])
5AC_CANONICAL_HOST
6AH_TOP([#ifndef LIBSECP256K1_CONFIG_H])
7AH_TOP([#define LIBSECP256K1_CONFIG_H])
8AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/])
9AM_INIT_AUTOMAKE([foreign subdir-objects])
10LT_INIT
11
12dnl make the compilation flags quiet unless V=1 is used
13m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
14
15PKG_PROG_PKG_CONFIG
16
17AC_PATH_TOOL(AR, ar)
18AC_PATH_TOOL(RANLIB, ranlib)
19AC_PATH_TOOL(STRIP, strip)
20AX_PROG_CC_FOR_BUILD
21
22if test "x$CFLAGS" = "x"; then
23  CFLAGS="-O3 -g"
24fi
25
26AM_PROG_CC_C_O
27
28AC_PROG_CC_C89
29if test x"$ac_cv_prog_cc_c89" = x"no"; then
30  AC_MSG_ERROR([c89 compiler support required])
31fi
32AM_PROG_AS
33
34case $host_os in
35  *darwin*)
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.
42
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
48         fi
49         if test x$gmp_prefix != x; then
50           GMP_CPPFLAGS="-I$gmp_prefix/include"
51           GMP_LIBS="-L$gmp_prefix/lib"
52         fi
53       else
54         AC_PATH_PROG([PORT],port,)
55         dnl if homebrew isn't installed and macports is, add the macports default paths
56         dnl as a last resort.
57         if test x$PORT != x; then
58           CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
59           LDFLAGS="$LDFLAGS -L/opt/local/lib"
60         fi
61       fi
62     fi
63   ;;
64esac
65
66CFLAGS="$CFLAGS -W"
67
68warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings"
69saved_CFLAGS="$CFLAGS"
70CFLAGS="$CFLAGS $warn_CFLAGS"
71AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
72AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
73    [ AC_MSG_RESULT([yes]) ],
74    [ AC_MSG_RESULT([no])
75      CFLAGS="$saved_CFLAGS"
76    ])
77
78saved_CFLAGS="$CFLAGS"
79CFLAGS="$CFLAGS -fvisibility=hidden"
80AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
81AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
82    [ AC_MSG_RESULT([yes]) ],
83    [ AC_MSG_RESULT([no])
84      CFLAGS="$saved_CFLAGS"
85    ])
86
87AC_ARG_ENABLE(benchmark,
88    AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]),
89    [use_benchmark=$enableval],
90    [use_benchmark=no])
91
92AC_ARG_ENABLE(tests,
93    AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
94    [use_tests=$enableval],
95    [use_tests=yes])
96
97AC_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])
101
102AC_ARG_ENABLE(experimental,
103    AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]),
104    [use_experimental=$enableval],
105    [use_experimental=no])
106
107AC_ARG_ENABLE(endomorphism,
108    AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
109    [use_endomorphism=$enableval],
110    [use_endomorphism=no])
111
112AC_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])
116
117AC_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])
121
122AC_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])
126
127AC_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])
131
132AC_ARG_ENABLE(jni,
133    AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]),
134    [use_jni=$enableval],
135    [use_jni=auto])
136
137AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
138[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
139
140AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
141[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
142
143AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
144[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
145
146AC_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])
148
149AC_CHECK_TYPES([__int128])
150
151AC_MSG_CHECKING([for __builtin_expect])
152AC_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])
155    ])
156
157if test x"$use_ecmult_static_precomputation" != x"no"; then
158  save_cross_compiling=$cross_compiling
159  cross_compiling=no
160  TEMP_CC="$CC"
161  CC="$CC_FOR_BUILD"
162  AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}])
163  AC_RUN_IFELSE(
164    [AC_LANG_PROGRAM([], [return 0])],
165    [working_native_cc=yes],
166    [working_native_cc=no],[dnl])
167  CC="$TEMP_CC"
168  cross_compiling=$save_cross_compiling
169
170  if test x"$working_native_cc" = x"no"; then
171    set_precomp=no
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])
174    else
175      AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
176    fi
177  else
178    AC_MSG_RESULT([ok])
179    set_precomp=yes
180  fi
181else
182  set_precomp=no
183fi
184
185if test x"$req_asm" = x"auto"; then
186  SECP_64BIT_ASM_CHECK
187  if test x"$has_64bit_asm" = x"yes"; then
188    set_asm=x86_64
189  fi
190  if test x"$set_asm" = x; then
191    set_asm=no
192  fi
193else
194  set_asm=$req_asm
195  case $set_asm in
196  x86_64)
197    SECP_64BIT_ASM_CHECK
198    if test x"$has_64bit_asm" != x"yes"; then
199      AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
200    fi
201    ;;
202  arm)
203    ;;
204  no)
205    ;;
206  *)
207    AC_MSG_ERROR([invalid assembly optimization selection])
208    ;;
209  esac
210fi
211
212if test x"$req_field" = x"auto"; then
213  if test x"set_asm" = x"x86_64"; then
214    set_field=64bit
215  fi
216  if test x"$set_field" = x; then
217    SECP_INT128_CHECK
218    if test x"$has_int128" = x"yes"; then
219      set_field=64bit
220    fi
221  fi
222  if test x"$set_field" = x; then
223    set_field=32bit
224  fi
225else
226  set_field=$req_field
227  case $set_field in
228  64bit)
229    if test x"$set_asm" != x"x86_64"; then
230      SECP_INT128_CHECK
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])
233      fi
234    fi
235    ;;
236  32bit)
237    ;;
238  *)
239    AC_MSG_ERROR([invalid field implementation selection])
240    ;;
241  esac
242fi
243
244if test x"$req_scalar" = x"auto"; then
245  SECP_INT128_CHECK
246  if test x"$has_int128" = x"yes"; then
247    set_scalar=64bit
248  fi
249  if test x"$set_scalar" = x; then
250    set_scalar=32bit
251  fi
252else
253  set_scalar=$req_scalar
254  case $set_scalar in
255  64bit)
256    SECP_INT128_CHECK
257    if test x"$has_int128" != x"yes"; then
258      AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
259    fi
260    ;;
261  32bit)
262    ;;
263  *)
264    AC_MSG_ERROR([invalid scalar implementation selected])
265    ;;
266  esac
267fi
268
269if test x"$req_bignum" = x"auto"; then
270  SECP_GMP_CHECK
271  if test x"$has_gmp" = x"yes"; then
272    set_bignum=gmp
273  fi
274
275  if test x"$set_bignum" = x; then
276    set_bignum=no
277  fi
278else
279  set_bignum=$req_bignum
280  case $set_bignum in
281  gmp)
282    SECP_GMP_CHECK
283    if test x"$has_gmp" != x"yes"; then
284      AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
285    fi
286    ;;
287  no)
288    ;;
289  *)
290    AC_MSG_ERROR([invalid bignum implementation selection])
291    ;;
292  esac
293fi
294
295# select assembly optimization
296use_external_asm=no
297
298case $set_asm in
299x86_64)
300  AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
301  ;;
302arm)
303  use_external_asm=yes
304  ;;
305no)
306  ;;
307*)
308  AC_MSG_ERROR([invalid assembly optimizations])
309  ;;
310esac
311
312# select field implementation
313case $set_field in
31464bit)
315  AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
316  ;;
31732bit)
318  AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
319  ;;
320*)
321  AC_MSG_ERROR([invalid field implementation])
322  ;;
323esac
324
325# select bignum implementation
326case $set_bignum in
327gmp)
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])
332  ;;
333no)
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])
337  ;;
338*)
339  AC_MSG_ERROR([invalid bignum implementation])
340  ;;
341esac
342
343#select scalar implementation
344case $set_scalar in
34564bit)
346  AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
347  ;;
34832bit)
349  AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
350  ;;
351*)
352  AC_MSG_ERROR([invalid scalar implementation])
353  ;;
354esac
355
356if test x"$use_tests" = x"yes"; then
357  SECP_OPENSSL_CHECK
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"
363
364      case $host in
365      *mingw*)
366        SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
367        ;;
368      esac
369    fi
370  else
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])
373    fi
374  fi
375else
376  if test x"$enable_openssl_tests" = x"yes"; then
377    AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
378  fi
379fi
380
381if test x"$use_jni" != x"no"; then
382  AX_JNI_INCLUDE_DIR
383  have_jni_dependencies=yes
384  if test x"$enable_module_schnorr" = x"no"; then
385    have_jni_dependencies=no
386  fi
387  if test x"$enable_module_ecdh" = x"no"; then
388    have_jni_dependencies=no
389  fi
390  if test "x$JNI_INCLUDE_DIRS" = "x"; then
391    have_jni_dependencies=no
392  fi
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.])
396    fi
397    AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
398    use_jni=no
399  else
400    use_jni=yes
401    for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
402      JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
403    done
404  fi
405fi
406
407if test x"$set_bignum" = x"gmp"; then
408  SECP_LIBS="$SECP_LIBS $GMP_LIBS"
409  SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
410fi
411
412if test x"$use_endomorphism" = x"yes"; then
413  AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
414fi
415
416if test x"$use_ecmult_static_precomputation" = x"yes"; then
417  AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
418fi
419
420if test x"$enable_module_ecdh" = x"yes"; then
421  AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
422fi
423
424if test x"$enable_module_schnorr" = x"yes"; then
425  AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module])
426fi
427
428if 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])
430fi
431
432AC_C_BIGENDIAN()
433
434if 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])
436fi
437
438AC_MSG_NOTICE([Using static precomputation: $set_precomp])
439AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
440AC_MSG_NOTICE([Using field implementation: $set_field])
441AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
442AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
443AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
444AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
445AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
446AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
447AC_MSG_NOTICE([Using jni: $use_jni])
448
449if 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([******])
456else
457  if test x"$enable_module_schnorr" = x"yes"; then
458    AC_MSG_ERROR([Schnorr signature module is experimental. Use --enable-experimental to allow.])
459  fi
460  if test x"$enable_module_ecdh" = x"yes"; then
461    AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
462  fi
463  if test x"$set_asm" = x"arm"; then
464    AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
465  fi
466fi
467
468AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
469AC_CONFIG_FILES([Makefile libsecp256k1.pc])
470AC_SUBST(JNI_INCLUDES)
471AC_SUBST(SECP_INCLUDES)
472AC_SUBST(SECP_LIBS)
473AC_SUBST(SECP_TEST_LIBS)
474AC_SUBST(SECP_TEST_INCLUDES)
475AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
476AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
477AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$use_ecmult_static_precomputation" = x"yes"])
478AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
479AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
480AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
481AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
482AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
483AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
484
485dnl make sure nothing new is exported so that we don't break the cache
486PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
487unset PKG_CONFIG_PATH
488PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
489
490AC_OUTPUT
491