configure.ac, Makefile.am: Collect libs only needed by Catcomb itself.
[catacomb] / configure.ac
1 dnl -*-autoconf-*-
2 dnl
3 dnl Configuration script for Catacomb
4 dnl
5 dnl (c) 2013 Straylight/Edgeware
6 dnl
7
8 dnl----- Licensing notice ---------------------------------------------------
9 dnl
10 dnl This file is part of Catacomb.
11 dnl
12 dnl Catacomb is free software; you can redistribute it and/or modify
13 dnl it under the terms of the GNU Library General Public License as
14 dnl published by the Free Software Foundation; either version 2 of the
15 dnl License, or (at your option) any later version.
16 dnl
17 dnl Catacomb is distributed in the hope that it will be useful,
18 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
19 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 dnl GNU Library General Public License for more details.
21 dnl
22 dnl You should have received a copy of the GNU Library General Public
23 dnl License along with Catacomb; if not, write to the Free
24 dnl Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 dnl MA 02111-1307, USA.
26
27 dnl--------------------------------------------------------------------------
28 dnl Initialization.
29
30 mdw_AUTO_VERSION
31 AC_INIT([catacomb], AUTO_VERSION, [mdw@distorted.org.uk])
32 AC_CONFIG_SRCDIR([catacomb.pc.in])
33 AC_CONFIG_AUX_DIR([config])
34 AM_INIT_AUTOMAKE([foreign parallel-tests color-tests subdir-objects])
35 AC_CANONICAL_HOST
36 mdw_SILENT_RULES
37
38 AC_PROG_CC
39 AX_CFLAGS_WARN_ALL
40 AM_PROG_LIBTOOL
41 mdw_LIBTOOL_VERSION_INFO
42
43 AM_PROG_AS
44
45 AC_PROG_YACC
46
47 AC_SUBST(AM_CFLAGS)
48
49 dnl--------------------------------------------------------------------------
50 dnl Host-specific configuration.
51
52 AC_MSG_CHECKING([CPU family and ABI])
53
54 dnl The table of CPU families and ABIs which we might support. Support is
55 dnl not uniform: each dispatched function might or might not have an
56 dnl implementation for any particular CPU/ABI combination.
57 AC_DEFUN([catacomb_CPU_FAMILIES],
58 [$1([i[[3-6]]86,cygwin], [x86], [win])
59 $1([i[[3-6]]86,*], [x86], [sysv])
60 $1([x86_64,cygwin], [amd64], [win])
61 $1([x86_64,*], [amd64], [sysv])
62 $1([arm,*-gnueabi | arm,*-gnueabihf | dnl
63 armv*,*-gnueabi | armv*,*-gnueabihf], [armel], [gnueabi])])
64
65 dnl A utility to clear the `seen' flags, used so as to process each CPU or
66 dnl ABI once.
67 m4_define([catacomb_CLEAR_FLAGS],
68 [m4_ifdef([catacomb_seen_cpu/$2],
69 [m4_undefine([catacomb_seen_cpu/$2])])dnl
70 m4_ifdef([catacomb_seen_abi/$3],
71 [m4_undefine([catacomb_seen_abi/$3])])])
72
73 dnl Identify the current host.
74 case $host_cpu,$host_os in
75 m4_define([catacomb_CPU_CASE],
76 [$1) CPUFAM=$2 ABI=$3 ;;
77 ])
78 catacomb_CPU_FAMILIES([catacomb_CPU_CASE])
79 *) CPUFAM=nil ABI=nil ;;
80 esac
81
82 dnl Figure out the current CPU.
83 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
84 case $CPUFAM in
85 m4_define([catacomb_DEFINE_CPU],
86 [m4_ifdef([catacomb_seen_cpu/$2], [],
87 [$2)
88 AC_DEFINE([CPUFAM_]m4_translit([$2], [a-z], [A-Z]), [1],
89 [Define if host CPU family is \`$2\'.])
90 ;;m4_define([catacomb_seen_cpu/$2], [t])])])
91 catacomb_CPU_FAMILIES([catacomb_DEFINE_CPU])
92 nil) ;;
93 *) AC_MSG_ERROR([BUG: unexpected cpufam \`$CPUFAM']) ;;
94 esac
95 AC_SUBST([CPUFAM])
96
97 dnl Figure out the current ABI.
98 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
99 case $ABI in
100 m4_define([catacomb_DEFINE_ABI],
101 [m4_ifdef([catacomb_seen_abi/$3], [],
102 [$3)
103 AC_DEFINE([ABI_]m4_translit([$3], [a-z], [A-Z]), [1],
104 [Define if host ABI variant is \`$3\'.])
105 ;;m4_define([catacomb_seen_abi/$3], [t])])])
106 catacomb_CPU_FAMILIES([catacomb_DEFINE_ABI])
107 nil) ;;
108 *) AC_MSG_ERROR([BUG: unexpected ABI \`$ABI']) ;;
109 esac
110 AC_SUBST([ABI])
111
112 dnl Establish Automake conditions for things.
113 catacomb_CPU_FAMILIES([catacomb_CLEAR_FLAGS])
114 m4_define([catacomb_COND_CPU],
115 [m4_define([_CPU], m4_translit([$2], [a-z], [A-Z]))
116 m4_define([_ABI], m4_translit([$3], [a-z], [A-Z]))
117 AM_CONDITIONAL([CPUABI_]_CPU[_]_ABI, [test x$CPUFAM/$ABI = x$2/$3])
118 m4_ifdef([catacomb_seen_cpu/$2], [],
119 [AM_CONDITIONAL([CPUFAM_]_CPU, [test x$CPUFAM = x$2])dnl
120 m4_define([catacomb_seen_cpu/$2], [t])])
121 m4_ifdef([catacomb_seen_abi/$3], [],
122 [AM_CONDITIONAL([ABI_]_ABI, [test x$ABI = x$3])dnl
123 m4_define([catacomb_seen_abi/$3], [t])])])
124 catacomb_CPU_FAMILIES([catacomb_COND_CPU])
125 AM_CONDITIONAL([KNOWN_CPUFAM], [test x$CPUFAM != xnil])
126
127 dnl Report on what we found.
128 case $CPUFAM in
129 nil) AC_MSG_RESULT([not supported]) ;;
130 *) AC_MSG_RESULT([$CPUFAM/$ABI]) ;;
131 esac
132
133 dnl Some equipment wanted for checking CPU features at runtime.
134 AC_CHECK_HEADERS([asm/hwcap.h])
135 AC_CHECK_HEADERS([sys/auxv.h])
136 AC_CHECK_HEADERS([linux/auxvec.h])
137 AC_CHECK_FUNCS([getauxval])
138
139 dnl--------------------------------------------------------------------------
140 dnl C programming environment.
141
142 CATACOMB_LIBS=
143
144 dnl Find out if we're cross-compiling.
145 AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
146
147 dnl Various standard types.
148 AC_CHECK_TYPE([pid_t], [int])
149 AC_TYPE_UID_T
150 AC_CHECK_TYPE([ssize_t], [int])
151 AC_CHECK_TYPE([socklen_t], [int])
152
153 dnl The maths library.
154 mdw_ORIG_LIBS=$LIBS LIBS=
155 AC_SEARCH_LIBS([log], [m])
156 AC_SEARCH_LIBS([sqrt], [m])
157 AC_SUBST([MATHLIBS], [$LIBS])
158 LIBS=$mdw_ORIG_LIBS
159
160 dnl Find out whether very long integer types are available.
161 AC_CHECK_HEADERS([stdint.h])
162 AC_SUBST([have_stdint_h])
163 AC_C_LONG_LONG
164
165 dnl Find the bit lengths of the obvious integer types. This will be useful
166 dnl when deciding on a representation for multiprecision integers.
167 type_bits="" type_bits_sep=""
168 AC_DEFUN([catacomb_UINT_BITS],
169 [mdw_UINT_BITS([$2], [$1])
170 type_bits="$type_bits$type_bits_sep('$1', $[]$1_bits)"
171 type_bits_sep=", "])
172 catacomb_UINT_BITS([uchar], [unsigned char])
173 catacomb_UINT_BITS([ushort], [unsigned short])
174 catacomb_UINT_BITS([uint], [unsigned int])
175 catacomb_UINT_BITS([ulong], [unsigned long])
176 if test "$ac_cv_c_long_long" = "yes"; then
177 catacomb_UINT_BITS([ullong], [unsigned long long])
178 fi
179 if test "$ac_cv_header_stdint_h" = "yes"; then
180 catacomb_UINT_BITS([uintmax], [uintmax_t])
181 fi
182 AC_SUBST([type_bits])
183
184 dnl Determine the limits of common C integer types.
185 limits="" limits_sep=""
186 AC_DEFUN([catacomb_COMPILE_TIME_CONSTANT],
187 [case "$2" in
188 =*)
189 $1="$2"; $1=${$1#=}
190 ;;
191 *)
192 AC_CACHE_CHECK([compile-time value of $2], [mdw_cv_constant_$3],
193 [mdw_PROBE_CONSTANT([mdw_cv_constant_$3], [$2], [$4])])
194 $1=$mdw_cv_constant_$3
195 ;;
196 esac])
197 AC_DEFUN([catacomb_LIMIT],
198 [catacomb_COMPILE_TIME_CONSTANT([lo], [$2], [$1_min],
199 [#include <limits.h>
200 #include <stddef.h>])
201 catacomb_COMPILE_TIME_CONSTANT([hi], [$3], [$1_max],
202 [#include <limits.h>
203 #include <stddef.h>])
204 limits="$limits$limits_sep('$1', $lo, $hi)" limits_sep=", "])
205 catacomb_LIMIT([SCHAR], [SCHAR_MIN], [SCHAR_MAX])
206 catacomb_LIMIT([CHAR], [CHAR_MIN], [CHAR_MAX])
207 catacomb_LIMIT([UCHAR], [=0], [UCHAR_MAX])
208 catacomb_LIMIT([UINT8], [=0], [=0xff])
209 catacomb_LIMIT([SHRT], [SHRT_MIN], [SHRT_MAX])
210 catacomb_LIMIT([USHRT], [=0], [USHRT_MAX])
211 catacomb_LIMIT([UINT16], [=0], [=0xffff])
212 catacomb_LIMIT([INT], [INT_MIN], [INT_MAX])
213 catacomb_LIMIT([UINT], [=0], [UINT_MAX])
214 catacomb_LIMIT([LONG], [LONG_MIN], [LONG_MAX])
215 catacomb_LIMIT([ULONG], [=0], [ULONG_MAX])
216 catacomb_LIMIT([UINT32], [=0], [=0xffffffff])
217 if test "$ac_cv_c_long_long" = "yes"; then
218 catacomb_LIMIT([LLONG], [LLONG_MIN], [LLONG_MAX])
219 catacomb_LIMIT([ULLONG], [=0], [ULLONG_MAX])
220 fi
221 catacomb_LIMIT([SIZET], [=0], [~(size_t)0])
222 AC_SUBST([limits])
223
224 dnl Functions used for noise-gathering.
225 AC_CHECK_FUNCS([setgroups])
226 AC_CHECK_HEADERS([linux/random.h])
227 AC_CHECK_FUNCS([getentropy])
228 AC_CACHE_CHECK([whether the freewheel noise generator will work],
229 [catacomb_cv_freewheel],
230 [AC_TRY_LINK(
231 [#include <setjmp.h>
232 #include <sys/time.h>],
233 [struct itimerval itv = { { 0, 0 }, { 0, 5000 } };
234 jmp_buf j;
235 setitimer(ITIMER_REAL, &itv, 0);
236 sigsetjmp(j, 1);],
237 [catacomb_cv_freewheel=yes],
238 [catacomb_cv_freewheel=no])])
239 case $catacomb_cv_freewheel in
240 yes)
241 AC_DEFINE([USE_FREEWHEEL], [1],
242 [Define if you want to use the freewheel noise generator.])
243 ;;
244 esac
245
246 dnl Support for the passphrase pixie.
247 mdw_ORIG_LIBS=$LIBS
248 AC_SEARCH_LIBS([socket], [socket])
249 AC_SUBST([PIXIE_LIBS], [$LIBS])
250 LIBS=$mdw_ORIG_LIBS
251
252 dnl Memory locking support.
253 AC_CHECK_FUNCS([mlock])
254
255 dnl Set the master libraries we need.
256 AC_SUBST([CATACOMB_LIBS])
257
258 dnl Necessary support libraries.
259 PKG_CHECK_MODULES([mLib], [mLib >= 2.2.2.1])
260 AM_CFLAGS="$AM_CFLAGS $mLib_CFLAGS"
261
262 dnl--------------------------------------------------------------------------
263 dnl Python.
264
265 dnl Make sure we have a suitable version.
266 AM_PATH_PYTHON([2.5])
267
268 dnl--------------------------------------------------------------------------
269 dnl Special debugging options.
270
271 AC_ARG_ENABLE([mpw],
272 [AS_HELP_STRING([--enable-mpw], [force small-width mp digits])],
273 [case "$enableval" in
274 y*|t*|short)
275 AC_DEFINE([FORCE_MPW_SHORT], [1],
276 [Define to force small-width mp digits.])
277 ;;
278 cussid)
279 AC_DEFINE([FORCE_MPW_CUSSID], [1],
280 [Define to force strange-width mp digits.])
281 ;;
282 esac])
283
284 dnl--------------------------------------------------------------------------
285 dnl Produce output.
286
287 AC_CONFIG_HEADER([config/config.h])
288
289 AC_CONFIG_FILES(
290 [Makefile]
291 [base/Makefile]
292 [key/Makefile]
293 [math/Makefile]
294 [misc/Makefile]
295 [pub/Makefile]
296 [rand/Makefile]
297 [symm/Makefile]
298 [progs/Makefile])
299 AC_OUTPUT
300
301 dnl----- That's all, folks --------------------------------------------------