Add autoconf checks for builtins, __has_builtin doesn't seem to work correctly with...
[freeradius.git] / acinclude.m4
1 dnl Checks to see if this is SUNPro we're building with
2 dnl Usage:
3 dnl AC_PROG_CC_SUNPRO
4 AC_DEFUN([AC_PROG_CC_SUNPRO],
5 [AC_CACHE_CHECK(whether we are using SUNPro C, ac_cv_prog_suncc,
6 [dnl The semicolon is to pacify NeXT's syntax-checking cpp.
7 cat > conftest.c <<EOF
8 #ifdef __SUNPRO_C
9   yes;
10 #endif
11 EOF
12 if AC_TRY_COMMAND(${CC-cc} -E conftest.c) | egrep yes >/dev/null 2>&1; then
13   ac_cv_prog_suncc=yes
14 else
15   ac_cv_prog_suncc=no
16 fi])])
17
18 dnl #
19 dnl # FR_CHECK_TYPE_INCLUDE([#includes ...], type, default-C-types)
20 dnl #
21 dnl # This function is like AC_CHECK_TYPE, but you can give this one
22 dnl # a list of include files to check.
23 dnl #
24 AC_DEFUN([FR_CHECK_TYPE_INCLUDE],
25 [
26   AC_CACHE_CHECK(for $2, ac_cv_type_$2,
27     [ ac_cv_type_$2=no
28       AC_TRY_COMPILE($1,
29         [$2 foo],
30         ac_cv_type_$2=yes,
31       )
32     ]
33   )
34
35   if test "$ac_cv_type_$2" != "yes"; then
36          AC_DEFINE($2, $3, $4)
37   fi
38 ])
39
40 dnl #
41 dnl #  Locate the directory in which a particular file is found.
42 dnl #
43 dnl #  Usage: FR_LOCATE_DIR(MYSQLLIB_DIR, libmysqlclient.a)
44 dnl #
45 dnl #    Defines the variable MYSQLLIB_DIR to be the directory(s) in
46 dnl #    which the file libmysqlclient.a is to be found.
47 dnl #
48 dnl #
49 AC_DEFUN([FR_LOCATE_DIR],
50 [
51 dnl # If we have the program 'locate', then the problem of finding a
52 dnl # particular file becomes MUCH easier.
53 dnl #
54
55 dnl #
56 dnl #  No 'locate' defined, do NOT do anything.
57 dnl #
58 if test "x$LOCATE" != "x"; then
59   dnl #
60   dnl #  Root through a series of directories, looking for the given file.
61   dnl #
62   DIRS=
63   file=$2
64
65   for x in `${LOCATE} $file 2>/dev/null`; do
66     dnl #
67     dnl #  When asked for 'foo', locate will also find 'foo_bar', which we
68     dnl #  don't want.  We want that EXACT filename.
69     dnl #
70     dnl #  We ALSO want to be able to look for files like 'mysql/mysql.h',
71     dnl #  and properly match them, too.  So we try to strip off the last
72     dnl #  part of the filename, using the name of the file we're looking
73     dnl #  for.  If we CANNOT strip it off, then the name will be unchanged.
74     dnl #
75     base=`echo $x | sed "s%/${file}%%"`
76     if test "x$x" = "x$base"; then
77       continue;
78     fi
79
80     dir=`${DIRNAME} $x 2>/dev/null`
81     dnl #
82     dnl #  Exclude a number of directories.
83     dnl #
84     exclude=`echo ${dir} | ${GREP} /home`
85     if test "x$exclude" != "x"; then
86       continue
87     fi
88
89     dnl #
90     dnl #  OK, we have an exact match.  Let's be sure that we only find ONE
91     dnl #  matching directory.
92     dnl #
93     already=`echo \$$1 ${DIRS} | ${GREP} ${dir}`
94     if test "x$already" = "x"; then
95       DIRS="$DIRS $dir"
96     fi
97   done
98 fi
99
100 dnl #
101 dnl #  And remember the directory in which we found the file.
102 dnl #
103 eval "$1=\"\$$1 $DIRS\""
104 ])
105
106
107 dnl #######################################################################
108 dnl #
109 dnl #  Look for a library in a number of places.
110 dnl #
111 dnl #  FR_SMART_CHECK_LIB(library, function)
112 dnl #
113 AC_DEFUN([FR_SMART_CHECK_LIB], [
114
115 sm_lib_safe=`echo "$1" | sed 'y%./+-%__p_%'`
116 sm_func_safe=`echo "$2" | sed 'y%./+-%__p_%'`
117
118 dnl #
119 dnl #  We pass all arguments for linker testing in CCPFLAGS as these
120 dnl #  will be passed to the compiler (then linker) first.
121 dnl #
122 dnl #  The linker will search through -L directories in the order they
123 dnl #  appear on the command line.  Unfortunately the same rules appear
124 dnl #  to apply to directories specified with --sysroot, so we must
125 dnl #  pass the user specified directory first.
126 dnl #
127 dnl #  Really we should be using LDFLAGS (-L<dir>) for this.
128 dnl #
129 old_LIBS="$LIBS"
130 old_CPPFLAGS="$CPPFLAGS"
131 smart_lib=
132 smart_ldflags=
133 smart_lib_dir=
134
135 dnl #
136 dnl #  Try first any user-specified directory, otherwise we may pick up
137 dnl #  the wrong version.
138 dnl #
139 if test "x$smart_try_dir" != "x"; then
140   for try in $smart_try_dir; do
141     AC_MSG_CHECKING([for $2 in -l$1 in $try])
142     LIBS="-l$1 $old_LIBS"
143     CPPFLAGS="-L$try -Wl,-rpath,$try $old_CPPFLAGS"
144     AC_TRY_LINK([extern char $2();],
145                 [$2()],
146                 [
147                  smart_lib="-l$1"
148                  smart_ldflags="-L$try -Wl,-rpath,$try"
149                  AC_MSG_RESULT(yes)
150                  break
151                 ],
152                 [AC_MSG_RESULT(no)])
153   done
154   LIBS="$old_LIBS"
155   CPPFLAGS="$old_CPPFLAGS"
156 fi
157
158 dnl #
159 dnl #  Try using the default library path
160 dnl #
161 if test "x$smart_lib" = "x"; then
162   AC_MSG_CHECKING([for $2 in -l$1])
163   LIBS="-l$1 $old_LIBS"
164   AC_TRY_LINK([extern char $2();],
165               [$2()],
166               [
167                 smart_lib="-l$1"
168                 AC_MSG_RESULT(yes)
169               ],
170               [AC_MSG_RESULT(no)])
171   LIBS="$old_LIBS"
172 fi
173
174 dnl #
175 dnl #  Try to guess possible locations.
176 dnl #
177 if test "x$smart_lib" = "x"; then
178   FR_LOCATE_DIR(smart_lib_dir,[lib$1${libltdl_cv_shlibext}])
179   FR_LOCATE_DIR(smart_lib_dir,[lib$1.a])
180
181   for try in $smart_lib_dir /usr/local/lib /opt/lib; do
182     AC_MSG_CHECKING([for $2 in -l$1 in $try])
183     LIBS="-l$1 $old_LIBS"
184     CPPFLAGS="-L$try -Wl,-rpath,$try $old_CPPFLAGS"
185     AC_TRY_LINK([extern char $2();],
186                 [$2()],
187                 [
188                   smart_lib="-l$1"
189                   smart_ldflags="-L$try -Wl,-rpath,$try"
190                   AC_MSG_RESULT(yes)
191                   break
192                 ],
193                 [AC_MSG_RESULT(no)])
194   done
195   LIBS="$old_LIBS"
196   CPPFLAGS="$old_CPPFLAGS"
197 fi
198
199 dnl #
200 dnl #  Found it, set the appropriate variable.
201 dnl #
202 if test "x$smart_lib" != "x"; then
203   eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes"
204   LIBS="$smart_ldflags $smart_lib $old_LIBS"
205   SMART_LIBS="$smart_ldflags $smart_lib $SMART_LIBS"
206 fi
207 ])
208
209 dnl #######################################################################
210 dnl #
211 dnl #  Look for a header file in a number of places.
212 dnl #
213 dnl #  FR_SMART_CHECK_INCLUDE(foo.h, [ #include <other.h> ])
214 dnl #
215 AC_DEFUN([FR_SMART_CHECK_INCLUDE], [
216
217 ac_safe=`echo "$1" | sed 'y%./+-%__pm%'`
218 old_CPPFLAGS="$CPPFLAGS"
219 smart_include=
220 smart_include_dir=
221
222 dnl #
223 dnl #  Try first any user-specified directory, otherwise we may pick up
224 dnl #  the wrong version.
225 dnl #
226 if test "x$smart_try_dir" != "x"; then
227   for try in $smart_try_dir; do
228     AC_MSG_CHECKING([for $1 in $try])
229     CPPFLAGS="-isystem $try $old_CPPFLAGS"
230     AC_TRY_COMPILE([$2
231                     #include <$1>],
232                    [int a = 1;],
233                    [
234                      smart_include="-isystem $try"
235                      AC_MSG_RESULT(yes)
236                      break
237                    ],
238                    [
239                      smart_include=
240                      AC_MSG_RESULT(no)
241                    ])
242   done
243   CPPFLAGS="$old_CPPFLAGS"
244 fi
245
246 dnl #
247 dnl #  Try using the default includes.
248 dnl #
249 if test "x$smart_include" = "x"; then
250   AC_MSG_CHECKING([for $1])
251   AC_TRY_COMPILE([$2
252                   #include <$1>],
253                  [int a = 1;],
254                  [
255                    smart_include=" "
256                    AC_MSG_RESULT(yes)
257                    break
258                  ],
259                  [
260                    smart_include=
261                    AC_MSG_RESULT(no)
262                  ])
263 fi
264
265 dnl #
266 dnl #  Try to guess possible locations.
267 dnl #
268 if test "x$smart_include" = "x"; then
269   FR_LOCATE_DIR(smart_include_dir,$1)
270   for try in $smart_include_dir /usr/local/include /opt/include; do
271     AC_MSG_CHECKING([for $1 in $try])
272     CPPFLAGS="-isystem $try $old_CPPFLAGS"
273     AC_TRY_COMPILE([$2
274                     #include <$1>],
275                    [int a = 1;],
276                    [
277                      smart_include="-isystem $try"
278                      AC_MSG_RESULT(yes)
279                      break
280                    ],
281                    [
282                      smart_include=
283                      AC_MSG_RESULT(no)
284                    ])
285   done
286   CPPFLAGS="$old_CPPFLAGS"
287 fi
288
289 dnl #
290 dnl #  Found it, set the appropriate variable.
291 dnl #
292 if test "x$smart_include" != "x"; then
293   eval "ac_cv_header_$ac_safe=yes"
294   CPPFLAGS="$smart_include $old_CPPFLAGS"
295   SMART_CPPFLAGS="$smart_include $SMART_CPPFLAGS"
296 fi
297 ])
298
299 dnl #######################################################################
300 dnl #
301 dnl #  Look for a header file in a number of places.
302 dnl #
303 dnl #  Usage:  FR_CHECK_STRUCT_HAS_MEMBER([#include <foo.h>], [struct foo], member)
304 dnl #  If the member is defined, then the variable
305 dnl #     ac_cv_type_struct_foo_has_member is set to 'yes'
306 dnl #
307 AC_DEFUN([FR_CHECK_STRUCT_HAS_MEMBER], [
308   AC_MSG_CHECKING([for $3 in $2])
309
310 dnl BASED on 'offsetof':
311 dnl #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
312 dnl
313
314   AC_TRY_COMPILE([
315 $1
316 #ifdef HAVE_STDDEF_H
317 #include <stddef.h>
318 #endif
319 #ifndef offsetof
320 #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
321 #endif
322 ],
323                  [ int foo = offsetof($2, $3) ],
324                  has_element=" ",
325                  has_element=)
326
327   ac_safe_type=`echo "$2" | sed 'y% %_%'`
328   if test "x$has_element" != "x"; then
329     AC_MSG_RESULT(yes)
330     eval "ac_cv_type_${ac_safe_type}_has_$3=yes"
331   else
332     AC_MSG_RESULT(no)
333     eval "ac_cv_type_${ac_safe_type}_has_$3="
334  fi
335 ])
336
337 dnl Autoconf 2.61 breaks the support for chained configure scripts
338 dnl in combination with config.cache
339 m4_pushdef([AC_OUTPUT],
340 [
341   unset ac_cv_env_LIBS_set
342   unset ac_cv_env_LIBS_value
343   m4_popdef([AC_OUTPUT])
344   AC_OUTPUT([$1],[$2],[$3])
345 ])
346
347 dnl #
348 dnl #  Figure out which storage class specifier for Thread Local Storage is supported by the compiler
349 dnl #
350 AC_DEFUN([FR_TLS],
351 [
352 dnl #
353 dnl #  See if the compilation works with __thread, for thread-local storage
354 dnl #
355   AC_MSG_CHECKING(for __thread support in compiler)
356   AC_RUN_IFELSE(
357     [AC_LANG_SOURCE(
358       [[
359         static __thread int val;
360         int main(int argc, char **argv) {
361           val = 0;
362           return val;
363         }
364       ]])
365     ],[have_tls=yes],[have_tls=no],[have_tls=no])
366   AC_MSG_RESULT($have_tls)
367   if test "x$have_tls" = "xyes"; then
368     AC_DEFINE([TLS_STORAGE_CLASS],[__thread],[Define if the compiler supports a thread local storage class])
369   fi
370
371 dnl #
372 dnl #  __declspec(thread) does exactly the same thing as __thread, but is supported by MSVS
373 dnl #
374   if test "x$have_tls" = "xno"; then
375     AC_MSG_CHECKING(for __declspec(thread) support in compiler)
376     AC_RUN_IFELSE(
377       [AC_LANG_SOURCE(
378         [[
379           static _Thread_local int val;
380           int main(int argc, char **argv) {
381             val = 0;
382             return val;
383           }
384         ]])
385       ],[have_tls=yes],[have_tls=no],[have_tls=no])
386     AC_MSG_RESULT($have_tls)
387     if test "x$have_tls" = "xyes"; then
388       AC_DEFINE([TLS_STORAGE_CLASS],[__declspec(thread)],[Define if the compiler supports a thread local storage class])
389     fi
390   fi
391 dnl #
392 dnl #  _Thread_local does exactly the same thing as __thread, but it's standards compliant with C11.
393 dnl #  we, however, state we are only compliant with C99, so the compiler will probably emit warnings
394 dnl #  if we use it.  So save it as a last resort.
395 dnl #
396   if test "x$have_tls" = "xno"; then
397     AC_MSG_CHECKING(for _Thread_local support in compiler)
398     AC_RUN_IFELSE(
399       [AC_LANG_SOURCE(
400         [[
401           static _Thread_local int val;
402           int main(int argc, char **argv) {
403             val = 0;
404             return val;
405           }
406         ]])
407       ],[have_tls=yes],[have_tls=no],[have_tls=no])
408     AC_MSG_RESULT($have_tls)
409     if test "x$have_tls" = "xyes"; then
410       AC_DEFINE([TLS_STORAGE_CLASS],[_Thread_local],[Define if the compiler supports a thread local storage class])
411     fi
412   fi
413 ])
414
415 AC_DEFUN([VL_LIB_READLINE], [
416   AC_CACHE_CHECK([for a readline compatible library],
417                  vl_cv_lib_readline, [
418     ORIG_LIBS="$LIBS"
419     for readline_lib in readline edit editline; do
420       for termcap_lib in "" termcap curses ncurses; do
421         if test -z "$termcap_lib"; then
422           TRY_LIB="-l$readline_lib"
423         else
424           TRY_LIB="-l$readline_lib -l$termcap_lib"
425         fi
426         LIBS="$ORIG_LIBS $TRY_LIB"
427         AC_TRY_LINK_FUNC(readline, vl_cv_lib_readline="$TRY_LIB")
428         if test -n "$vl_cv_lib_readline"; then
429           break
430         fi
431       done
432       if test -n "$vl_cv_lib_readline"; then
433         break
434       fi
435     done
436     if test -z "$vl_cv_lib_readline"; then
437       vl_cv_lib_readline="no"
438       LIBS="$ORIG_LIBS"
439     fi
440   ])
441
442   if test "$vl_cv_lib_readline" != "no"; then
443     LIBREADLINE="$vl_cv_lib_readline"
444     AC_DEFINE(HAVE_LIBREADLINE, 1,
445               [Define if you have a readline compatible library])
446     AC_CHECK_HEADERS(readline.h readline/readline.h)
447     AC_CACHE_CHECK([whether readline supports history],
448                    [vl_cv_lib_readline_history], [
449       vl_cv_lib_readline_history="no"
450       AC_TRY_LINK_FUNC([add_history], [vl_cv_lib_readline_history="yes"])
451     ])
452     if test "$vl_cv_lib_readline_history" = "yes"; then
453       AC_DEFINE(HAVE_READLINE_HISTORY, 1,
454                 [Define if your readline library has \`add_history'])
455       AC_CHECK_HEADERS(history.h readline/history.h)
456     fi
457   fi
458   AC_SUBST(LIBREADLINE)
459 ])dnl
460
461 dnl #
462 dnl #  Figure out which storage class specifier for Thread Local Storage is supported by the compiler
463 dnl #
464 AC_DEFUN([FR_HAVE_BUILTIN_CHOOSE_EXPR],
465 [
466 dnl #
467 dnl #  See if the compilation works with __thread, for thread-local storage
468 dnl #
469   AC_MSG_CHECKING(for __builtin_choose_expr support in compiler)
470   AC_RUN_IFELSE(
471     [AC_LANG_SOURCE(
472       [[
473         int main(int argc, char **argv) {
474                 return __builtin_choose_expr(0, 1, 0);
475         }
476       ]])
477     ],[have_builtin=yes],[have_builtin=no],[have_builtin=no])
478   AC_MSG_RESULT($have_builtin)
479   if test "x$have_builtin" = "xyes"; then
480     AC_DEFINE([HAVE_BUILTIN_CHOOSE_EXPR],1,[Define if the compiler supports __builtin_choose_expr])
481   fi
482 ])
483
484 dnl #
485 dnl #  Figure out which storage class specifier for Thread Local Storage is supported by the compiler
486 dnl #
487 AC_DEFUN([FR_HAVE_BUILTIN_TYPES_COMPATIBLE_P],
488 [
489 dnl #
490 dnl #  See if the compilation works with __thread, for thread-local storage
491 dnl #
492   AC_MSG_CHECKING(for __builtin_types_compatible_p support in compiler)
493   AC_RUN_IFELSE(
494     [AC_LANG_SOURCE(
495       [[
496         int main(int argc, char **argv) {
497                 return !(__builtin_types_compatible_p(char *, char *));
498         }
499       ]])
500     ],[have_builtin=yes],[have_builtin=no],[have_builtin=no])
501   AC_MSG_RESULT($have_builtin)
502   if test "x$have_builtin" = "xyes"; then
503     AC_DEFINE([HAVE_BUILTIN_TYPES_COMPATIBLE_P],1,[Define if the compiler supports __builtin_types_compatible_p])
504   fi
505 ])
506
507 AC_INCLUDE(aclocal.m4)