SHA-1/SSSE3: Improve performance on large buffers
[libgcrypt.git] / acinclude.m4
1 dnl macros to configure Libgcrypt
2 dnl Copyright (C) 1998, 1999, 2000, 2001, 2002,
3 dnl               2003 Free Software Foundation, Inc.
4 dnl Copyright (C) 2013 g10 Code GmbH
5 dnl
6 dnl This file is part of Libgcrypt.
7 dnl
8 dnl Libgcrypt is free software; you can redistribute it and/or modify
9 dnl it under the terms of the GNU Lesser General Public License as
10 dnl published by the Free Software Foundation; either version 2.1 of
11 dnl the License, or (at your option) any later version.
12 dnl
13 dnl Libgcrypt is distributed in the hope that it will be useful,
14 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
15 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 dnl GNU Lesser General Public License for more details.
17 dnl
18 dnl You should have received a copy of the GNU Lesser General Public
19 dnl License along with this program; if not, write to the Free Software
20 dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
21
22 dnl GCRY_MSG_SHOW(PREFIX,STRING)
23 dnl Print a message with a prefix.
24 dnl
25 define([GCRY_MSG_SHOW],
26   [
27      echo "        $1 $2" 1>&AS_MESSAGE_FD([])
28   ])
29
30 dnl GCRY_MSG_WRAP(PREFIX, ALGOLIST)
31 dnl Print a nicely formatted list of algorithms
32 dnl with an approriate line wrap.
33 dnl
34 define([GCRY_MSG_WRAP],
35   [
36     tmp="        $1"
37     tmpi="abc"
38     if test "${#tmpi}" -ne 3 >/dev/null 2>&1 ; then
39       dnl Without a POSIX shell, we don't botter to wrap it
40       echo "$tmp $2" 1>&AS_MESSAGE_FD([])
41     else
42       tmpi=`echo "$tmp"| sed 's/./ /g'`
43       echo $2 EOF | tr ' ' '\n' | \
44         while read word; do
45           if test "${#tmp}" -gt 70 ; then
46             echo "$tmp" 1>&AS_MESSAGE_FD([])
47             tmp="$tmpi"
48           fi
49           if test "$word" = "EOF" ; then
50             echo "$tmp" 1>&AS_MESSAGE_FD([])
51           else
52             tmp="$tmp $word"
53           fi
54         done
55     fi
56   ])
57
58
59 dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME)
60 dnl Check whether a typedef exists and create a #define $2 if it exists
61 dnl
62 AC_DEFUN([GNUPG_CHECK_TYPEDEF],
63   [ AC_MSG_CHECKING(for $1 typedef)
64     AC_CACHE_VAL(gnupg_cv_typedef_$1,
65     [AC_TRY_COMPILE([#define _GNU_SOURCE 1
66     #include <stdlib.h>
67     #include <sys/types.h>], [
68     #undef $1
69     int a = sizeof($1);
70     ], gnupg_cv_typedef_$1=yes, gnupg_cv_typedef_$1=no )])
71     AC_MSG_RESULT($gnupg_cv_typedef_$1)
72     if test "$gnupg_cv_typedef_$1" = yes; then
73         AC_DEFINE($2,1,[Defined if a `]$1[' is typedef'd])
74     fi
75   ])
76
77
78 dnl GNUPG_CHECK_GNUMAKE
79 dnl
80 AC_DEFUN([GNUPG_CHECK_GNUMAKE],
81   [
82     if ${MAKE-make} --version 2>/dev/null | grep '^GNU ' >/dev/null 2>&1; then
83         :
84     else
85         AC_MSG_WARN([[
86 ***
87 *** It seems that you are not using GNU make.  Some make tools have serious
88 *** flaws and you may not be able to build this software at all. Before you
89 *** complain, please try GNU make:  GNU make is easy to build and available
90 *** at all GNU archives.  It is always available from ftp.gnu.org:/gnu/make.
91 ***]])
92     fi
93   ])
94
95
96 #
97 # GNUPG_SYS_SYMBOL_UNDERSCORE
98 # Does the compiler prefix global symbols with an underscore?
99 #
100 # Taken from GnuPG 1.2 and modified to use the libtool macros.
101 AC_DEFUN([GNUPG_SYS_SYMBOL_UNDERSCORE],
102 [tmp_do_check="no"
103 case "${host}" in
104     *-mingw32msvc*)
105         ac_cv_sys_symbol_underscore=yes
106         ;;
107     i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp)
108         ac_cv_sys_symbol_underscore=yes
109         ;;
110     *)
111       if test "$cross_compiling" = yes; then
112         if test "x$ac_cv_sys_symbol_underscore" = x ; then
113            ac_cv_sys_symbol_underscore=yes
114         fi
115       else
116          tmp_do_check="yes"
117       fi
118        ;;
119 esac
120 if test "$tmp_do_check" = "yes"; then
121   AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])
122   AC_MSG_CHECKING([for _ prefix in compiled symbols])
123   AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
124   [ac_cv_sys_symbol_underscore=no
125    cat > conftest.$ac_ext <<EOF
126       void nm_test_func(){}
127       int main(){nm_test_func;return 0;}
128 EOF
129   if AC_TRY_EVAL(ac_compile); then
130     # Now try to grab the symbols.
131     ac_nlist=conftest.nm
132     if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \| cut -d \' \' -f 2 \> $ac_nlist) && test -s "$ac_nlist"; then
133       # See whether the symbols have a leading underscore.
134       if egrep '^_nm_test_func' "$ac_nlist" >/dev/null; then
135         ac_cv_sys_symbol_underscore=yes
136       else
137         if egrep '^nm_test_func ' "$ac_nlist" >/dev/null; then
138           :
139         else
140           echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
141         fi
142       fi
143     else
144       echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC
145     fi
146   else
147     echo "configure: failed program was:" >&AC_FD_CC
148     cat conftest.c >&AC_FD_CC
149   fi
150   rm -rf conftest*
151   ])
152   else
153   AC_MSG_CHECKING([for _ prefix in compiled symbols])
154   fi
155 AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
156 if test x$ac_cv_sys_symbol_underscore = xyes; then
157   AC_DEFINE(WITH_SYMBOL_UNDERSCORE,1,
158             [Defined if compiled symbols have a leading underscore])
159 fi
160 ])
161
162
163 ######################################################################
164 # Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
165 # is not called from uid 0 (not tested whether uid 0 works)
166 # For DECs Tru64 we have also to check whether mlock is in librt
167 # mlock is there a macro using memlk()
168 ######################################################################
169 dnl GNUPG_CHECK_MLOCK
170 dnl
171 define(GNUPG_CHECK_MLOCK,
172   [ AC_CHECK_FUNCS(mlock)
173     if test "$ac_cv_func_mlock" = "no"; then
174         AC_CHECK_HEADERS(sys/mman.h)
175         if test "$ac_cv_header_sys_mman_h" = "yes"; then
176             # Add librt to LIBS:
177             AC_CHECK_LIB(rt, memlk)
178             AC_CACHE_CHECK([whether mlock is in sys/mman.h],
179                             gnupg_cv_mlock_is_in_sys_mman,
180                 [AC_TRY_LINK([
181                     #include <assert.h>
182                     #ifdef HAVE_SYS_MMAN_H
183                     #include <sys/mman.h>
184                     #endif
185                 ], [
186 int i;
187
188 /* glibc defines this for functions which it implements
189  * to always fail with ENOSYS.  Some functions are actually
190  * named something starting with __ and the normal name
191  * is an alias.  */
192 #if defined (__stub_mlock) || defined (__stub___mlock)
193 choke me
194 #else
195 mlock(&i, 4);
196 #endif
197 ; return 0;
198                 ],
199                 gnupg_cv_mlock_is_in_sys_mman=yes,
200                 gnupg_cv_mlock_is_in_sys_mman=no)])
201             if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
202                 AC_DEFINE(HAVE_MLOCK,1,
203                           [Defined if the system supports an mlock() call])
204             fi
205         fi
206     fi
207     if test "$ac_cv_func_mlock" = "yes"; then
208         AC_CHECK_FUNCS(sysconf getpagesize)
209         AC_MSG_CHECKING(whether mlock is broken)
210           AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
211              AC_TRY_RUN([
212 #include <stdlib.h>
213 #include <unistd.h>
214 #include <errno.h>
215 #include <sys/mman.h>
216 #include <sys/types.h>
217 #include <fcntl.h>
218
219 int main()
220 {
221     char *pool;
222     int err;
223     long int pgsize;
224
225 #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
226     pgsize = sysconf (_SC_PAGESIZE);
227 #elif defined (HAVE_GETPAGESIZE)
228     pgsize = getpagesize();
229 #else
230     pgsize = -1;
231 #endif
232
233     if (pgsize == -1)
234       pgsize = 4096;
235
236     pool = malloc( 4096 + pgsize );
237     if( !pool )
238         return 2;
239     pool += (pgsize - ((long int)pool % pgsize));
240
241     err = mlock( pool, 4096 );
242     if( !err || errno == EPERM )
243         return 0; /* okay */
244
245     return 1;  /* hmmm */
246 }
247
248             ],
249             gnupg_cv_have_broken_mlock="no",
250             gnupg_cv_have_broken_mlock="yes",
251             gnupg_cv_have_broken_mlock="assume-no"
252            )
253          )
254          if test "$gnupg_cv_have_broken_mlock" = "yes"; then
255              AC_DEFINE(HAVE_BROKEN_MLOCK,1,
256                        [Defined if the mlock() call does not work])
257              AC_MSG_RESULT(yes)
258          else
259             if test "$gnupg_cv_have_broken_mlock" = "no"; then
260                 AC_MSG_RESULT(no)
261             else
262                 AC_MSG_RESULT(assuming no)
263             fi
264          fi
265     fi
266   ])
267
268 # GNUPG_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32
269 AC_DEFUN([GNUPG_SYS_LIBTOOL_CYGWIN32],
270 [AC_CHECK_TOOL(DLLTOOL, dlltool, false)
271 AC_CHECK_TOOL(AS, as, false)
272 ])
273
274 dnl LIST_MEMBER()
275 dnl Check wether an element ist contained in a list.  Set `found' to
276 dnl `1' if the element is found in the list, to `0' otherwise.
277 AC_DEFUN([LIST_MEMBER],
278 [
279 name=$1
280 list=$2
281 found=0
282
283 for n in $list; do
284   if test "x$name" = "x$n"; then
285     found=1
286   fi
287 done
288 ])
289
290
291 dnl Check for socklen_t: historically on BSD it is an int, and in
292 dnl POSIX 1g it is a type of its own, but some platforms use different
293 dnl types for the argument to getsockopt, getpeername, etc.  So we
294 dnl have to test to find something that will work.
295 AC_DEFUN([TYPE_SOCKLEN_T],
296 [
297    AC_CHECK_TYPE([socklen_t], ,[
298       AC_MSG_CHECKING([for socklen_t equivalent])
299       AC_CACHE_VAL([socklen_t_equiv],
300       [
301          # Systems have either "struct sockaddr *" or
302          # "void *" as the second argument to getpeername
303          socklen_t_equiv=
304          for arg2 in "struct sockaddr" void; do
305             for t in int size_t unsigned long "unsigned long"; do
306                AC_TRY_COMPILE([
307 #include <sys/types.h>
308 #include <sys/socket.h>
309
310 int getpeername (int, $arg2 *, $t *);
311                ],[
312                   $t len;
313                   getpeername(0,0,&len);
314                ],[
315                   socklen_t_equiv="$t"
316                   break
317                ])
318             done
319          done
320
321          if test "x$socklen_t_equiv" = x; then
322             AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
323          fi
324       ])
325       AC_MSG_RESULT($socklen_t_equiv)
326       AC_DEFINE_UNQUOTED(socklen_t, $socklen_t_equiv,
327                         [type to use in place of socklen_t if not defined])],
328       [#include <sys/types.h>
329 #include <sys/socket.h>])
330 ])
331
332
333 # GNUPG_PTH_VERSION_CHECK(REQUIRED)
334 #
335 # If the version is sufficient, HAVE_PTH will be set to yes.
336 #
337 # Taken form the m4 macros which come with Pth
338 AC_DEFUN([GNUPG_PTH_VERSION_CHECK],
339   [
340     _pth_version=`$PTH_CONFIG --version | awk 'NR==1 {print [$]3}'`
341     _req_version="ifelse([$1],,1.2.0,$1)"
342
343     AC_MSG_CHECKING(for PTH - version >= $_req_version)
344     for _var in _pth_version _req_version; do
345         eval "_val=\"\$${_var}\""
346         _major=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\1/'`
347         _minor=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\2/'`
348         _rtype=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\3/'`
349         _micro=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\4/'`
350         case $_rtype in
351             "a" ) _rtype=0 ;;
352             "b" ) _rtype=1 ;;
353             "." ) _rtype=2 ;;
354         esac
355         _hex=`echo dummy | awk '{ printf("%d%02d%1d%02d", major, minor, rtype, micro); }' \
356               "major=$_major" "minor=$_minor" "rtype=$_rtype" "micro=$_micro"`
357         eval "${_var}_hex=\"\$_hex\""
358     done
359     have_pth=no
360     if test ".$_pth_version_hex" != .; then
361         if test ".$_req_version_hex" != .; then
362             if test $_pth_version_hex -ge $_req_version_hex; then
363                 have_pth=yes
364             fi
365         fi
366     fi
367     if test $have_pth = yes; then
368        AC_MSG_RESULT(yes)
369        AC_MSG_CHECKING([whether PTH installation is sane])
370        AC_CACHE_VAL(gnupg_cv_pth_is_sane,[
371          _gnupg_pth_save_cflags=$CFLAGS
372          _gnupg_pth_save_ldflags=$LDFLAGS
373          _gnupg_pth_save_libs=$LIBS
374          CFLAGS="$CFLAGS `$PTH_CONFIG --cflags`"
375          LDFLAGS="$LDFLAGS `$PTH_CONFIG --ldflags`"
376          LIBS="$LIBS `$PTH_CONFIG --libs`"
377          AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pth.h>
378                                          ],
379                                          [[ pth_init ();]])],
380                         gnupg_cv_pth_is_sane=yes,
381                         gnupg_cv_pth_is_sane=no)
382          CFLAGS=$_gnupg_pth_save_cflags
383          LDFLAGS=$_gnupg_pth_save_ldflags
384          LIBS=$_gnupg_pth_save_libs
385        ])
386        if test $gnupg_cv_pth_is_sane != yes; then
387           have_pth=no
388        fi
389        AC_MSG_RESULT($gnupg_cv_pth_is_sane)
390     else
391        AC_MSG_RESULT(no)
392     fi
393   ])