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(endomorphism,
97 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
98 [use_endomorphism=$enableval],
99 [use_endomorphism=no])
101 AC_ARG_ENABLE(ecmult_static_precomputation,
102 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]),
103 [use_ecmult_static_precomputation=$enableval],
104 [use_ecmult_static_precomputation=yes])
106 AC_ARG_ENABLE(module_ecdh,
107 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (default is no)]),
108 [enable_module_ecdh=$enableval],
109 [enable_module_ecdh=no])
111 AC_ARG_ENABLE(module_schnorr,
112 AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (default is no)]),
113 [enable_module_schnorr=$enableval],
114 [enable_module_schnorr=no])
116 AC_ARG_ENABLE(module_recovery,
117 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]),
118 [enable_module_recovery=$enableval],
119 [enable_module_recovery=no])
121 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
122 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
124 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
125 [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
127 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
128 [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
130 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto]
131 [Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto])
133 AC_CHECK_TYPES([__int128])
135 AC_MSG_CHECKING([for __builtin_expect])
136 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
137 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
138 [ AC_MSG_RESULT([no])
141 if test x"$req_asm" = x"auto"; then
143 if test x"$has_64bit_asm" = x"yes"; then
146 if test x"$set_asm" = x; then
154 if test x"$has_64bit_asm" != x"yes"; then
155 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
161 AC_MSG_ERROR([invalid assembly optimization selection])
166 if test x"$req_field" = x"auto"; then
167 if test x"set_asm" = x"x86_64"; then
170 if test x"$set_field" = x; then
172 if test x"$has_int128" = x"yes"; then
176 if test x"$set_field" = x; then
183 if test x"$set_asm" != x"x86_64"; then
185 if test x"$has_int128" != x"yes"; then
186 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
193 AC_MSG_ERROR([invalid field implementation selection])
198 if test x"$req_scalar" = x"auto"; then
200 if test x"$has_int128" = x"yes"; then
203 if test x"$set_scalar" = x; then
207 set_scalar=$req_scalar
211 if test x"$has_int128" != x"yes"; then
212 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
218 AC_MSG_ERROR([invalid scalar implementation selected])
223 if test x"$req_bignum" = x"auto"; then
225 if test x"$has_gmp" = x"yes"; then
229 if test x"$set_bignum" = x; then
233 set_bignum=$req_bignum
237 if test x"$has_gmp" != x"yes"; then
238 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
244 AC_MSG_ERROR([invalid bignum implementation selection])
249 # select assembly optimization
252 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
257 AC_MSG_ERROR([invalid assembly optimizations])
261 # select field implementation
264 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
267 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
270 AC_MSG_ERROR([invalid field implementation])
274 # select bignum implementation
277 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
278 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
279 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
280 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
283 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
284 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
285 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
288 AC_MSG_ERROR([invalid bignum implementation])
292 #select scalar implementation
295 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
298 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
301 AC_MSG_ERROR([invalid scalar implementation])
305 if test x"$use_tests" = x"yes"; then
307 if test x"$has_openssl_ec" = x"yes"; then
308 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
309 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
310 SECP_TEST_LIBS="$CRYPTO_LIBS"
314 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
321 if test x"$set_bignum" = x"gmp"; then
322 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
323 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
326 if test x"$use_endomorphism" = x"yes"; then
327 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
330 if test x"$use_ecmult_static_precomputation" = x"yes"; then
331 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
334 if test x"$enable_module_ecdh" = x"yes"; then
335 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
338 if test x"$enable_module_schnorr" = x"yes"; then
339 AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module])
342 if test x"$enable_module_recovery" = x"yes"; then
343 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
348 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
349 AC_MSG_NOTICE([Using field implementation: $set_field])
350 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
351 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
352 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
353 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
355 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
356 AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
358 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
359 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
360 AC_SUBST(SECP_INCLUDES)
362 AC_SUBST(SECP_TEST_LIBS)
363 AC_SUBST(SECP_TEST_INCLUDES)
364 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
365 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
366 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$use_ecmult_static_precomputation" = x"yes"])
367 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
368 AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
369 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
371 dnl make sure nothing new is exported so that we don't break the cache
372 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
373 unset PKG_CONFIG_PATH
374 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"