]> Git Repo - secp256k1.git/blob - configure.ac
Move pubkey recovery code to separate module
[secp256k1.git] / configure.ac
1 AC_PREREQ([2.60])
2 AC_INIT([libsecp256k1],[0.1])
3 AC_CONFIG_AUX_DIR([build-aux])
4 AC_CONFIG_MACRO_DIR([build-aux/m4])
5 AC_CANONICAL_HOST
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])
10 LT_INIT
11
12 dnl make the compilation flags quiet unless V=1 is used
13 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
14
15 PKG_PROG_PKG_CONFIG
16
17 AC_PATH_TOOL(AR, ar)
18 AC_PATH_TOOL(RANLIB, ranlib)
19 AC_PATH_TOOL(STRIP, strip)
20 AX_PROG_CC_FOR_BUILD
21
22 if test "x$CFLAGS" = "x"; then
23   CFLAGS="-O3 -g"
24 fi
25
26 AM_PROG_CC_C_O
27
28 AC_PROG_CC_C89
29 if test x"$ac_cv_prog_cc_c89" = x"no"; then
30   AC_MSG_ERROR([c89 compiler support required])
31 fi
32
33 case $host in
34   *mingw*)
35      use_pkgconfig=no
36      ;;
37    *)
38      use_pkgconfig=yes
39      ;;
40 esac
41
42 case $host_os in
43   *darwin*)
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.
50
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
56          fi
57          if test x$gmp_prefix != x; then
58            GMP_CPPFLAGS="-I$gmp_prefix/include"
59            GMP_LIBS="-L$gmp_prefix/lib"
60          fi
61        else
62          AC_PATH_PROG([PORT],port,)
63          dnl if homebrew isn't installed and macports is, add the macports default paths
64          dnl as a last resort.
65          if test x$PORT != x; then
66            CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
67            LDFLAGS="$LDFLAGS -L/opt/local/lib"
68          fi
69        fi
70      fi
71    ;;
72 esac
73
74 CFLAGS="$CFLAGS -W"
75
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]) ],
82     [ AC_MSG_RESULT([no])
83       CFLAGS="$saved_CFLAGS"
84     ])
85
86
87 AC_ARG_ENABLE(benchmark,
88     AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]),
89     [use_benchmark=$enableval],
90     [use_benchmark=no])
91
92 AC_ARG_ENABLE(tests,
93     AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
94     [use_tests=$enableval],
95     [use_tests=yes])
96
97 AC_ARG_ENABLE(endomorphism,
98     AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
99     [use_endomorphism=$enableval],
100     [use_endomorphism=no])
101     
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])
106
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])
111
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])
116
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])
121
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])
124
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])
127
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])
130
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])
133
134 AC_CHECK_TYPES([__int128])
135
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])
140     ])
141
142 if test x"$req_asm" = x"auto"; then
143   SECP_64BIT_ASM_CHECK
144   if test x"$has_64bit_asm" = x"yes"; then
145     set_asm=x86_64
146   fi
147   if test x"$set_asm" = x; then
148     set_asm=no
149   fi
150 else
151   set_asm=$req_asm
152   case $set_asm in
153   x86_64)
154     SECP_64BIT_ASM_CHECK
155     if test x"$has_64bit_asm" != x"yes"; then
156       AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
157     fi
158     ;;
159   no)
160     ;;
161   *)
162     AC_MSG_ERROR([invalid assembly optimization selection])
163     ;;
164   esac
165 fi
166
167 if test x"$req_field" = x"auto"; then
168   if test x"set_asm" = x"x86_64"; then
169     set_field=64bit
170   fi
171   if test x"$set_field" = x; then
172     SECP_INT128_CHECK
173     if test x"$has_int128" = x"yes"; then
174       set_field=64bit
175     fi
176   fi
177   if test x"$set_field" = x; then
178     set_field=32bit
179   fi
180 else
181   set_field=$req_field
182   case $set_field in
183   64bit)
184     if test x"$set_asm" != x"x86_64"; then
185       SECP_INT128_CHECK
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])
188       fi
189     fi
190     ;;
191   32bit)
192     ;;
193   *)
194     AC_MSG_ERROR([invalid field implementation selection])
195     ;;
196   esac
197 fi
198
199 if test x"$req_scalar" = x"auto"; then
200   SECP_INT128_CHECK
201   if test x"$has_int128" = x"yes"; then
202     set_scalar=64bit
203   fi
204   if test x"$set_scalar" = x; then
205     set_scalar=32bit
206   fi
207 else
208   set_scalar=$req_scalar
209   case $set_scalar in
210   64bit)
211     SECP_INT128_CHECK
212     if test x"$has_int128" != x"yes"; then
213       AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
214     fi
215     ;;
216   32bit)
217     ;;
218   *)
219     AC_MSG_ERROR([invalid scalar implementation selected])
220     ;;
221   esac
222 fi
223
224 if test x"$req_bignum" = x"auto"; then
225   SECP_GMP_CHECK
226   if test x"$has_gmp" = x"yes"; then
227     set_bignum=gmp
228   fi
229
230   if test x"$set_bignum" = x; then
231     set_bignum=no
232   fi
233 else
234   set_bignum=$req_bignum
235   case $set_bignum in
236   gmp)
237     SECP_GMP_CHECK
238     if test x"$has_gmp" != x"yes"; then
239       AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
240     fi
241     ;;
242   no)
243     ;;
244   *)
245     AC_MSG_ERROR([invalid bignum implementation selection])
246     ;;
247   esac
248 fi
249
250 # select assembly optimization
251 case $set_asm in
252 x86_64)
253   AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
254   ;;
255 no)
256   ;;
257 *)
258   AC_MSG_ERROR([invalid assembly optimizations])
259   ;;
260 esac
261
262 # select field implementation
263 case $set_field in
264 64bit)
265   AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
266   ;;
267 32bit)
268   AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
269   ;;
270 *)
271   AC_MSG_ERROR([invalid field implementation])
272   ;;
273 esac
274
275 # select bignum implementation
276 case $set_bignum in
277 gmp)
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])
282   ;;
283 no)
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])
287   ;;
288 *)
289   AC_MSG_ERROR([invalid bignum implementation])
290   ;;
291 esac
292
293 #select scalar implementation
294 case $set_scalar in
295 64bit)
296   AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
297   ;;
298 32bit)
299   AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
300   ;;
301 *)
302   AC_MSG_ERROR([invalid scalar implementation])
303   ;;
304 esac
305
306 if test x"$use_tests" = x"yes"; then
307   SECP_OPENSSL_CHECK
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"
312
313     case $host in
314     *mingw*)
315       SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
316       ;;
317     esac
318
319   fi
320 fi
321
322 if test x"$set_bignum" = x"gmp"; then
323   SECP_LIBS="$SECP_LIBS $GMP_LIBS"
324   SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
325 fi
326
327 if test x"$use_endomorphism" = x"yes"; then
328   AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
329 fi
330
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])
333 fi
334
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])
337 fi
338
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])
341 fi
342
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])
345 fi
346
347 AC_C_BIGENDIAN()
348
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])
355
356 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
357 AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
358
359 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
360 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
361 AC_SUBST(SECP_INCLUDES)
362 AC_SUBST(SECP_LIBS)
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"])
371
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"
376
377 AC_OUTPUT
This page took 0.050925 seconds and 4 git commands to generate.