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_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
118 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
120 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
121 [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
123 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
124 [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
126 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto]
127 [Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto])
129 AC_CHECK_TYPES([__int128])
131 AC_MSG_CHECKING([for __builtin_expect])
132 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
133 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
134 [ AC_MSG_RESULT([no])
137 if test x"$req_asm" = x"auto"; then
139 if test x"$has_64bit_asm" = x"yes"; then
142 if test x"$set_asm" = x; then
150 if test x"$has_64bit_asm" != x"yes"; then
151 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
157 AC_MSG_ERROR([invalid assembly optimization selection])
162 if test x"$req_field" = x"auto"; then
163 if test x"set_asm" = x"x86_64"; then
166 if test x"$set_field" = x; then
168 if test x"$has_int128" = x"yes"; then
172 if test x"$set_field" = x; then
179 if test x"$set_asm" != x"x86_64"; then
181 if test x"$has_int128" != x"yes"; then
182 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
189 AC_MSG_ERROR([invalid field implementation selection])
194 if test x"$req_scalar" = x"auto"; then
196 if test x"$has_int128" = x"yes"; then
199 if test x"$set_scalar" = x; then
203 set_scalar=$req_scalar
207 if test x"$has_int128" != x"yes"; then
208 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
214 AC_MSG_ERROR([invalid scalar implementation selected])
219 if test x"$req_bignum" = x"auto"; then
221 if test x"$has_gmp" = x"yes"; then
225 if test x"$set_bignum" = x; then
229 set_bignum=$req_bignum
233 if test x"$has_gmp" != x"yes"; then
234 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
240 AC_MSG_ERROR([invalid bignum implementation selection])
245 # select assembly optimization
248 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
253 AC_MSG_ERROR([invalid assembly optimizations])
257 # select field implementation
260 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
263 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
266 AC_MSG_ERROR([invalid field implementation])
270 # select bignum implementation
273 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
274 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
275 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
276 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
279 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
280 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
281 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
284 AC_MSG_ERROR([invalid bignum implementation])
288 #select scalar implementation
291 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
294 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
297 AC_MSG_ERROR([invalid scalar implementation])
301 if test x"$use_tests" = x"yes"; then
303 if test x"$has_openssl_ec" = x"yes"; then
304 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
305 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
306 SECP_TEST_LIBS="$CRYPTO_LIBS"
310 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
317 if test x"$set_bignum" = x"gmp"; then
318 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
319 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
322 if test x"$use_endomorphism" = x"yes"; then
323 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
326 if test x"$use_ecmult_static_precomputation" = x"yes"; then
327 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
330 if test x"$enable_module_ecdh" = x"yes"; then
331 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
334 if test x"$enable_module_schnorr" = x"yes"; then
335 AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module])
340 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
341 AC_MSG_NOTICE([Using field implementation: $set_field])
342 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
343 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
344 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
345 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
347 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
349 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
350 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
351 AC_SUBST(SECP_INCLUDES)
353 AC_SUBST(SECP_TEST_LIBS)
354 AC_SUBST(SECP_TEST_INCLUDES)
355 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
356 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
357 AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$use_ecmult_static_precomputation" = x"yes"])
358 AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
359 AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
361 dnl make sure nothing new is exported so that we don't break the cache
362 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
363 unset PKG_CONFIG_PATH
364 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"