]> Git Repo - secp256k1.git/blame - configure.ac
Merge #411: Remove guarantees about memcmp-ability
[secp256k1.git] / configure.ac
CommitLineData
78cd96b1
CF
1AC_PREREQ([2.60])
2AC_INIT([libsecp256k1],[0.1])
6fac238f 3AC_CONFIG_AUX_DIR([build-aux])
4AC_CONFIG_MACRO_DIR([build-aux/m4])
78cd96b1
CF
5AC_CANONICAL_HOST
6AH_TOP([#ifndef LIBSECP256K1_CONFIG_H])
7AH_TOP([#define LIBSECP256K1_CONFIG_H])
f735446c 8AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/])
5190079e 9AM_INIT_AUTOMAKE([foreign subdir-objects])
78cd96b1
CF
10LT_INIT
11
53628757
CF
12dnl make the compilation flags quiet unless V=1 is used
13m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
14
78cd96b1
CF
15PKG_PROG_PKG_CONFIG
16
3ab1178d
CF
17AC_PATH_TOOL(AR, ar)
18AC_PATH_TOOL(RANLIB, ranlib)
19AC_PATH_TOOL(STRIP, strip)
fbecc38a 20AX_PROG_CC_FOR_BUILD
3ab1178d 21
056ad310 22if test "x$CFLAGS" = "x"; then
c88e2b8c
PW
23 CFLAGS="-O3 -g"
24fi
25
ed5334a7 26AM_PROG_CC_C_O
27
f735446c
GM
28AC_PROG_CC_C89
29if test x"$ac_cv_prog_cc_c89" = x"no"; then
30 AC_MSG_ERROR([c89 compiler support required])
78cd96b1 31fi
001f1763 32AM_PROG_AS
78cd96b1 33
a86f241d 34case $host_os in
e2274c58
CF
35 *darwin*)
36 if test x$cross_compiling != xyes; then
37 AC_PATH_PROG([BREW],brew,)
38 if test x$BREW != x; then
39 dnl These Homebrew packages may be keg-only, meaning that they won't be found
40 dnl in expected paths because they may conflict with system files. Ask
41 dnl Homebrew where each one is located, then adjust paths accordingly.
42
43 openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
44 gmp_prefix=`$BREW --prefix gmp 2>/dev/null`
45 if test x$openssl_prefix != x; then
46 PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
47 export PKG_CONFIG_PATH
48 fi
49 if test x$gmp_prefix != x; then
50 GMP_CPPFLAGS="-I$gmp_prefix/include"
51 GMP_LIBS="-L$gmp_prefix/lib"
52 fi
53 else
54 AC_PATH_PROG([PORT],port,)
55 dnl if homebrew isn't installed and macports is, add the macports default paths
56 dnl as a last resort.
57 if test x$PORT != x; then
58 CPPFLAGS="$CPPFLAGS -isystem /opt/local/include"
59 LDFLAGS="$LDFLAGS -L/opt/local/lib"
60 fi
61 fi
62 fi
63 ;;
a86f241d
PD
64esac
65
a099073a
GM
66CFLAGS="$CFLAGS -W"
67
7c3771dd 68warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings"
a099073a
GM
69saved_CFLAGS="$CFLAGS"
70CFLAGS="$CFLAGS $warn_CFLAGS"
71AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
72AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
73 [ AC_MSG_RESULT([yes]) ],
74 [ AC_MSG_RESULT([no])
75 CFLAGS="$saved_CFLAGS"
76 ])
77
118cd821
GM
78saved_CFLAGS="$CFLAGS"
79CFLAGS="$CFLAGS -fvisibility=hidden"
80AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
81AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
82 [ AC_MSG_RESULT([yes]) ],
83 [ AC_MSG_RESULT([no])
84 CFLAGS="$saved_CFLAGS"
85 ])
a099073a 86
78cd96b1 87AC_ARG_ENABLE(benchmark,
8336040f 88 AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]),
78cd96b1 89 [use_benchmark=$enableval],
8336040f 90 [use_benchmark=no])
78cd96b1
CF
91
92AC_ARG_ENABLE(tests,
93 AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),
94 [use_tests=$enableval],
95 [use_tests=yes])
96
a9b2a5d8
AP
97AC_ARG_ENABLE(openssl_tests,
98 AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]),
99 [enable_openssl_tests=$enableval],
100 [enable_openssl_tests=auto])
101
83221ecb
PW
102AC_ARG_ENABLE(experimental,
103 AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]),
104 [use_experimental=$enableval],
105 [use_experimental=no])
106
78cd96b1 107AC_ARG_ENABLE(endomorphism,
0e9baf6f 108 AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),
78cd96b1 109 [use_endomorphism=$enableval],
0e9baf6f 110 [use_endomorphism=no])
83221ecb 111
fbecc38a 112AC_ARG_ENABLE(ecmult_static_precomputation,
a83bb480 113 AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]),
fbecc38a 114 [use_ecmult_static_precomputation=$enableval],
aa0b1fd1 115 [use_ecmult_static_precomputation=auto])
78cd96b1 116
0739bbb6 117AC_ARG_ENABLE(module_ecdh,
83221ecb 118 AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),
0739bbb6
AP
119 [enable_module_ecdh=$enableval],
120 [enable_module_ecdh=no])
121
a5a66c70 122AC_ARG_ENABLE(module_schnorr,
83221ecb 123 AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (experimental)]),
a5a66c70
PW
124 [enable_module_schnorr=$enableval],
125 [enable_module_schnorr=no])
126
9f443be0
PW
127AC_ARG_ENABLE(module_recovery,
128 AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]),
129 [enable_module_recovery=$enableval],
130 [enable_module_recovery=no])
131
3093576a
G
132AC_ARG_ENABLE(jni,
133 AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]),
134 [use_jni=$enableval],
135 [use_jni=auto])
136
7277fd76 137AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
0e9baf6f 138[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
78cd96b1 139
1ba4a60a 140AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
78cd96b1
CF
141[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
142
1d52a8b1
PW
143AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
144[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
145
001f1763
WL
146AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto]
147[Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto])
1ba4a60a 148
78cd96b1
CF
149AC_CHECK_TYPES([__int128])
150
1f46b006
CF
151AC_MSG_CHECKING([for __builtin_expect])
152AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
153 [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],
154 [ AC_MSG_RESULT([no])
155 ])
1c7fa133 156
aa0b1fd1
CF
157if test x"$use_ecmult_static_precomputation" != x"no"; then
158 save_cross_compiling=$cross_compiling
159 cross_compiling=no
160 TEMP_CC="$CC"
161 CC="$CC_FOR_BUILD"
162 AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}])
163 AC_RUN_IFELSE(
164 [AC_LANG_PROGRAM([], [return 0])],
165 [working_native_cc=yes],
166 [working_native_cc=no],[dnl])
167 CC="$TEMP_CC"
168 cross_compiling=$save_cross_compiling
169
170 if test x"$working_native_cc" = x"no"; then
171 set_precomp=no
172 if test x"$use_ecmult_static_precomputation" = x"yes"; then
173 AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
174 else
175 AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])
176 fi
177 else
178 AC_MSG_RESULT([ok])
179 set_precomp=yes
180 fi
181else
182 set_precomp=no
183fi
184
1ba4a60a 185if test x"$req_asm" = x"auto"; then
0e9baf6f
CF
186 SECP_64BIT_ASM_CHECK
187 if test x"$has_64bit_asm" = x"yes"; then
1ba4a60a
PW
188 set_asm=x86_64
189 fi
190 if test x"$set_asm" = x; then
191 set_asm=no
78cd96b1 192 fi
1ba4a60a
PW
193else
194 set_asm=$req_asm
195 case $set_asm in
196 x86_64)
197 SECP_64BIT_ASM_CHECK
198 if test x"$has_64bit_asm" != x"yes"; then
199 AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
200 fi
201 ;;
001f1763
WL
202 arm)
203 ;;
1ba4a60a
PW
204 no)
205 ;;
206 *)
207 AC_MSG_ERROR([invalid assembly optimization selection])
208 ;;
209 esac
210fi
78cd96b1 211
1ba4a60a
PW
212if test x"$req_field" = x"auto"; then
213 if test x"set_asm" = x"x86_64"; then
214 set_field=64bit
215 fi
78cd96b1
CF
216 if test x"$set_field" = x; then
217 SECP_INT128_CHECK
218 if test x"$has_int128" = x"yes"; then
0e9baf6f 219 set_field=64bit
78cd96b1
CF
220 fi
221 fi
78cd96b1 222 if test x"$set_field" = x; then
0e9baf6f 223 set_field=32bit
78cd96b1
CF
224 fi
225else
226 set_field=$req_field
227 case $set_field in
0e9baf6f 228 64bit)
1ba4a60a
PW
229 if test x"$set_asm" != x"x86_64"; then
230 SECP_INT128_CHECK
231 if test x"$has_int128" != x"yes"; then
232 AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
233 fi
234 fi
78cd96b1 235 ;;
0e9baf6f 236 32bit)
78cd96b1
CF
237 ;;
238 *)
239 AC_MSG_ERROR([invalid field implementation selection])
240 ;;
241 esac
242fi
243
1d52a8b1 244if test x"$req_scalar" = x"auto"; then
1ba4a60a
PW
245 SECP_INT128_CHECK
246 if test x"$has_int128" = x"yes"; then
247 set_scalar=64bit
1d52a8b1
PW
248 fi
249 if test x"$set_scalar" = x; then
250 set_scalar=32bit
251 fi
252else
253 set_scalar=$req_scalar
254 case $set_scalar in
255 64bit)
256 SECP_INT128_CHECK
1ba4a60a
PW
257 if test x"$has_int128" != x"yes"; then
258 AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
259 fi
1d52a8b1
PW
260 ;;
261 32bit)
262 ;;
263 *)
264 AC_MSG_ERROR([invalid scalar implementation selected])
265 ;;
266 esac
267fi
268
78cd96b1
CF
269if test x"$req_bignum" = x"auto"; then
270 SECP_GMP_CHECK
271 if test x"$has_gmp" = x"yes"; then
272 set_bignum=gmp
273 fi
274
78cd96b1 275 if test x"$set_bignum" = x; then
1ba4a60a 276 set_bignum=no
78cd96b1
CF
277 fi
278else
279 set_bignum=$req_bignum
280 case $set_bignum in
281 gmp)
282 SECP_GMP_CHECK
1ba4a60a
PW
283 if test x"$has_gmp" != x"yes"; then
284 AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
285 fi
78cd96b1 286 ;;
1ba4a60a 287 no)
78cd96b1
CF
288 ;;
289 *)
290 AC_MSG_ERROR([invalid bignum implementation selection])
291 ;;
292 esac
293fi
294
1ba4a60a 295# select assembly optimization
001f1763
WL
296use_external_asm=no
297
1ba4a60a
PW
298case $set_asm in
299x86_64)
300 AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
301 ;;
001f1763
WL
302arm)
303 use_external_asm=yes
304 ;;
1ba4a60a
PW
305no)
306 ;;
307*)
308 AC_MSG_ERROR([invalid assembly optimizations])
309 ;;
310esac
311
78cd96b1
CF
312# select field implementation
313case $set_field in
0e9baf6f 31464bit)
78cd96b1
CF
315 AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
316 ;;
0e9baf6f 31732bit)
78cd96b1
CF
318 AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
319 ;;
320*)
321 AC_MSG_ERROR([invalid field implementation])
322 ;;
323esac
324
325# select bignum implementation
326case $set_bignum in
327gmp)
597128d3
PW
328 AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])
329 AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])
d1502eb4
PW
330 AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
331 AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
78cd96b1 332 ;;
1ba4a60a 333no)
597128d3
PW
334 AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
335 AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
336 AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
337 ;;
78cd96b1
CF
338*)
339 AC_MSG_ERROR([invalid bignum implementation])
340 ;;
341esac
342
1d52a8b1
PW
343#select scalar implementation
344case $set_scalar in
34564bit)
346 AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])
347 ;;
34832bit)
349 AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])
350 ;;
351*)
352 AC_MSG_ERROR([invalid scalar implementation])
353 ;;
354esac
355
78cd96b1
CF
356if test x"$use_tests" = x"yes"; then
357 SECP_OPENSSL_CHECK
28ade27d 358 if test x"$has_openssl_ec" = x"yes"; then
a9b2a5d8
AP
359 if test x"$enable_openssl_tests" != x"no"; then
360 AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
361 SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
362 SECP_TEST_LIBS="$CRYPTO_LIBS"
363
364 case $host in
365 *mingw*)
366 SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32"
367 ;;
368 esac
369 fi
370 else
371 if test x"$enable_openssl_tests" = x"yes"; then
372 AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])
373 fi
374 fi
375else
376 if test x"$enable_openssl_tests" = x"yes"; then
377 AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])
78cd96b1
CF
378 fi
379fi
380
3093576a
G
381if test x"$use_jni" != x"no"; then
382 AX_JNI_INCLUDE_DIR
eee808d8
PW
383 have_jni_dependencies=yes
384 if test x"$enable_module_schnorr" = x"no"; then
385 have_jni_dependencies=no
386 fi
387 if test x"$enable_module_ecdh" = x"no"; then
388 have_jni_dependencies=no
389 fi
3093576a 390 if test "x$JNI_INCLUDE_DIRS" = "x"; then
eee808d8
PW
391 have_jni_dependencies=no
392 fi
393 if test "x$have_jni_dependencies" = "xno"; then
3093576a 394 if test x"$use_jni" = x"yes"; then
eee808d8 395 AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and Schnorr and try again.])
3093576a 396 fi
eee808d8 397 AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])
3093576a
G
398 use_jni=no
399 else
400 use_jni=yes
401 for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do
402 JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR"
403 done
404 fi
405fi
406
7277fd76 407if test x"$set_bignum" = x"gmp"; then
78cd96b1 408 SECP_LIBS="$SECP_LIBS $GMP_LIBS"
e2274c58 409 SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
78cd96b1
CF
410fi
411
412if test x"$use_endomorphism" = x"yes"; then
c35ff1ea 413 AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
78cd96b1
CF
414fi
415
00c5d2e1 416if test x"$set_precomp" = x"yes"; then
fbecc38a
TD
417 AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])
418fi
419
0739bbb6
AP
420if test x"$enable_module_ecdh" = x"yes"; then
421 AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])
422fi
423
a5a66c70
PW
424if test x"$enable_module_schnorr" = x"yes"; then
425 AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module])
426fi
427
9f443be0
PW
428if test x"$enable_module_recovery" = x"yes"; then
429 AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])
430fi
431
ae55e850
PW
432AC_C_BIGENDIAN()
433
001f1763
WL
434if test x"$use_external_asm" = x"yes"; then
435 AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
436fi
437
aa0b1fd1 438AC_MSG_NOTICE([Using static precomputation: $set_precomp])
1ba4a60a 439AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
78cd96b1
CF
440AC_MSG_NOTICE([Using field implementation: $set_field])
441AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
1d52a8b1 442AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
1ba4a60a 443AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
3093576a
G
444AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
445AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
9f443be0 446AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
3093576a 447AC_MSG_NOTICE([Using jni: $use_jni])
a5a66c70 448
83221ecb
PW
449if test x"$enable_experimental" = x"yes"; then
450 AC_MSG_NOTICE([******])
451 AC_MSG_NOTICE([WARNING: experimental build])
452 AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])
453 AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
454 AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr])
455 AC_MSG_NOTICE([******])
456else
457 if test x"$enable_module_schnorr" = x"yes"; then
458 AC_MSG_ERROR([Schnorr signature module is experimental. Use --enable-experimental to allow.])
459 fi
460 if test x"$enable_module_ecdh" = x"yes"; then
461 AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])
462 fi
001f1763
WL
463 if test x"$set_asm" = x"arm"; then
464 AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])
465 fi
83221ecb
PW
466fi
467
78cd96b1 468AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
c7ee71f7 469AC_CONFIG_FILES([Makefile libsecp256k1.pc])
3093576a 470AC_SUBST(JNI_INCLUDES)
78cd96b1
CF
471AC_SUBST(SECP_INCLUDES)
472AC_SUBST(SECP_LIBS)
473AC_SUBST(SECP_TEST_LIBS)
474AC_SUBST(SECP_TEST_INCLUDES)
78cd96b1 475AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
8336040f 476AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
00c5d2e1 477AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"])
0739bbb6 478AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"])
a5a66c70 479AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"])
9f443be0 480AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"])
3093576a 481AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"])
001f1763
WL
482AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"])
483AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"])
e2274c58
CF
484
485dnl make sure nothing new is exported so that we don't break the cache
486PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH"
487unset PKG_CONFIG_PATH
488PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
489
78cd96b1 490AC_OUTPUT
This page took 0.093368 seconds and 4 git commands to generate.