]>
Commit | Line | Data |
---|---|---|
78cd96b1 CF |
1 | AC_PREREQ([2.60]) |
2 | AC_INIT([libsecp256k1],[0.1]) | |
6fac238f | 3 | AC_CONFIG_AUX_DIR([build-aux]) |
4 | AC_CONFIG_MACRO_DIR([build-aux/m4]) | |
78cd96b1 CF |
5 | AC_CANONICAL_HOST |
6 | AH_TOP([#ifndef LIBSECP256K1_CONFIG_H]) | |
7 | AH_TOP([#define LIBSECP256K1_CONFIG_H]) | |
f735446c | 8 | AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/]) |
5190079e | 9 | AM_INIT_AUTOMAKE([foreign subdir-objects]) |
78cd96b1 CF |
10 | LT_INIT |
11 | ||
53628757 CF |
12 | dnl make the compilation flags quiet unless V=1 is used |
13 | m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | |
14 | ||
78cd96b1 CF |
15 | PKG_PROG_PKG_CONFIG |
16 | ||
3ab1178d CF |
17 | AC_PATH_TOOL(AR, ar) |
18 | AC_PATH_TOOL(RANLIB, ranlib) | |
19 | AC_PATH_TOOL(STRIP, strip) | |
20 | ||
056ad310 | 21 | if test "x$CFLAGS" = "x"; then |
c88e2b8c PW |
22 | CFLAGS="-O3 -g" |
23 | fi | |
24 | ||
f735446c GM |
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]) | |
78cd96b1 CF |
28 | fi |
29 | ||
30 | case $host in | |
31 | *mingw*) | |
32 | use_pkgconfig=no | |
33 | ;; | |
34 | *) | |
35 | use_pkgconfig=yes | |
36 | ;; | |
37 | esac | |
38 | ||
a86f241d | 39 | case $host_os in |
e2274c58 CF |
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 | ;; | |
a86f241d PD |
69 | esac |
70 | ||
a099073a GM |
71 | CFLAGS="$CFLAGS -W" |
72 | ||
f735446c | 73 | warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long" |
a099073a GM |
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 | ||
78cd96b1 | 84 | AC_ARG_ENABLE(benchmark, |
8336040f | 85 | AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]), |
78cd96b1 | 86 | [use_benchmark=$enableval], |
8336040f | 87 | [use_benchmark=no]) |
78cd96b1 CF |
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, | |
0e9baf6f | 95 | AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), |
78cd96b1 | 96 | [use_endomorphism=$enableval], |
0e9baf6f | 97 | [use_endomorphism=no]) |
78cd96b1 | 98 | |
7277fd76 | 99 | AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto], |
0e9baf6f | 100 | [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) |
78cd96b1 | 101 | |
1ba4a60a | 102 | AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], |
78cd96b1 CF |
103 | [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto]) |
104 | ||
1d52a8b1 PW |
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 | ||
1ba4a60a PW |
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 | ||
78cd96b1 CF |
111 | AC_CHECK_TYPES([__int128]) |
112 | ||
1f46b006 CF |
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 | ]) | |
1c7fa133 | 118 | |
1ba4a60a | 119 | if test x"$req_asm" = x"auto"; then |
0e9baf6f CF |
120 | SECP_64BIT_ASM_CHECK |
121 | if test x"$has_64bit_asm" = x"yes"; then | |
1ba4a60a PW |
122 | set_asm=x86_64 |
123 | fi | |
124 | if test x"$set_asm" = x; then | |
125 | set_asm=no | |
78cd96b1 | 126 | fi |
1ba4a60a PW |
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 | |
78cd96b1 | 143 | |
1ba4a60a PW |
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 | |
78cd96b1 CF |
148 | if test x"$set_field" = x; then |
149 | SECP_INT128_CHECK | |
150 | if test x"$has_int128" = x"yes"; then | |
0e9baf6f | 151 | set_field=64bit |
78cd96b1 CF |
152 | fi |
153 | fi | |
78cd96b1 | 154 | if test x"$set_field" = x; then |
0e9baf6f | 155 | set_field=32bit |
78cd96b1 CF |
156 | fi |
157 | else | |
158 | set_field=$req_field | |
159 | case $set_field in | |
0e9baf6f | 160 | 64bit) |
1ba4a60a PW |
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 | |
78cd96b1 | 167 | ;; |
0e9baf6f | 168 | 32bit) |
78cd96b1 CF |
169 | ;; |
170 | *) | |
171 | AC_MSG_ERROR([invalid field implementation selection]) | |
172 | ;; | |
173 | esac | |
174 | fi | |
175 | ||
1d52a8b1 | 176 | if test x"$req_scalar" = x"auto"; then |
1ba4a60a PW |
177 | SECP_INT128_CHECK |
178 | if test x"$has_int128" = x"yes"; then | |
179 | set_scalar=64bit | |
1d52a8b1 PW |
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 | |
1ba4a60a PW |
189 | if test x"$has_int128" != x"yes"; then |
190 | AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available]) | |
191 | fi | |
1d52a8b1 PW |
192 | ;; |
193 | 32bit) | |
194 | ;; | |
195 | *) | |
196 | AC_MSG_ERROR([invalid scalar implementation selected]) | |
197 | ;; | |
198 | esac | |
199 | fi | |
200 | ||
78cd96b1 CF |
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 | ||
78cd96b1 | 207 | if test x"$set_bignum" = x; then |
1ba4a60a | 208 | set_bignum=no |
78cd96b1 CF |
209 | fi |
210 | else | |
211 | set_bignum=$req_bignum | |
212 | case $set_bignum in | |
213 | gmp) | |
214 | SECP_GMP_CHECK | |
1ba4a60a PW |
215 | if test x"$has_gmp" != x"yes"; then |
216 | AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available]) | |
217 | fi | |
78cd96b1 | 218 | ;; |
1ba4a60a | 219 | no) |
78cd96b1 CF |
220 | ;; |
221 | *) | |
222 | AC_MSG_ERROR([invalid bignum implementation selection]) | |
223 | ;; | |
224 | esac | |
225 | fi | |
226 | ||
1ba4a60a PW |
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 | ||
78cd96b1 CF |
239 | # select field implementation |
240 | case $set_field in | |
0e9baf6f | 241 | 64bit) |
78cd96b1 CF |
242 | AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation]) |
243 | ;; | |
0e9baf6f | 244 | 32bit) |
78cd96b1 CF |
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) | |
597128d3 PW |
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]) | |
d1502eb4 PW |
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]) | |
78cd96b1 | 259 | ;; |
1ba4a60a | 260 | no) |
597128d3 PW |
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 | ;; | |
78cd96b1 CF |
265 | *) |
266 | AC_MSG_ERROR([invalid bignum implementation]) | |
267 | ;; | |
268 | esac | |
269 | ||
1d52a8b1 PW |
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 | ||
78cd96b1 CF |
283 | if test x"$use_tests" = x"yes"; then |
284 | SECP_OPENSSL_CHECK | |
28ade27d | 285 | if test x"$has_openssl_ec" = x"yes"; then |
78cd96b1 CF |
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 | ||
7277fd76 | 299 | if test x"$set_bignum" = x"gmp"; then |
78cd96b1 | 300 | SECP_LIBS="$SECP_LIBS $GMP_LIBS" |
e2274c58 | 301 | SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS" |
78cd96b1 CF |
302 | fi |
303 | ||
304 | if test x"$use_endomorphism" = x"yes"; then | |
c35ff1ea | 305 | AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization]) |
78cd96b1 CF |
306 | fi |
307 | ||
1ba4a60a | 308 | AC_MSG_NOTICE([Using assembly optimizations: $set_asm]) |
78cd96b1 CF |
309 | AC_MSG_NOTICE([Using field implementation: $set_field]) |
310 | AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) | |
1d52a8b1 | 311 | AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) |
1ba4a60a | 312 | AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism]) |
78cd96b1 CF |
313 | |
314 | AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) | |
c7ee71f7 | 315 | AC_CONFIG_FILES([Makefile libsecp256k1.pc]) |
78cd96b1 CF |
316 | AC_SUBST(SECP_INCLUDES) |
317 | AC_SUBST(SECP_LIBS) | |
318 | AC_SUBST(SECP_TEST_LIBS) | |
319 | AC_SUBST(SECP_TEST_INCLUDES) | |
78cd96b1 | 320 | AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) |
8336040f | 321 | AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"]) |
e2274c58 CF |
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 | ||
78cd96b1 | 328 | AC_OUTPUT |