]> Git Repo - secp256k1.git/blob - configure.ac
Convert the rest of the codebase to C89.
[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
21 if test "x$CFLAGS" = "x"; then
22   CFLAGS="-O3 -g"
23 fi
24
25 AC_PROG_CC_C89
26 if test x"$ac_cv_prog_cc_c89" = x"no"; then
27   AC_MSG_ERROR([c89 compiler support required])
28 fi
29
30 case $host in
31   *mingw*)
32      use_pkgconfig=no
33      ;;
34    *)
35      use_pkgconfig=yes
36      ;;
37 esac
38
39 case $host_os in
40   *darwin*)
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.
47
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
53          fi
54          if test x$gmp_prefix != x; then
55            GMP_CPPFLAGS="-I$gmp_prefix/include"
56            GMP_LIBS="-L$gmp_prefix/lib"
57          fi
58        else
59          AC_PATH_PROG([PORT],port,)
60          dnl if homebrew isn't installed and macports is, add the macports default paths
61          dnl as a last resort.
62          if test x$PORT != x; then
63            CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
64            LDFLAGS="$LDFLAGS -L/opt/local/lib"
65          fi
66        fi
67      fi
68    ;;
69 esac
70
71 CFLAGS="$CFLAGS -W"
72
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]) ],
79     [ AC_MSG_RESULT([no])
80       CFLAGS="$saved_CFLAGS"
81     ])
82
83
84 AC_ARG_ENABLE(benchmark,
85     AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]),
86     [use_benchmark=$enableval],
87     [use_benchmark=no])
88
89 AC_ARG_ENABLE(tests,
90     AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
91     [use_tests=$enableval],
92     [use_tests=yes])
93
94 AC_ARG_ENABLE(endomorphism,
95     AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
96     [use_endomorphism=$enableval],
97     [use_endomorphism=no])
98
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])
101
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])
104
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])
107
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])
110
111 AC_CHECK_TYPES([__int128])
112
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])
117     ])
118
119 if test x"$req_asm" = x"auto"; then
120   SECP_64BIT_ASM_CHECK
121   if test x"$has_64bit_asm" = x"yes"; then
122     set_asm=x86_64
123   fi
124   if test x"$set_asm" = x; then
125     set_asm=no
126   fi
127 else
128   set_asm=$req_asm
129   case $set_asm in
130   x86_64)
131     SECP_64BIT_ASM_CHECK
132     if test x"$has_64bit_asm" != x"yes"; then
133       AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
134     fi
135     ;;
136   no)
137     ;;
138   *)
139     AC_MSG_ERROR([invalid assembly optimization selection])
140     ;;
141   esac
142 fi
143
144 if test x"$req_field" = x"auto"; then
145   if test x"set_asm" = x"x86_64"; then
146     set_field=64bit
147   fi
148   if test x"$set_field" = x; then
149     SECP_INT128_CHECK
150     if test x"$has_int128" = x"yes"; then
151       set_field=64bit
152     fi
153   fi
154   if test x"$set_field" = x; then
155     set_field=32bit
156   fi
157 else
158   set_field=$req_field
159   case $set_field in
160   64bit)
161     if test x"$set_asm" != x"x86_64"; then
162       SECP_INT128_CHECK
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])
165       fi
166     fi
167     ;;
168   32bit)
169     ;;
170   *)
171     AC_MSG_ERROR([invalid field implementation selection])
172     ;;
173   esac
174 fi
175
176 if test x"$req_scalar" = x"auto"; then
177   SECP_INT128_CHECK
178   if test x"$has_int128" = x"yes"; then
179     set_scalar=64bit
180   fi
181   if test x"$set_scalar" = x; then
182     set_scalar=32bit
183   fi
184 else
185   set_scalar=$req_scalar
186   case $set_scalar in
187   64bit)
188     SECP_INT128_CHECK
189     if test x"$has_int128" != x"yes"; then
190       AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
191     fi
192     ;;
193   32bit)
194     ;;
195   *)
196     AC_MSG_ERROR([invalid scalar implementation selected])
197     ;;
198   esac
199 fi
200
201 if test x"$req_bignum" = x"auto"; then
202   SECP_GMP_CHECK
203   if test x"$has_gmp" = x"yes"; then
204     set_bignum=gmp
205   fi
206
207   if test x"$set_bignum" = x; then
208     set_bignum=no
209   fi
210 else
211   set_bignum=$req_bignum
212   case $set_bignum in
213   gmp)
214     SECP_GMP_CHECK
215     if test x"$has_gmp" != x"yes"; then
216       AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
217     fi
218     ;;
219   no)
220     ;;
221   *)
222     AC_MSG_ERROR([invalid bignum implementation selection])
223     ;;
224   esac
225 fi
226
227 # select assembly optimization
228 case $set_asm in
229 x86_64)
230   AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
231   ;;
232 no)
233   ;;
234 *)
235   AC_MSG_ERROR([invalid assembly optimizations])
236   ;;
237 esac
238
239 # select field implementation
240 case $set_field in
241 64bit)
242   AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
243   ;;
244 32bit)
245   AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
246   ;;
247 *)
248   AC_MSG_ERROR([invalid field implementation])
249   ;;
250 esac
251
252 # select bignum implementation
253 case $set_bignum in
254 gmp)
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])
259   ;;
260 no)
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])
264   ;;
265 *)
266   AC_MSG_ERROR([invalid bignum implementation])
267   ;;
268 esac
269
270 #select scalar implementation
271 case $set_scalar in
272 64bit)
273   AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
274   ;;
275 32bit)
276   AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
277   ;;
278 *)
279   AC_MSG_ERROR([invalid scalar implementation])
280   ;;
281 esac
282
283 if test x"$use_tests" = x"yes"; then
284   SECP_OPENSSL_CHECK
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"
289
290     case $host in
291     *mingw*)
292       SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
293       ;;
294     esac
295
296   fi
297 fi
298
299 if test x"$set_bignum" = x"gmp"; then
300   SECP_LIBS="$SECP_LIBS $GMP_LIBS"
301   SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
302 fi
303
304 if test x"$use_endomorphism" = x"yes"; then
305   AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
306 fi
307
308 AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
309 AC_MSG_NOTICE([Using field implementation: $set_field])
310 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
311 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
312 AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
313
314 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
315 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
316 AC_SUBST(SECP_INCLUDES)
317 AC_SUBST(SECP_LIBS)
318 AC_SUBST(SECP_TEST_LIBS)
319 AC_SUBST(SECP_TEST_INCLUDES)
320 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
321 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
322
323 dnl make sure nothing new is exported so that we don't break the cache
324 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
325 unset PKG_CONFIG_PATH
326 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
327
328 AC_OUTPUT
This page took 0.042793 seconds and 4 git commands to generate.