]> Git Repo - secp256k1.git/blob - configure.ac
Merge pull request #149
[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])
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_C99
26 if test x"$ac_cv_prog_cc_c99" == x"no"; then
27   AC_MSG_ERROR([c99 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="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function"
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 yes)]),
86     [use_benchmark=$enableval],
87     [use_benchmark=yes])
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=gmp|64bit|64bit_asm|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|none|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_CHECK_TYPES([__int128])
109
110 AC_MSG_CHECKING([for __builtin_expect])
111 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
112     [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
113     [ AC_MSG_RESULT([no])
114     ])
115
116 if test x"$req_field" = x"auto"; then
117   SECP_64BIT_ASM_CHECK
118   if test x"$has_64bit_asm" = x"yes"; then
119     set_field=64bit_asm
120   fi
121
122   if test x"$set_field" = x; then
123     SECP_INT128_CHECK
124     if test x"$has_int128" = x"yes"; then
125       set_field=64bit
126     fi
127   fi
128
129   if test x"$set_field" = x; then
130     SECP_GMP_CHECK
131     if test x"$has_gmp" = x"yes"; then
132       set_field=gmp
133     fi
134   fi
135
136   if test x"$set_field" = x; then
137     set_field=32bit
138   fi
139 else
140   set_field=$req_field
141   case $set_field in
142   64bit_asm)
143     SECP_64BIT_ASM_CHECK
144     ;;
145   64bit)
146     SECP_INT128_CHECK
147     ;;
148   gmp)
149     SECP_GMP_CHECK
150     ;;
151   32bit)
152     ;;
153   *)
154     AC_MSG_ERROR([invalid field implementation selection])
155     ;;
156   esac
157 fi
158
159 if test x"$req_scalar" = x"auto"; then
160   if test x"$set_scalar" = x; then
161     SECP_INT128_CHECK
162     if test x"$has_int128" = x"yes"; then
163       set_scalar=64bit
164     fi
165   fi
166   if test x"$set_scalar" = x; then
167     set_scalar=32bit
168   fi
169 else
170   set_scalar=$req_scalar
171   case $set_scalar in
172   64bit)
173     SECP_INT128_CHECK
174     ;;
175   32bit)
176     ;;
177   *)
178     AC_MSG_ERROR([invalid scalar implementation selected])
179     ;;
180   esac
181 fi
182
183 if test x"$req_bignum" = x"auto"; then
184   SECP_GMP_CHECK
185   if test x"$has_gmp" = x"yes"; then
186     set_bignum=gmp
187   fi
188
189   if test x"$set_bignum" = x; then
190     set_bignum=none
191   fi
192 else
193   set_bignum=$req_bignum
194   case $set_bignum in
195   gmp)
196     SECP_GMP_CHECK
197     ;;
198   none)
199     ;;
200   *)
201     AC_MSG_ERROR([invalid bignum implementation selection])
202     ;;
203   esac
204 fi
205
206 # select field implementation
207 case $set_field in
208 64bit_asm)
209   AC_DEFINE(USE_FIELD_5X52_ASM, 1, [Define this symbol to use the assembly version for the 5x52 field implementation])
210   AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
211   ;;
212 64bit)
213   AC_DEFINE(USE_FIELD_5X52_INT128, 1, [Define this symbol to use the __int128 version for the 5x52 field implementation])
214   AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
215   ;;
216 gmp)
217   AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])
218   AC_DEFINE(USE_FIELD_GMP, 1, [Define this symbol to use the FIELD_GMP implementation])
219   ;;
220 32bit)
221   AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
222   ;;
223 *)
224   AC_MSG_ERROR([invalid field implementation])
225   ;;
226 esac
227
228 # select bignum implementation
229 case $set_bignum in
230 gmp)
231   AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
232   AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
233   AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
234   AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
235   ;;
236 none)
237   AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
238   AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
239   AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
240   ;;
241 *)
242   AC_MSG_ERROR([invalid bignum implementation])
243   ;;
244 esac
245
246 #select scalar implementation
247 case $set_scalar in
248 64bit)
249   AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
250   ;;
251 32bit)
252   AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
253   ;;
254 *)
255   AC_MSG_ERROR([invalid scalar implementation])
256   ;;
257 esac
258
259 if test x"$use_tests" = x"yes"; then
260   SECP_OPENSSL_CHECK
261   if test x"$has_openssl_ec" == x"yes"; then
262     AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
263     SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
264     SECP_TEST_LIBS="$CRYPTO_LIBS"
265
266     case $host in
267     *mingw*)
268       SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
269       ;;
270     esac
271
272   fi
273 fi
274
275 if test x"$set_field" = x"gmp" || test x"$set_bignum" = x"gmp"; then
276   SECP_LIBS="$SECP_LIBS $GMP_LIBS"
277   SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
278 fi
279
280 if test x"$use_endomorphism" = x"yes"; then
281   AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
282 fi
283
284 AC_MSG_NOTICE([Using field implementation: $set_field])
285 AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
286 AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
287
288 AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
289 AC_CONFIG_FILES([Makefile libsecp256k1.pc])
290 AC_SUBST(SECP_INCLUDES)
291 AC_SUBST(SECP_LIBS)
292 AC_SUBST(SECP_TEST_LIBS)
293 AC_SUBST(SECP_TEST_INCLUDES)
294 AM_CONDITIONAL([USE_ASM], [test x"$set_field" == x"64bit_asm"])
295 AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
296 AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" != x"no"])
297
298 dnl make sure nothing new is exported so that we don't break the cache
299 PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
300 unset PKG_CONFIG_PATH
301 PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
302
303 AC_OUTPUT
This page took 0.089231 seconds and 4 git commands to generate.