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)
21 if test "x$CFLAGS" = "x"; then
26 if test x"$ac_cv_prog_cc_c89" = x"no"; then
27 AC_MSG_ERROR([c89 compiler support required])
41 if test x$cross_compiling != xyes; then
42 AC_PATH_PROG([BREW],brew,)
43 if test x$BREW != x; then
44 dnl These Homebrew packages may be keg-only, meaning that they won't be found
45 dnl in expected paths because they may conflict with system files. Ask
46 dnl Homebrew where each one is located, then adjust paths accordingly.
48 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
49 gmp_prefix=`$BREW --prefix gmp 2>/dev/null`
50 if test x$openssl_prefix != x; then
51 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
52 export PKG_CONFIG_PATH
54 if test x$gmp_prefix != x; then
55 GMP_CPPFLAGS="-I$gmp_prefix/include"
56 GMP_LIBS="-L$gmp_prefix/lib"
59 AC_PATH_PROG([PORT],port,)
60 dnl if homebrew isn't installed and macports is, add the macports default paths
62 if test x$PORT != x; then
63 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
64 LDFLAGS="$LDFLAGS -L/opt/local/lib"
73 warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long"
74 saved_CFLAGS="$CFLAGS"
75 CFLAGS="$CFLAGS $warn_CFLAGS"
76 AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
77 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
78 [ AC_MSG_RESULT([yes]) ],
80 CFLAGS="$saved_CFLAGS"
84 AC_ARG_ENABLE(benchmark,
85 AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]),
86 [use_benchmark=$enableval],
90 AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
91 [use_tests=$enableval],
94 AC_ARG_ENABLE(endomorphism,
95 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
96 [use_endomorphism=$enableval],
97 [use_endomorphism=no])
99 AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
100 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
102 AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
103 [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
105 AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
106 [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
108 AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto]
109 [Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto])
111 AC_CHECK_TYPES([__int128])
113 AC_MSG_CHECKING([for __builtin_expect])
114 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
115 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
116 [ AC_MSG_RESULT([no])
119 if test x"$req_asm" = x"auto"; then
121 if test x"$has_64bit_asm" = x"yes"; then
124 if test x"$set_asm" = x; then
132 if test x"$has_64bit_asm" != x"yes"; then
133 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
139 AC_MSG_ERROR([invalid assembly optimization selection])
144 if test x"$req_field" = x"auto"; then
145 if test x"set_asm" = x"x86_64"; then
148 if test x"$set_field" = x; then
150 if test x"$has_int128" = x"yes"; then
154 if test x"$set_field" = x; then
161 if test x"$set_asm" != x"x86_64"; then
163 if test x"$has_int128" != x"yes"; then
164 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
171 AC_MSG_ERROR([invalid field implementation selection])
176 if test x"$req_scalar" = x"auto"; then
178 if test x"$has_int128" = x"yes"; then
181 if test x"$set_scalar" = x; then
185 set_scalar=$req_scalar
189 if test x"$has_int128" != x"yes"; then
190 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
196 AC_MSG_ERROR([invalid scalar implementation selected])
201 if test x"$req_bignum" = x"auto"; then
203 if test x"$has_gmp" = x"yes"; then
207 if test x"$set_bignum" = x; then
211 set_bignum=$req_bignum
215 if test x"$has_gmp" != x"yes"; then
216 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
222 AC_MSG_ERROR([invalid bignum implementation selection])
227 # select assembly optimization
230 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
235 AC_MSG_ERROR([invalid assembly optimizations])
239 # select field implementation
242 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
245 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
248 AC_MSG_ERROR([invalid field implementation])
252 # select bignum implementation
255 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
256 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
257 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
258 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
261 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
262 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
263 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
266 AC_MSG_ERROR([invalid bignum implementation])
270 #select scalar implementation
273 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
276 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
279 AC_MSG_ERROR([invalid scalar implementation])
283 if test x"$use_tests" = x"yes"; then
285 if test x"$has_openssl_ec" = x"yes"; then
286 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
287 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
288 SECP_TEST_LIBS="$CRYPTO_LIBS"
292 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
299 if test x"$set_bignum" = x"gmp"; then
300 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
301 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
304 if test x"$use_endomorphism" = x"yes"; then
305 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
310 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
311 AC_MSG_NOTICE([Using field implementation: $set_field])
312 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
313 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
314 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
316 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
317 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
318 AC_SUBST(SECP_INCLUDES)
320 AC_SUBST(SECP_TEST_LIBS)
321 AC_SUBST(SECP_TEST_INCLUDES)
322 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
323 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
325 dnl make sure nothing new is exported so that we don't break the cache
326 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
327 unset PKG_CONFIG_PATH
328 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"