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])
44 if test x$cross_compiling != xyes; then
45 AC_PATH_PROG([BREW],brew,)
46 if test x$BREW != x; then
47 dnl These Homebrew packages may be keg-only, meaning that they won't be found
48 dnl in expected paths because they may conflict with system files. Ask
49 dnl Homebrew where each one is located, then adjust paths accordingly.
51 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
52 gmp_prefix=`$BREW --prefix gmp 2>/dev/null`
53 if test x$openssl_prefix != x; then
54 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
55 export PKG_CONFIG_PATH
57 if test x$gmp_prefix != x; then
58 GMP_CPPFLAGS="-I$gmp_prefix/include"
59 GMP_LIBS="-L$gmp_prefix/lib"
62 AC_PATH_PROG([PORT],port,)
63 dnl if homebrew isn't installed and macports is, add the macports default paths
65 if test x$PORT != x; then
66 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
67 LDFLAGS="$LDFLAGS -L/opt/local/lib"
76 warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings"
77 saved_CFLAGS="$CFLAGS"
78 CFLAGS="$CFLAGS $warn_CFLAGS"
79 AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
80 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
81 [ AC_MSG_RESULT([yes]) ],
83 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(endomorphism,
98 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
99 [use_endomorphism=$enableval],
100 [use_endomorphism=no])
102 AC_ARG_ENABLE(ecmult_static_precomputation,
103 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]),
104 [use_ecmult_static_precomputation=$enableval],
105 [use_ecmult_static_precomputation=yes])
107 AC_ARG_ENABLE(module_ecdh,
108 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (default is no)]),
109 [enable_module_ecdh=$enableval],
110 [enable_module_ecdh=no])
112 AC_ARG_ENABLE(module_schnorr,
113 AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (default is no)]),
114 [enable_module_schnorr=$enableval],
115 [enable_module_schnorr=no])
117 AC_ARG_ENABLE(module_recovery,
118 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]),
119 [enable_module_recovery=$enableval],
120 [enable_module_recovery=no])
122 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
123 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
125 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
126 [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
128 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
129 [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
131 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto]
132 [Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto])
134 AC_CHECK_TYPES([__int128])
136 AC_MSG_CHECKING([for __builtin_expect])
137 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
138 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
139 [ AC_MSG_RESULT([no])
142 if test x"$req_asm" = x"auto"; then
144 if test x"$has_64bit_asm" = x"yes"; then
147 if test x"$set_asm" = x; then
155 if test x"$has_64bit_asm" != x"yes"; then
156 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
162 AC_MSG_ERROR([invalid assembly optimization selection])
167 if test x"$req_field" = x"auto"; then
168 if test x"set_asm" = x"x86_64"; then
171 if test x"$set_field" = x; then
173 if test x"$has_int128" = x"yes"; then
177 if test x"$set_field" = x; then
184 if test x"$set_asm" != x"x86_64"; then
186 if test x"$has_int128" != x"yes"; then
187 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
194 AC_MSG_ERROR([invalid field implementation selection])
199 if test x"$req_scalar" = x"auto"; then
201 if test x"$has_int128" = x"yes"; then
204 if test x"$set_scalar" = x; then
208 set_scalar=$req_scalar
212 if test x"$has_int128" != x"yes"; then
213 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
219 AC_MSG_ERROR([invalid scalar implementation selected])
224 if test x"$req_bignum" = x"auto"; then
226 if test x"$has_gmp" = x"yes"; then
230 if test x"$set_bignum" = x; then
234 set_bignum=$req_bignum
238 if test x"$has_gmp" != x"yes"; then
239 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
245 AC_MSG_ERROR([invalid bignum implementation selection])
250 # select assembly optimization
253 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
258 AC_MSG_ERROR([invalid assembly optimizations])
262 # select field implementation
265 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
268 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
271 AC_MSG_ERROR([invalid field implementation])
275 # select bignum implementation
278 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
279 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
280 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
281 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
284 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
285 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
286 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
289 AC_MSG_ERROR([invalid bignum implementation])
293 #select scalar implementation
296 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
299 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
302 AC_MSG_ERROR([invalid scalar implementation])
306 if test x"$use_tests" = x"yes"; then
308 if test x"$has_openssl_ec" = x"yes"; then
309 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
310 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
311 SECP_TEST_LIBS="$CRYPTO_LIBS"
315 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
322 if test x"$set_bignum" = x"gmp"; then
323 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
324 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
327 if test x"$use_endomorphism" = x"yes"; then
328 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
331 if test x"$use_ecmult_static_precomputation" = x"yes"; then
332 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
335 if test x"$enable_module_ecdh" = x"yes"; then
336 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
339 if test x"$enable_module_schnorr" = x"yes"; then
340 AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module])
343 if test x"$enable_module_recovery" = x"yes"; then
344 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
349 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
350 AC_MSG_NOTICE([Using field implementation: $set_field])
351 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
352 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
353 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
354 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
356 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
357 AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
359 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
360 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
361 AC_SUBST(SECP_INCLUDES)
363 AC_SUBST(SECP_TEST_LIBS)
364 AC_SUBST(SECP_TEST_INCLUDES)
365 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
366 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
367 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$use_ecmult_static_precomputation" = x"yes"])
368 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
369 AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
370 AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
372 dnl make sure nothing new is exported so that we don't break the cache
373 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
374 unset PKG_CONFIG_PATH
375 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"