]> Git Repo - secp256k1.git/blob - configure.ac
Merge pull request #280
[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_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
118 [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
119
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])
122
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])
125
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])
128
129 AC_CHECK_TYPES([__int128])
130
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])
135     ])
136
137 if test x"$req_asm" = x"auto"; then
138   SECP_64BIT_ASM_CHECK
139   if test x"$has_64bit_asm" = x"yes"; then
140     set_asm=x86_64
141   fi
142   if test x"$set_asm" = x; then
143     set_asm=no
144   fi
145 else
146   set_asm=$req_asm
147   case $set_asm in
148   x86_64)
149     SECP_64BIT_ASM_CHECK
150     if test x"$has_64bit_asm" != x"yes"; then
151       AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
152     fi
153     ;;
154   no)
155     ;;
156   *)
157     AC_MSG_ERROR([invalid assembly optimization selection])
158     ;;
159   esac
160 fi
161
162 if test x"$req_field" = x"auto"; then
163   if test x"set_asm" = x"x86_64"; then
164     set_field=64bit
165   fi
166   if test x"$set_field" = x; then
167     SECP_INT128_CHECK
168     if test x"$has_int128" = x"yes"; then
169       set_field=64bit
170     fi
171   fi
172   if test x"$set_field" = x; then
173     set_field=32bit
174   fi
175 else
176   set_field=$req_field
177   case $set_field in
178   64bit)
179     if test x"$set_asm" != x"x86_64"; then
180       SECP_INT128_CHECK
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])
183       fi
184     fi
185     ;;
186   32bit)
187     ;;
188   *)
189     AC_MSG_ERROR([invalid field implementation selection])
190     ;;
191   esac
192 fi
193
194 if test x"$req_scalar" = x"auto"; then
195   SECP_INT128_CHECK
196   if test x"$has_int128" = x"yes"; then
197     set_scalar=64bit
198   fi
199   if test x"$set_scalar" = x; then
200     set_scalar=32bit
201   fi
202 else
203   set_scalar=$req_scalar
204   case $set_scalar in
205   64bit)
206     SECP_INT128_CHECK
207     if test x"$has_int128" != x"yes"; then
208       AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
209     fi
210     ;;
211   32bit)
212     ;;
213   *)
214     AC_MSG_ERROR([invalid scalar implementation selected])
215     ;;
216   esac
217 fi
218
219 if test x"$req_bignum" = x"auto"; then
220   SECP_GMP_CHECK
221   if test x"$has_gmp" = x"yes"; then
222     set_bignum=gmp
223   fi
224
225   if test x"$set_bignum" = x; then
226     set_bignum=no
227   fi
228 else
229   set_bignum=$req_bignum
230   case $set_bignum in
231   gmp)
232     SECP_GMP_CHECK
233     if test x"$has_gmp" != x"yes"; then
234       AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
235     fi
236     ;;
237   no)
238     ;;
239   *)
240     AC_MSG_ERROR([invalid bignum implementation selection])
241     ;;
242   esac
243 fi
244
245 # select assembly optimization
246 case $set_asm in
247 x86_64)
248   AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
249   ;;
250 no)
251   ;;
252 *)
253   AC_MSG_ERROR([invalid assembly optimizations])
254   ;;
255 esac
256
257 # select field implementation
258 case $set_field in
259 64bit)
260   AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
261   ;;
262 32bit)
263   AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
264   ;;
265 *)
266   AC_MSG_ERROR([invalid field implementation])
267   ;;
268 esac
269
270 # select bignum implementation
271 case $set_bignum in
272 gmp)
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])
277   ;;
278 no)
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])
282   ;;
283 *)
284   AC_MSG_ERROR([invalid bignum implementation])
285   ;;
286 esac
287
288 #select scalar implementation
289 case $set_scalar in
290 64bit)
291   AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
292   ;;
293 32bit)
294   AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
295   ;;
296 *)
297   AC_MSG_ERROR([invalid scalar implementation])
298   ;;
299 esac
300
301 if test x"$use_tests" = x"yes"; then
302   SECP_OPENSSL_CHECK
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"
307
308     case $host in
309     *mingw*)
310       SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
311       ;;
312     esac
313
314   fi
315 fi
316
317 if test x"$set_bignum" = x"gmp"; then
318   SECP_LIBS="$SECP_LIBS $GMP_LIBS"
319   SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
320 fi
321
322 if test x"$use_endomorphism" = x"yes"; then
323   AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
324 fi
325
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])
328 fi
329
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])
332 fi
333
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])
336 fi
337
338 AC_C_BIGENDIAN()
339
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])
346
347 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
348
349 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
350 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
351 AC_SUBST(SECP_INCLUDES)
352 AC_SUBST(SECP_LIBS)
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"])
360
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"
365
366 AC_OUTPUT
This page took 0.041779 seconds and 4 git commands to generate.