1#***************************************************************************
2#
3# Copyright (C) 2009-2013 by Daniel Stenberg et al
4#
5# Permission to use, copy, modify, and distribute this software and its
6# documentation for any purpose and without fee is hereby granted, provided
7# that the above copyright notice appear in all copies and that both that
8# copyright notice and this permission notice appear in supporting
9# documentation, and that the name of M.I.T. not be used in advertising or
10# publicity pertaining to distribution of the software without specific,
11# written prior permission.  M.I.T. makes no representations about the
12# suitability of this software for any purpose.  It is provided "as is"
13# without express or implied warranty.
14#
15#***************************************************************************
16
17# File version for 'aclocal' use. Keep it a single number.
18# serial 75
19
20
21dnl CARES_CHECK_COMPILER
22dnl -------------------------------------------------
23dnl Verify if the C compiler being used is known.
24
25AC_DEFUN([CARES_CHECK_COMPILER], [
26  #
27  compiler_id="unknown"
28  compiler_num="0"
29  #
30  flags_dbg_all="unknown"
31  flags_dbg_yes="unknown"
32  flags_dbg_off="unknown"
33  flags_opt_all="unknown"
34  flags_opt_yes="unknown"
35  flags_opt_off="unknown"
36  #
37  flags_prefer_cppflags="no"
38  #
39  CARES_CHECK_COMPILER_DEC_C
40  CARES_CHECK_COMPILER_HPUX_C
41  CARES_CHECK_COMPILER_IBM_C
42  CARES_CHECK_COMPILER_INTEL_C
43  CARES_CHECK_COMPILER_CLANG
44  CARES_CHECK_COMPILER_GNU_C
45  CARES_CHECK_COMPILER_LCC
46  CARES_CHECK_COMPILER_SGI_MIPSPRO_C
47  CARES_CHECK_COMPILER_SGI_MIPS_C
48  CARES_CHECK_COMPILER_SUNPRO_C
49  CARES_CHECK_COMPILER_TINY_C
50  CARES_CHECK_COMPILER_WATCOM_C
51  #
52  if test "$compiler_id" = "unknown"; then
53  cat <<_EOF 1>&2
54***
55*** Warning: This configure script does not have information about the
56*** compiler you are using, relative to the flags required to enable or
57*** disable generation of debug info, optimization options or warnings.
58***
59*** Whatever settings are present in CFLAGS will be used for this run.
60***
61*** If you wish to help the c-ares project to better support your compiler
62*** you can report this and the required info on the c-ares development
63*** mailing list: http://cool.haxx.se/mailman/listinfo/c-ares/
64***
65_EOF
66  fi
67])
68
69
70dnl CARES_CHECK_COMPILER_CLANG
71dnl -------------------------------------------------
72dnl Verify if compiler being used is clang.
73
74AC_DEFUN([CARES_CHECK_COMPILER_CLANG], [
75  AC_BEFORE([$0],[CARES_CHECK_COMPILER_GNU_C])dnl
76  AC_MSG_CHECKING([if compiler is clang])
77  CURL_CHECK_DEF([__clang__], [], [silent])
78  if test "$curl_cv_have_def___clang__" = "yes"; then
79    AC_MSG_RESULT([yes])
80    compiler_id="CLANG"
81    clangver=`$CC -dumpversion`
82    clangvhi=`echo $clangver | cut -d . -f1`
83    clangvlo=`echo $clangver | cut -d . -f2`
84    compiler_num=`(expr $clangvhi "*" 100 + $clangvlo) 2>/dev/null`
85    flags_dbg_all="-g -g0 -g1 -g2 -g3"
86    flags_dbg_all="$flags_dbg_all -ggdb"
87    flags_dbg_all="$flags_dbg_all -gstabs"
88    flags_dbg_all="$flags_dbg_all -gstabs+"
89    flags_dbg_all="$flags_dbg_all -gcoff"
90    flags_dbg_all="$flags_dbg_all -gxcoff"
91    flags_dbg_all="$flags_dbg_all -gdwarf-2"
92    flags_dbg_all="$flags_dbg_all -gvms"
93    flags_dbg_yes="-g"
94    flags_dbg_off="-g0"
95    flags_opt_all="-O -O0 -O1 -O2 -Os -O3 -O4"
96    flags_opt_yes="-Os"
97    flags_opt_off="-O0"
98  else
99    AC_MSG_RESULT([no])
100  fi
101])
102
103
104dnl CARES_CHECK_COMPILER_DEC_C
105dnl -------------------------------------------------
106dnl Verify if compiler being used is DEC C.
107
108AC_DEFUN([CARES_CHECK_COMPILER_DEC_C], [
109  AC_MSG_CHECKING([if compiler is DEC/Compaq/HP C])
110  CURL_CHECK_DEF([__DECC], [], [silent])
111  CURL_CHECK_DEF([__DECC_VER], [], [silent])
112  if test "$curl_cv_have_def___DECC" = "yes" &&
113    test "$curl_cv_have_def___DECC_VER" = "yes"; then
114    AC_MSG_RESULT([yes])
115    compiler_id="DEC_C"
116    flags_dbg_all="-g -g0 -g1 -g2 -g3"
117    flags_dbg_yes="-g2"
118    flags_dbg_off="-g0"
119    flags_opt_all="-O -O0 -O1 -O2 -O3 -O4"
120    flags_opt_yes="-O1"
121    flags_opt_off="-O0"
122  else
123    AC_MSG_RESULT([no])
124  fi
125])
126
127
128dnl CARES_CHECK_COMPILER_GNU_C
129dnl -------------------------------------------------
130dnl Verify if compiler being used is GNU C.
131
132AC_DEFUN([CARES_CHECK_COMPILER_GNU_C], [
133  AC_REQUIRE([CARES_CHECK_COMPILER_INTEL_C])dnl
134  AC_REQUIRE([CARES_CHECK_COMPILER_CLANG])dnl
135  AC_MSG_CHECKING([if compiler is GNU C])
136  CURL_CHECK_DEF([__GNUC__], [], [silent])
137  if test "$curl_cv_have_def___GNUC__" = "yes" &&
138    test "$compiler_id" = "unknown"; then
139    AC_MSG_RESULT([yes])
140    compiler_id="GNU_C"
141    gccver=`$CC -dumpversion`
142    gccvhi=`echo $gccver | cut -d . -f1`
143    gccvlo=`echo $gccver | cut -d . -f2`
144    compiler_num=`(expr $gccvhi "*" 100 + $gccvlo) 2>/dev/null`
145    flags_dbg_all="-g -g0 -g1 -g2 -g3"
146    flags_dbg_all="$flags_dbg_all -ggdb"
147    flags_dbg_all="$flags_dbg_all -gstabs"
148    flags_dbg_all="$flags_dbg_all -gstabs+"
149    flags_dbg_all="$flags_dbg_all -gcoff"
150    flags_dbg_all="$flags_dbg_all -gxcoff"
151    flags_dbg_all="$flags_dbg_all -gdwarf-2"
152    flags_dbg_all="$flags_dbg_all -gvms"
153    flags_dbg_yes="-g"
154    flags_dbg_off="-g0"
155    flags_opt_all="-O -O0 -O1 -O2 -O3 -Os"
156    flags_opt_yes="-O2"
157    flags_opt_off="-O0"
158    CURL_CHECK_DEF([_WIN32], [], [silent])
159  else
160    AC_MSG_RESULT([no])
161  fi
162])
163
164
165dnl CARES_CHECK_COMPILER_HPUX_C
166dnl -------------------------------------------------
167dnl Verify if compiler being used is HP-UX C.
168
169AC_DEFUN([CARES_CHECK_COMPILER_HPUX_C], [
170  AC_MSG_CHECKING([if compiler is HP-UX C])
171  CURL_CHECK_DEF([__HP_cc], [], [silent])
172  if test "$curl_cv_have_def___HP_cc" = "yes"; then
173    AC_MSG_RESULT([yes])
174    compiler_id="HP_UX_C"
175    flags_dbg_all="-g -s"
176    flags_dbg_yes="-g"
177    flags_dbg_off="-s"
178    flags_opt_all="-O +O0 +O1 +O2 +O3 +O4"
179    flags_opt_yes="+O2"
180    flags_opt_off="+O0"
181  else
182    AC_MSG_RESULT([no])
183  fi
184])
185
186
187dnl CARES_CHECK_COMPILER_IBM_C
188dnl -------------------------------------------------
189dnl Verify if compiler being used is IBM C.
190
191AC_DEFUN([CARES_CHECK_COMPILER_IBM_C], [
192  AC_MSG_CHECKING([if compiler is IBM C])
193  CURL_CHECK_DEF([__IBMC__], [], [silent])
194  if test "$curl_cv_have_def___IBMC__" = "yes"; then
195    AC_MSG_RESULT([yes])
196    compiler_id="IBM_C"
197    flags_dbg_all="-g -g0 -g1 -g2 -g3"
198    flags_dbg_yes="-g"
199    flags_dbg_off=""
200    flags_opt_all="-O -O0 -O1 -O2 -O3 -O4 -O5"
201    flags_opt_all="$flags_opt_all -qnooptimize"
202    flags_opt_all="$flags_opt_all -qoptimize=0"
203    flags_opt_all="$flags_opt_all -qoptimize=1"
204    flags_opt_all="$flags_opt_all -qoptimize=2"
205    flags_opt_all="$flags_opt_all -qoptimize=3"
206    flags_opt_all="$flags_opt_all -qoptimize=4"
207    flags_opt_all="$flags_opt_all -qoptimize=5"
208    flags_opt_yes="-O2"
209    flags_opt_off="-qnooptimize"
210    flags_prefer_cppflags="yes"
211  else
212    AC_MSG_RESULT([no])
213  fi
214])
215
216
217dnl CARES_CHECK_COMPILER_INTEL_C
218dnl -------------------------------------------------
219dnl Verify if compiler being used is Intel C.
220
221AC_DEFUN([CARES_CHECK_COMPILER_INTEL_C], [
222  AC_BEFORE([$0],[CARES_CHECK_COMPILER_GNU_C])dnl
223  AC_MSG_CHECKING([if compiler is Intel C])
224  CURL_CHECK_DEF([__INTEL_COMPILER], [], [silent])
225  if test "$curl_cv_have_def___INTEL_COMPILER" = "yes"; then
226    AC_MSG_RESULT([yes])
227    compiler_num="$curl_cv_def___INTEL_COMPILER"
228    CURL_CHECK_DEF([__unix__], [], [silent])
229    if test "$curl_cv_have_def___unix__" = "yes"; then
230      compiler_id="INTEL_UNIX_C"
231      flags_dbg_all="-g -g0"
232      flags_dbg_yes="-g"
233      flags_dbg_off="-g0"
234      flags_opt_all="-O -O0 -O1 -O2 -O3 -Os"
235      flags_opt_yes="-O2"
236      flags_opt_off="-O0"
237    else
238      compiler_id="INTEL_WINDOWS_C"
239      flags_dbg_all="/ZI /Zi /zI /zi /ZD /Zd /zD /zd /Z7 /z7 /Oy /Oy-"
240      flags_dbg_all="$flags_dbg_all /debug"
241      flags_dbg_all="$flags_dbg_all /debug:none"
242      flags_dbg_all="$flags_dbg_all /debug:minimal"
243      flags_dbg_all="$flags_dbg_all /debug:partial"
244      flags_dbg_all="$flags_dbg_all /debug:full"
245      flags_dbg_all="$flags_dbg_all /debug:semantic_stepping"
246      flags_dbg_all="$flags_dbg_all /debug:extended"
247      flags_dbg_yes="/Zi /Oy-"
248      flags_dbg_off="/debug:none /Oy-"
249      flags_opt_all="/O /O0 /O1 /O2 /O3 /Od /Og /Og- /Oi /Oi-"
250      flags_opt_yes="/O2"
251      flags_opt_off="/Od"
252    fi
253  else
254    AC_MSG_RESULT([no])
255  fi
256])
257
258
259dnl CARES_CHECK_COMPILER_LCC
260dnl -------------------------------------------------
261dnl Verify if compiler being used is LCC.
262
263AC_DEFUN([CARES_CHECK_COMPILER_LCC], [
264  AC_MSG_CHECKING([if compiler is LCC])
265  CURL_CHECK_DEF([__LCC__], [], [silent])
266  if test "$curl_cv_have_def___LCC__" = "yes"; then
267    AC_MSG_RESULT([yes])
268    compiler_id="LCC"
269    flags_dbg_all="-g"
270    flags_dbg_yes="-g"
271    flags_dbg_off=""
272    flags_opt_all=""
273    flags_opt_yes=""
274    flags_opt_off=""
275  else
276    AC_MSG_RESULT([no])
277  fi
278])
279
280
281dnl CARES_CHECK_COMPILER_SGI_MIPS_C
282dnl -------------------------------------------------
283dnl Verify if compiler being used is SGI MIPS C.
284
285AC_DEFUN([CARES_CHECK_COMPILER_SGI_MIPS_C], [
286  AC_REQUIRE([CARES_CHECK_COMPILER_SGI_MIPSPRO_C])dnl
287  AC_MSG_CHECKING([if compiler is SGI MIPS C])
288  CURL_CHECK_DEF([__GNUC__], [], [silent])
289  CURL_CHECK_DEF([__sgi], [], [silent])
290  if test "$curl_cv_have_def___GNUC__" = "no" &&
291    test "$curl_cv_have_def___sgi" = "yes" &&
292    test "$compiler_id" = "unknown"; then
293    AC_MSG_RESULT([yes])
294    compiler_id="SGI_MIPS_C"
295    flags_dbg_all="-g -g0 -g1 -g2 -g3"
296    flags_dbg_yes="-g"
297    flags_dbg_off="-g0"
298    flags_opt_all="-O -O0 -O1 -O2 -O3 -Ofast"
299    flags_opt_yes="-O2"
300    flags_opt_off="-O0"
301  else
302    AC_MSG_RESULT([no])
303  fi
304])
305
306
307dnl CARES_CHECK_COMPILER_SGI_MIPSPRO_C
308dnl -------------------------------------------------
309dnl Verify if compiler being used is SGI MIPSpro C.
310
311AC_DEFUN([CARES_CHECK_COMPILER_SGI_MIPSPRO_C], [
312  AC_BEFORE([$0],[CARES_CHECK_COMPILER_SGI_MIPS_C])dnl
313  AC_MSG_CHECKING([if compiler is SGI MIPSpro C])
314  CURL_CHECK_DEF([__GNUC__], [], [silent])
315  CURL_CHECK_DEF([_COMPILER_VERSION], [], [silent])
316  CURL_CHECK_DEF([_SGI_COMPILER_VERSION], [], [silent])
317  if test "$curl_cv_have_def___GNUC__" = "no" &&
318    (test "$curl_cv_have_def__SGI_COMPILER_VERSION" = "yes" ||
319     test "$curl_cv_have_def__COMPILER_VERSION" = "yes"); then
320    AC_MSG_RESULT([yes])
321    compiler_id="SGI_MIPSPRO_C"
322    flags_dbg_all="-g -g0 -g1 -g2 -g3"
323    flags_dbg_yes="-g"
324    flags_dbg_off="-g0"
325    flags_opt_all="-O -O0 -O1 -O2 -O3 -Ofast"
326    flags_opt_yes="-O2"
327    flags_opt_off="-O0"
328  else
329    AC_MSG_RESULT([no])
330  fi
331])
332
333
334dnl CARES_CHECK_COMPILER_SUNPRO_C
335dnl -------------------------------------------------
336dnl Verify if compiler being used is SunPro C.
337
338AC_DEFUN([CARES_CHECK_COMPILER_SUNPRO_C], [
339  AC_MSG_CHECKING([if compiler is SunPro C])
340  CURL_CHECK_DEF([__SUNPRO_C], [], [silent])
341  if test "$curl_cv_have_def___SUNPRO_C" = "yes"; then
342    AC_MSG_RESULT([yes])
343    compiler_id="SUNPRO_C"
344    flags_dbg_all="-g -s"
345    flags_dbg_yes="-g"
346    flags_dbg_off="-s"
347    flags_opt_all="-O -xO -xO1 -xO2 -xO3 -xO4 -xO5"
348    flags_opt_yes="-xO2"
349    flags_opt_off=""
350  else
351    AC_MSG_RESULT([no])
352  fi
353])
354
355
356dnl CARES_CHECK_COMPILER_TINY_C
357dnl -------------------------------------------------
358dnl Verify if compiler being used is Tiny C.
359
360AC_DEFUN([CARES_CHECK_COMPILER_TINY_C], [
361  AC_MSG_CHECKING([if compiler is Tiny C])
362  CURL_CHECK_DEF([__TINYC__], [], [silent])
363  if test "$curl_cv_have_def___TINYC__" = "yes"; then
364    AC_MSG_RESULT([yes])
365    compiler_id="TINY_C"
366    flags_dbg_all="-g -b"
367    flags_dbg_yes="-g"
368    flags_dbg_off=""
369    flags_opt_all=""
370    flags_opt_yes=""
371    flags_opt_off=""
372  else
373    AC_MSG_RESULT([no])
374  fi
375])
376
377
378dnl CARES_CHECK_COMPILER_WATCOM_C
379dnl -------------------------------------------------
380dnl Verify if compiler being used is Watcom C.
381
382AC_DEFUN([CARES_CHECK_COMPILER_WATCOM_C], [
383  AC_MSG_CHECKING([if compiler is Watcom C])
384  CURL_CHECK_DEF([__WATCOMC__], [], [silent])
385  if test "$curl_cv_have_def___WATCOMC__" = "yes"; then
386    AC_MSG_RESULT([yes])
387    CURL_CHECK_DEF([__UNIX__], [], [silent])
388    if test "$curl_cv_have_def___UNIX__" = "yes"; then
389      compiler_id="WATCOM_UNIX_C"
390      flags_dbg_all="-g1 -g1+ -g2 -g3"
391      flags_dbg_yes="-g2"
392      flags_dbg_off=""
393      flags_opt_all="-O0 -O1 -O2 -O3"
394      flags_opt_yes="-O2"
395      flags_opt_off="-O0"
396    else
397      compiler_id="WATCOM_WINDOWS_C"
398      flags_dbg_all=""
399      flags_dbg_yes=""
400      flags_dbg_off=""
401      flags_opt_all=""
402      flags_opt_yes=""
403      flags_opt_off=""
404    fi
405  else
406    AC_MSG_RESULT([no])
407  fi
408])
409
410
411dnl CARES_CONVERT_INCLUDE_TO_ISYSTEM
412dnl -------------------------------------------------
413dnl Changes standard include paths present in CFLAGS
414dnl and CPPFLAGS into isystem include paths. This is
415dnl done to prevent GNUC from generating warnings on
416dnl headers from these locations, although on ancient
417dnl GNUC versions these warnings are not silenced.
418
419AC_DEFUN([CARES_CONVERT_INCLUDE_TO_ISYSTEM], [
420  AC_REQUIRE([CARES_SHFUNC_SQUEEZE])dnl
421  AC_REQUIRE([CARES_CHECK_COMPILER])dnl
422  if test "$compiler_id" = "GNU_C" ||
423    test "$compiler_id" = "CLANG"; then
424    tmp_has_include="no"
425    tmp_chg_FLAGS="$CFLAGS"
426    for word1 in $tmp_chg_FLAGS; do
427      case "$word1" in
428        -I*)
429          tmp_has_include="yes"
430          ;;
431      esac
432    done
433    if test "$tmp_has_include" = "yes"; then
434      tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/^-I/ -isystem /g'`
435      tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/ -I/ -isystem /g'`
436      CFLAGS="$tmp_chg_FLAGS"
437      squeeze CFLAGS
438    fi
439    tmp_has_include="no"
440    tmp_chg_FLAGS="$CPPFLAGS"
441    for word1 in $tmp_chg_FLAGS; do
442      case "$word1" in
443        -I*)
444          tmp_has_include="yes"
445          ;;
446      esac
447    done
448    if test "$tmp_has_include" = "yes"; then
449      tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/^-I/ -isystem /g'`
450      tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/ -I/ -isystem /g'`
451      CPPFLAGS="$tmp_chg_FLAGS"
452      squeeze CPPFLAGS
453    fi
454  fi
455])
456
457
458dnl CARES_COMPILER_WORKS_IFELSE ([ACTION-IF-WORKS], [ACTION-IF-NOT-WORKS])
459dnl -------------------------------------------------
460dnl Verify if the C compiler seems to work with the
461dnl settings that are 'active' at the time the test
462dnl is performed.
463
464AC_DEFUN([CARES_COMPILER_WORKS_IFELSE], [
465  dnl compilation capability verification
466  tmp_compiler_works="unknown"
467  AC_COMPILE_IFELSE([
468    AC_LANG_PROGRAM([[
469    ]],[[
470      int i = 1;
471      return i;
472    ]])
473  ],[
474    tmp_compiler_works="yes"
475  ],[
476    tmp_compiler_works="no"
477    echo " " >&6
478    sed 's/^/cc-fail: /' conftest.err >&6
479    echo " " >&6
480  ])
481  dnl linking capability verification
482  if test "$tmp_compiler_works" = "yes"; then
483    AC_LINK_IFELSE([
484      AC_LANG_PROGRAM([[
485      ]],[[
486        int i = 1;
487        return i;
488      ]])
489    ],[
490      tmp_compiler_works="yes"
491    ],[
492      tmp_compiler_works="no"
493      echo " " >&6
494      sed 's/^/link-fail: /' conftest.err >&6
495      echo " " >&6
496    ])
497  fi
498  dnl only do runtime verification when not cross-compiling
499  if test "x$cross_compiling" != "xyes" &&
500    test "$tmp_compiler_works" = "yes"; then
501    AC_RUN_IFELSE([
502      AC_LANG_PROGRAM([[
503#       ifdef __STDC__
504#         include <stdlib.h>
505#       endif
506      ]],[[
507        int i = 0;
508        exit(i);
509      ]])
510    ],[
511      tmp_compiler_works="yes"
512    ],[
513      tmp_compiler_works="no"
514      echo " " >&6
515      echo "run-fail: test program exited with status $ac_status" >&6
516      echo " " >&6
517    ])
518  fi
519  dnl branch upon test result
520  if test "$tmp_compiler_works" = "yes"; then
521  ifelse($1,,:,[$1])
522  ifelse($2,,,[else
523    $2])
524  fi
525])
526
527
528dnl CARES_SET_COMPILER_BASIC_OPTS
529dnl -------------------------------------------------
530dnl Sets compiler specific options/flags which do not
531dnl depend on configure's debug, optimize or warnings
532dnl options.
533
534AC_DEFUN([CARES_SET_COMPILER_BASIC_OPTS], [
535  AC_REQUIRE([CARES_CHECK_COMPILER])dnl
536  AC_REQUIRE([CARES_SHFUNC_SQUEEZE])dnl
537  #
538  if test "$compiler_id" != "unknown"; then
539    #
540    if test "$compiler_id" = "GNU_C" ||
541      test "$compiler_id" = "CLANG"; then
542      CARES_CONVERT_INCLUDE_TO_ISYSTEM
543    fi
544    #
545    tmp_save_CPPFLAGS="$CPPFLAGS"
546    tmp_save_CFLAGS="$CFLAGS"
547    tmp_CPPFLAGS=""
548    tmp_CFLAGS=""
549    #
550    case "$compiler_id" in
551        #
552      CLANG)
553        #
554        dnl Disable warnings for unused arguments, otherwise clang will
555        dnl warn about compile-time arguments used during link-time, like
556        dnl -O and -g and -pedantic.
557        tmp_CFLAGS="$tmp_CFLAGS -Qunused-arguments"
558        ;;
559        #
560      DEC_C)
561        #
562        dnl Select strict ANSI C compiler mode
563        tmp_CFLAGS="$tmp_CFLAGS -std1"
564        dnl Turn off optimizer ANSI C aliasing rules
565        tmp_CFLAGS="$tmp_CFLAGS -noansi_alias"
566        dnl Generate warnings for missing function prototypes
567        tmp_CFLAGS="$tmp_CFLAGS -warnprotos"
568        dnl Change some warnings into fatal errors
569        tmp_CFLAGS="$tmp_CFLAGS -msg_fatal toofewargs,toomanyargs"
570        ;;
571        #
572      GNU_C)
573        #
574        dnl Placeholder
575        tmp_CFLAGS="$tmp_CFLAGS"
576        ;;
577        #
578      HP_UX_C)
579        #
580        dnl Disallow run-time dereferencing of null pointers
581        tmp_CFLAGS="$tmp_CFLAGS -z"
582        dnl Disable some remarks
583        dnl #4227: padding struct with n bytes to align member
584        dnl #4255: padding size of struct with n bytes to alignment boundary
585        tmp_CFLAGS="$tmp_CFLAGS +W 4227,4255"
586        ;;
587        #
588      IBM_C)
589        #
590        dnl Ensure that compiler optimizations are always thread-safe.
591        tmp_CPPFLAGS="$tmp_CPPFLAGS -qthreaded"
592        dnl Disable type based strict aliasing optimizations, using worst
593        dnl case aliasing assumptions when compiling. Type based aliasing
594        dnl would restrict the lvalues that could be safely used to access
595        dnl a data object.
596        tmp_CPPFLAGS="$tmp_CPPFLAGS -qnoansialias"
597        dnl Force compiler to stop after the compilation phase, without
598        dnl generating an object code file when compilation has errors.
599        tmp_CPPFLAGS="$tmp_CPPFLAGS -qhalt=e"
600        ;;
601        #
602      INTEL_UNIX_C)
603        #
604        dnl On unix this compiler uses gcc's header files, so
605        dnl we select ANSI C89 dialect plus GNU extensions.
606        tmp_CFLAGS="$tmp_CFLAGS -std=gnu89"
607        dnl Change some warnings into errors
608        dnl #140: too many arguments in function call
609        dnl #147: declaration is incompatible with 'previous one'
610        dnl #165: too few arguments in function call
611        dnl #266: function declared implicitly
612        tmp_CPPFLAGS="$tmp_CPPFLAGS -we 140,147,165,266"
613        dnl Disable some remarks
614        dnl #279: controlling expression is constant
615        dnl #981: operands are evaluated in unspecified order
616        dnl #1469: "cc" clobber ignored
617        tmp_CPPFLAGS="$tmp_CPPFLAGS -wd 279,981,1469"
618        ;;
619        #
620      INTEL_WINDOWS_C)
621        #
622        dnl Placeholder
623        tmp_CFLAGS="$tmp_CFLAGS"
624        ;;
625        #
626      LCC)
627        #
628        dnl Disallow run-time dereferencing of null pointers
629        tmp_CFLAGS="$tmp_CFLAGS -n"
630        ;;
631        #
632      SGI_MIPS_C)
633        #
634        dnl Placeholder
635        tmp_CFLAGS="$tmp_CFLAGS"
636        ;;
637        #
638      SGI_MIPSPRO_C)
639        #
640        dnl Placeholder
641        tmp_CFLAGS="$tmp_CFLAGS"
642        ;;
643        #
644      SUNPRO_C)
645        #
646        dnl Placeholder
647        tmp_CFLAGS="$tmp_CFLAGS"
648        ;;
649        #
650      TINY_C)
651        #
652        dnl Placeholder
653        tmp_CFLAGS="$tmp_CFLAGS"
654        ;;
655        #
656      WATCOM_UNIX_C)
657        #
658        dnl Placeholder
659        tmp_CFLAGS="$tmp_CFLAGS"
660        ;;
661        #
662      WATCOM_WINDOWS_C)
663        #
664        dnl Placeholder
665        tmp_CFLAGS="$tmp_CFLAGS"
666        ;;
667        #
668    esac
669    #
670    squeeze tmp_CPPFLAGS
671    squeeze tmp_CFLAGS
672    #
673    if test ! -z "$tmp_CFLAGS" || test ! -z "$tmp_CPPFLAGS"; then
674      AC_MSG_CHECKING([if compiler accepts some basic options])
675      CPPFLAGS="$tmp_save_CPPFLAGS $tmp_CPPFLAGS"
676      CFLAGS="$tmp_save_CFLAGS $tmp_CFLAGS"
677      squeeze CPPFLAGS
678      squeeze CFLAGS
679      CARES_COMPILER_WORKS_IFELSE([
680        AC_MSG_RESULT([yes])
681        AC_MSG_NOTICE([compiler options added: $tmp_CFLAGS $tmp_CPPFLAGS])
682      ],[
683        AC_MSG_RESULT([no])
684        AC_MSG_WARN([compiler options rejected: $tmp_CFLAGS $tmp_CPPFLAGS])
685        dnl restore initial settings
686        CPPFLAGS="$tmp_save_CPPFLAGS"
687        CFLAGS="$tmp_save_CFLAGS"
688      ])
689    fi
690    #
691  fi
692])
693
694
695dnl CARES_SET_COMPILER_DEBUG_OPTS
696dnl -------------------------------------------------
697dnl Sets compiler specific options/flags which depend
698dnl on configure's debug option.
699
700AC_DEFUN([CARES_SET_COMPILER_DEBUG_OPTS], [
701  AC_REQUIRE([CARES_CHECK_OPTION_DEBUG])dnl
702  AC_REQUIRE([CARES_CHECK_COMPILER])dnl
703  AC_REQUIRE([CARES_SHFUNC_SQUEEZE])dnl
704  #
705  if test "$compiler_id" != "unknown"; then
706    #
707    tmp_save_CFLAGS="$CFLAGS"
708    tmp_save_CPPFLAGS="$CPPFLAGS"
709    #
710    tmp_options=""
711    tmp_CFLAGS="$CFLAGS"
712    tmp_CPPFLAGS="$CPPFLAGS"
713    CARES_VAR_STRIP([tmp_CFLAGS],[$flags_dbg_all])
714    CARES_VAR_STRIP([tmp_CPPFLAGS],[$flags_dbg_all])
715    #
716    if test "$want_debug" = "yes"; then
717      AC_MSG_CHECKING([if compiler accepts debug enabling options])
718      tmp_options="$flags_dbg_yes"
719    fi
720    if test "$want_debug" = "no"; then
721      AC_MSG_CHECKING([if compiler accepts debug disabling options])
722      tmp_options="$flags_dbg_off"
723    fi
724    #
725    if test "$flags_prefer_cppflags" = "yes"; then
726      CPPFLAGS="$tmp_CPPFLAGS $tmp_options"
727      CFLAGS="$tmp_CFLAGS"
728    else
729      CPPFLAGS="$tmp_CPPFLAGS"
730      CFLAGS="$tmp_CFLAGS $tmp_options"
731    fi
732    squeeze CPPFLAGS
733    squeeze CFLAGS
734    CARES_COMPILER_WORKS_IFELSE([
735      AC_MSG_RESULT([yes])
736      AC_MSG_NOTICE([compiler options added: $tmp_options])
737    ],[
738      AC_MSG_RESULT([no])
739      AC_MSG_WARN([compiler options rejected: $tmp_options])
740      dnl restore initial settings
741      CPPFLAGS="$tmp_save_CPPFLAGS"
742      CFLAGS="$tmp_save_CFLAGS"
743    ])
744    #
745  fi
746])
747
748
749dnl CARES_SET_COMPILER_OPTIMIZE_OPTS
750dnl -------------------------------------------------
751dnl Sets compiler specific options/flags which depend
752dnl on configure's optimize option.
753
754AC_DEFUN([CARES_SET_COMPILER_OPTIMIZE_OPTS], [
755  AC_REQUIRE([CARES_CHECK_OPTION_OPTIMIZE])dnl
756  AC_REQUIRE([CARES_CHECK_COMPILER])dnl
757  AC_REQUIRE([CARES_SHFUNC_SQUEEZE])dnl
758  #
759  if test "$compiler_id" != "unknown"; then
760    #
761    tmp_save_CFLAGS="$CFLAGS"
762    tmp_save_CPPFLAGS="$CPPFLAGS"
763    #
764    tmp_options=""
765    tmp_CFLAGS="$CFLAGS"
766    tmp_CPPFLAGS="$CPPFLAGS"
767    honor_optimize_option="yes"
768    #
769    dnl If optimization request setting has not been explicitly specified,
770    dnl it has been derived from the debug setting and initially assumed.
771    dnl This initially assumed optimizer setting will finally be ignored
772    dnl if CFLAGS or CPPFLAGS already hold optimizer flags. This implies
773    dnl that an initially assumed optimizer setting might not be honored.
774    #
775    if test "$want_optimize" = "assume_no" ||
776       test "$want_optimize" = "assume_yes"; then
777      AC_MSG_CHECKING([if compiler optimizer assumed setting might be used])
778      CARES_VAR_MATCH_IFELSE([tmp_CFLAGS],[$flags_opt_all],[
779        honor_optimize_option="no"
780      ])
781      CARES_VAR_MATCH_IFELSE([tmp_CPPFLAGS],[$flags_opt_all],[
782        honor_optimize_option="no"
783      ])
784      AC_MSG_RESULT([$honor_optimize_option])
785      if test "$honor_optimize_option" = "yes"; then
786        if test "$want_optimize" = "assume_yes"; then
787          want_optimize="yes"
788        fi
789        if test "$want_optimize" = "assume_no"; then
790          want_optimize="no"
791        fi
792      fi
793    fi
794    #
795    if test "$honor_optimize_option" = "yes"; then
796      CARES_VAR_STRIP([tmp_CFLAGS],[$flags_opt_all])
797      CARES_VAR_STRIP([tmp_CPPFLAGS],[$flags_opt_all])
798      if test "$want_optimize" = "yes"; then
799        AC_MSG_CHECKING([if compiler accepts optimizer enabling options])
800        tmp_options="$flags_opt_yes"
801      fi
802      if test "$want_optimize" = "no"; then
803        AC_MSG_CHECKING([if compiler accepts optimizer disabling options])
804        tmp_options="$flags_opt_off"
805      fi
806      if test "$flags_prefer_cppflags" = "yes"; then
807        CPPFLAGS="$tmp_CPPFLAGS $tmp_options"
808        CFLAGS="$tmp_CFLAGS"
809      else
810        CPPFLAGS="$tmp_CPPFLAGS"
811        CFLAGS="$tmp_CFLAGS $tmp_options"
812      fi
813      squeeze CPPFLAGS
814      squeeze CFLAGS
815      CARES_COMPILER_WORKS_IFELSE([
816        AC_MSG_RESULT([yes])
817        AC_MSG_NOTICE([compiler options added: $tmp_options])
818      ],[
819        AC_MSG_RESULT([no])
820        AC_MSG_WARN([compiler options rejected: $tmp_options])
821        dnl restore initial settings
822        CPPFLAGS="$tmp_save_CPPFLAGS"
823        CFLAGS="$tmp_save_CFLAGS"
824      ])
825    fi
826    #
827  fi
828])
829
830
831dnl CARES_SET_COMPILER_WARNING_OPTS
832dnl -------------------------------------------------
833dnl Sets compiler options/flags which depend on
834dnl configure's warnings given option.
835
836AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [
837  AC_REQUIRE([CARES_CHECK_OPTION_WARNINGS])dnl
838  AC_REQUIRE([CARES_CHECK_COMPILER])dnl
839  AC_REQUIRE([CARES_SHFUNC_SQUEEZE])dnl
840  #
841  if test "$compiler_id" != "unknown"; then
842    #
843    tmp_save_CPPFLAGS="$CPPFLAGS"
844    tmp_save_CFLAGS="$CFLAGS"
845    tmp_CPPFLAGS=""
846    tmp_CFLAGS=""
847    #
848    case "$compiler_id" in
849        #
850      CLANG)
851        #
852        if test "$want_warnings" = "yes"; then
853          tmp_CFLAGS="$tmp_CFLAGS -pedantic"
854          tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra"
855          tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings"
856          tmp_CFLAGS="$tmp_CFLAGS -Wshadow"
857          tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs"
858          tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations"
859          tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes"
860          tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long"
861          tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal"
862          tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare"
863          tmp_CFLAGS="$tmp_CFLAGS -Wundef"
864          tmp_CFLAGS="$tmp_CFLAGS -Wno-format-nonliteral"
865          tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes"
866          tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement"
867          tmp_CFLAGS="$tmp_CFLAGS -Wcast-align"
868          tmp_CFLAGS="$tmp_CFLAGS -Wno-system-headers"
869          tmp_CFLAGS="$tmp_CFLAGS -Wshorten-64-to-32"
870          #
871          dnl Only clang 1.1 or later
872          if test "$compiler_num" -ge "101"; then
873            tmp_CFLAGS="$tmp_CFLAGS -Wunused"
874          fi
875        fi
876        ;;
877        #
878      DEC_C)
879        #
880        if test "$want_warnings" = "yes"; then
881          dnl Select a higher warning level than default level2
882          tmp_CFLAGS="$tmp_CFLAGS -msg_enable level3"
883        fi
884        ;;
885        #
886      GNU_C)
887        #
888        if test "$want_warnings" = "yes"; then
889          #
890          dnl Do not enable -pedantic when cross-compiling with a gcc older
891          dnl than 3.0, to avoid warnings from third party system headers.
892          if test "x$cross_compiling" != "xyes" ||
893            test "$compiler_num" -ge "300"; then
894            tmp_CFLAGS="$tmp_CFLAGS -pedantic"
895          fi
896          #
897          dnl Set of options we believe *ALL* gcc versions support:
898          tmp_CFLAGS="$tmp_CFLAGS -Wall -W"
899          #
900          dnl Only gcc 1.4 or later
901          if test "$compiler_num" -ge "104"; then
902            tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings"
903            dnl If not cross-compiling with a gcc older than 3.0
904            if test "x$cross_compiling" != "xyes" ||
905              test "$compiler_num" -ge "300"; then
906              tmp_CFLAGS="$tmp_CFLAGS -Wunused -Wshadow"
907            fi
908          fi
909          #
910          dnl Only gcc 2.7 or later
911          if test "$compiler_num" -ge "207"; then
912            tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs"
913            dnl If not cross-compiling with a gcc older than 3.0
914            if test "x$cross_compiling" != "xyes" ||
915              test "$compiler_num" -ge "300"; then
916              tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations"
917              tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes"
918            fi
919          fi
920          #
921          dnl Only gcc 2.95 or later
922          if test "$compiler_num" -ge "295"; then
923            tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long"
924          fi
925          #
926          dnl Only gcc 2.96 or later
927          if test "$compiler_num" -ge "296"; then
928            tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal"
929            tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare"
930            dnl -Wundef used only if gcc is 2.96 or later since we get
931            dnl lots of "`_POSIX_C_SOURCE' is not defined" in system
932            dnl headers with gcc 2.95.4 on FreeBSD 4.9
933            tmp_CFLAGS="$tmp_CFLAGS -Wundef"
934          fi
935          #
936          dnl Only gcc 2.97 or later
937          if test "$compiler_num" -ge "297"; then
938            tmp_CFLAGS="$tmp_CFLAGS -Wno-format-nonliteral"
939          fi
940          #
941          dnl Only gcc 3.0 or later
942          if test "$compiler_num" -ge "300"; then
943            dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
944            dnl on i686-Linux as it gives us heaps with false positives.
945            dnl Also, on gcc 4.0.X it is totally unbearable and complains all
946            dnl over making it unusable for generic purposes. Let's not use it.
947            tmp_CFLAGS="$tmp_CFLAGS"
948          fi
949          #
950          dnl Only gcc 3.3 or later
951          if test "$compiler_num" -ge "303"; then
952            tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes"
953          fi
954          #
955          dnl Only gcc 3.4 or later
956          if test "$compiler_num" -ge "304"; then
957            tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement"
958          fi
959          #
960          dnl Only gcc 4.0 or later
961          if test "$compiler_num" -ge "400"; then
962            tmp_CFLAGS="$tmp_CFLAGS -Wstrict-aliasing=3"
963          fi
964          #
965          dnl Only gcc 4.2 or later
966          if test "$compiler_num" -ge "402"; then
967            tmp_CFLAGS="$tmp_CFLAGS -Wcast-align"
968          fi
969          #
970          dnl Only gcc 4.3 or later
971          if test "$compiler_num" -ge "403"; then
972            tmp_CFLAGS="$tmp_CFLAGS -Wtype-limits -Wold-style-declaration"
973            tmp_CFLAGS="$tmp_CFLAGS -Wmissing-parameter-type -Wempty-body"
974            tmp_CFLAGS="$tmp_CFLAGS -Wclobbered -Wignored-qualifiers"
975            tmp_CFLAGS="$tmp_CFLAGS -Wconversion -Wno-sign-conversion -Wvla"
976          fi
977          #
978          dnl Only gcc 4.5 or later
979          if test "$compiler_num" -ge "405"; then
980            dnl Only windows targets
981            if test "$curl_cv_have_def__WIN32" = "yes"; then
982              tmp_CFLAGS="$tmp_CFLAGS -Wno-pedantic-ms-format"
983            fi
984          fi
985          #
986        fi
987        #
988        dnl Do not issue warnings for code in system include paths.
989        if test "$compiler_num" -ge "300"; then
990          tmp_CFLAGS="$tmp_CFLAGS -Wno-system-headers"
991        else
992          dnl When cross-compiling with a gcc older than 3.0, disable
993          dnl some warnings triggered on third party system headers.
994          if test "x$cross_compiling" = "xyes"; then
995            if test "$compiler_num" -ge "104"; then
996              dnl gcc 1.4 or later
997              tmp_CFLAGS="$tmp_CFLAGS -Wno-unused -Wno-shadow"
998            fi
999            if test "$compiler_num" -ge "207"; then
1000              dnl gcc 2.7 or later
1001              tmp_CFLAGS="$tmp_CFLAGS -Wno-missing-declarations"
1002              tmp_CFLAGS="$tmp_CFLAGS -Wno-missing-prototypes"
1003            fi
1004          fi
1005        fi
1006        ;;
1007        #
1008      HP_UX_C)
1009        #
1010        if test "$want_warnings" = "yes"; then
1011          dnl Issue all warnings
1012          tmp_CFLAGS="$tmp_CFLAGS +w1"
1013        fi
1014        ;;
1015        #
1016      IBM_C)
1017        #
1018        dnl Placeholder
1019        tmp_CFLAGS="$tmp_CFLAGS"
1020        ;;
1021        #
1022      INTEL_UNIX_C)
1023        #
1024        if test "$want_warnings" = "yes"; then
1025          if test "$compiler_num" -gt "600"; then
1026            dnl Show errors, warnings, and remarks
1027            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wall -w2"
1028            dnl Perform extra compile-time code checking
1029            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wcheck"
1030            dnl Warn on nested comments
1031            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wcomment"
1032            dnl Show warnings relative to deprecated features
1033            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wdeprecated"
1034            dnl Enable warnings for missing prototypes
1035            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wmissing-prototypes"
1036            dnl Enable warnings for 64-bit portability issues
1037            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wp64"
1038            dnl Enable warnings for questionable pointer arithmetic
1039            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wpointer-arith"
1040            dnl Check for function return typw issues
1041            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wreturn-type"
1042            dnl Warn on variable declarations hiding a previous one
1043            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wshadow"
1044            dnl Warn when a variable is used before initialized
1045            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wuninitialized"
1046            dnl Warn if a declared function is not used
1047            tmp_CPPFLAGS="$tmp_CPPFLAGS -Wunused-function"
1048          fi
1049        fi
1050        dnl Disable using EBP register in optimizations
1051        tmp_CFLAGS="$tmp_CFLAGS -fno-omit-frame-pointer"
1052        dnl Disable use of ANSI C aliasing rules in optimizations
1053        tmp_CFLAGS="$tmp_CFLAGS -fno-strict-aliasing"
1054        dnl Value-safe optimizations on floating-point data
1055        tmp_CFLAGS="$tmp_CFLAGS -fp-model precise"
1056        dnl Only icc 10.0 or later
1057        if test "$compiler_num" -ge "1000"; then
1058          dnl Disable vectorizer diagnostic information
1059          tmp_CFLAGS="$tmp_CFLAGS -vec-report0"
1060        fi
1061        ;;
1062        #
1063      INTEL_WINDOWS_C)
1064        #
1065        dnl Placeholder
1066        tmp_CFLAGS="$tmp_CFLAGS"
1067        ;;
1068        #
1069      LCC)
1070        #
1071        if test "$want_warnings" = "yes"; then
1072          dnl Highest warning level is double -A, next is single -A.
1073          dnl Due to the big number of warnings these trigger on third
1074          dnl party header files it is impractical for us to use any of
1075          dnl them here. If you want them simply define it in CPPFLAGS.
1076          tmp_CFLAGS="$tmp_CFLAGS"
1077        fi
1078        ;;
1079        #
1080      SGI_MIPS_C)
1081        #
1082        if test "$want_warnings" = "yes"; then
1083          dnl Perform stricter semantic and lint-like checks
1084          tmp_CFLAGS="$tmp_CFLAGS -fullwarn"
1085        fi
1086        ;;
1087        #
1088      SGI_MIPSPRO_C)
1089        #
1090        if test "$want_warnings" = "yes"; then
1091          dnl Perform stricter semantic and lint-like checks
1092          tmp_CFLAGS="$tmp_CFLAGS -fullwarn"
1093          dnl Disable some remarks
1094          dnl #1209: controlling expression is constant
1095          tmp_CFLAGS="$tmp_CFLAGS -woff 1209"
1096        fi
1097        ;;
1098        #
1099      SUNPRO_C)
1100        #
1101        if test "$want_warnings" = "yes"; then
1102          dnl Perform stricter semantic and lint-like checks
1103          tmp_CFLAGS="$tmp_CFLAGS -v"
1104        fi
1105        ;;
1106        #
1107      TINY_C)
1108        #
1109        if test "$want_warnings" = "yes"; then
1110          dnl Activate all warnings
1111          tmp_CFLAGS="$tmp_CFLAGS -Wall"
1112          dnl Make string constants be of type const char *
1113          tmp_CFLAGS="$tmp_CFLAGS -Wwrite-strings"
1114          dnl Warn use of unsupported GCC features ignored by TCC
1115          tmp_CFLAGS="$tmp_CFLAGS -Wunsupported"
1116        fi
1117        ;;
1118        #
1119      WATCOM_UNIX_C)
1120        #
1121        if test "$want_warnings" = "yes"; then
1122          dnl Issue all warnings
1123          tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra"
1124        fi
1125        ;;
1126        #
1127      WATCOM_WINDOWS_C)
1128        #
1129        dnl Placeholder
1130        tmp_CFLAGS="$tmp_CFLAGS"
1131        ;;
1132        #
1133    esac
1134    #
1135    squeeze tmp_CPPFLAGS
1136    squeeze tmp_CFLAGS
1137    #
1138    if test ! -z "$tmp_CFLAGS" || test ! -z "$tmp_CPPFLAGS"; then
1139      AC_MSG_CHECKING([if compiler accepts strict warning options])
1140      CPPFLAGS="$tmp_save_CPPFLAGS $tmp_CPPFLAGS"
1141      CFLAGS="$tmp_save_CFLAGS $tmp_CFLAGS"
1142      squeeze CPPFLAGS
1143      squeeze CFLAGS
1144      CARES_COMPILER_WORKS_IFELSE([
1145        AC_MSG_RESULT([yes])
1146        AC_MSG_NOTICE([compiler options added: $tmp_CFLAGS $tmp_CPPFLAGS])
1147      ],[
1148        AC_MSG_RESULT([no])
1149        AC_MSG_WARN([compiler options rejected: $tmp_CFLAGS $tmp_CPPFLAGS])
1150        dnl restore initial settings
1151        CPPFLAGS="$tmp_save_CPPFLAGS"
1152        CFLAGS="$tmp_save_CFLAGS"
1153      ])
1154    fi
1155    #
1156  fi
1157])
1158
1159
1160dnl CARES_SHFUNC_SQUEEZE
1161dnl -------------------------------------------------
1162dnl Declares a shell function squeeze() which removes
1163dnl redundant whitespace out of a shell variable.
1164
1165AC_DEFUN([CARES_SHFUNC_SQUEEZE], [
1166squeeze() {
1167  _sqz_result=""
1168  eval _sqz_input=\[$][$]1
1169  for _sqz_token in $_sqz_input; do
1170    if test -z "$_sqz_result"; then
1171      _sqz_result="$_sqz_token"
1172    else
1173      _sqz_result="$_sqz_result $_sqz_token"
1174    fi
1175  done
1176  eval [$]1=\$_sqz_result
1177  return 0
1178}
1179])
1180
1181
1182dnl CARES_CHECK_COMPILER_HALT_ON_ERROR
1183dnl -------------------------------------------------
1184dnl Verifies if the compiler actually halts after the
1185dnl compilation phase without generating any object
1186dnl code file, when the source compiles with errors.
1187
1188AC_DEFUN([CARES_CHECK_COMPILER_HALT_ON_ERROR], [
1189  AC_MSG_CHECKING([if compiler halts on compilation errors])
1190  AC_COMPILE_IFELSE([
1191    AC_LANG_PROGRAM([[
1192    ]],[[
1193      force compilation error
1194    ]])
1195  ],[
1196    AC_MSG_RESULT([no])
1197    AC_MSG_ERROR([compiler does not halt on compilation errors.])
1198  ],[
1199    AC_MSG_RESULT([yes])
1200  ])
1201])
1202
1203
1204dnl CARES_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE
1205dnl -------------------------------------------------
1206dnl Verifies if the compiler actually halts after the
1207dnl compilation phase without generating any object
1208dnl code file, when the source code tries to define a
1209dnl type for a constant array with negative dimension.
1210
1211AC_DEFUN([CARES_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE], [
1212  AC_REQUIRE([CARES_CHECK_COMPILER_HALT_ON_ERROR])dnl
1213  AC_MSG_CHECKING([if compiler halts on negative sized arrays])
1214  AC_COMPILE_IFELSE([
1215    AC_LANG_PROGRAM([[
1216      typedef char bad_t[sizeof(char) == sizeof(int) ? -1 : -1 ];
1217    ]],[[
1218      bad_t dummy;
1219    ]])
1220  ],[
1221    AC_MSG_RESULT([no])
1222    AC_MSG_ERROR([compiler does not halt on negative sized arrays.])
1223  ],[
1224    AC_MSG_RESULT([yes])
1225  ])
1226])
1227
1228
1229dnl CARES_CHECK_COMPILER_STRUCT_MEMBER_SIZE
1230dnl -------------------------------------------------
1231dnl Verifies if the compiler is capable of handling the
1232dnl size of a struct member, struct which is a function
1233dnl result, as a compilation-time condition inside the
1234dnl type definition of a constant array.
1235
1236AC_DEFUN([CARES_CHECK_COMPILER_STRUCT_MEMBER_SIZE], [
1237  AC_REQUIRE([CARES_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE])dnl
1238  AC_MSG_CHECKING([if compiler struct member size checking works])
1239  tst_compiler_check_one_works="unknown"
1240  AC_COMPILE_IFELSE([
1241    AC_LANG_PROGRAM([[
1242      struct mystruct {
1243        int  mi;
1244        char mc;
1245        struct mystruct *next;
1246      };
1247      struct mystruct myfunc();
1248      typedef char good_t1[sizeof(myfunc().mi) == sizeof(int)  ? 1 : -1 ];
1249      typedef char good_t2[sizeof(myfunc().mc) == sizeof(char) ? 1 : -1 ];
1250    ]],[[
1251      good_t1 dummy1;
1252      good_t2 dummy2;
1253    ]])
1254  ],[
1255    tst_compiler_check_one_works="yes"
1256  ],[
1257    tst_compiler_check_one_works="no"
1258    sed 's/^/cc-src: /' conftest.$ac_ext >&6
1259    sed 's/^/cc-err: /' conftest.err >&6
1260  ])
1261  tst_compiler_check_two_works="unknown"
1262  AC_COMPILE_IFELSE([
1263    AC_LANG_PROGRAM([[
1264      struct mystruct {
1265        int  mi;
1266        char mc;
1267        struct mystruct *next;
1268      };
1269      struct mystruct myfunc();
1270      typedef char bad_t1[sizeof(myfunc().mi) != sizeof(int)  ? 1 : -1 ];
1271      typedef char bad_t2[sizeof(myfunc().mc) != sizeof(char) ? 1 : -1 ];
1272    ]],[[
1273      bad_t1 dummy1;
1274      bad_t2 dummy2;
1275    ]])
1276  ],[
1277    tst_compiler_check_two_works="no"
1278  ],[
1279    tst_compiler_check_two_works="yes"
1280  ])
1281  if test "$tst_compiler_check_one_works" = "yes" &&
1282    test "$tst_compiler_check_two_works" = "yes"; then
1283    AC_MSG_RESULT([yes])
1284  else
1285    AC_MSG_RESULT([no])
1286    AC_MSG_ERROR([compiler fails struct member size checking.])
1287  fi
1288])
1289
1290
1291dnl CARES_CHECK_COMPILER_SYMBOL_HIDING
1292dnl -------------------------------------------------
1293dnl Verify if compiler supports hiding library internal symbols, setting
1294dnl shell variable supports_symbol_hiding value as appropriate, as well as
1295dnl variables symbol_hiding_CFLAGS and symbol_hiding_EXTERN when supported.
1296
1297AC_DEFUN([CARES_CHECK_COMPILER_SYMBOL_HIDING], [
1298  AC_REQUIRE([CARES_CHECK_COMPILER])dnl
1299  AC_BEFORE([$0],[CARES_CONFIGURE_SYMBOL_HIDING])dnl
1300  AC_MSG_CHECKING([if compiler supports hiding library internal symbols])
1301  supports_symbol_hiding="no"
1302  symbol_hiding_CFLAGS=""
1303  symbol_hiding_EXTERN=""
1304  tmp_CFLAGS=""
1305  tmp_EXTERN=""
1306  case "$compiler_id" in
1307    CLANG)
1308      dnl All versions of clang support -fvisibility=
1309      tmp_EXTERN="__attribute__ ((__visibility__ (\"default\")))"
1310      tmp_CFLAGS="-fvisibility=hidden"
1311      supports_symbol_hiding="yes"
1312      ;;
1313    GNU_C)
1314      dnl Only gcc 3.4 or later
1315      if test "$compiler_num" -ge "304"; then
1316        if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then
1317          tmp_EXTERN="__attribute__ ((__visibility__ (\"default\")))"
1318          tmp_CFLAGS="-fvisibility=hidden"
1319          supports_symbol_hiding="yes"
1320        fi
1321      fi
1322      ;;
1323    INTEL_UNIX_C)
1324      dnl Only icc 9.0 or later
1325      if test "$compiler_num" -ge "900"; then
1326        if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then
1327          tmp_save_CFLAGS="$CFLAGS"
1328          CFLAGS="$CFLAGS -fvisibility=hidden"
1329          AC_LINK_IFELSE([
1330            AC_LANG_PROGRAM([[
1331#             include <stdio.h>
1332            ]],[[
1333              printf("icc fvisibility bug test");
1334            ]])
1335          ],[
1336            tmp_EXTERN="__attribute__ ((__visibility__ (\"default\")))"
1337            tmp_CFLAGS="-fvisibility=hidden"
1338            supports_symbol_hiding="yes"
1339          ])
1340          CFLAGS="$tmp_save_CFLAGS"
1341        fi
1342      fi
1343      ;;
1344    SUNPRO_C)
1345      if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then
1346        tmp_EXTERN="__global"
1347        tmp_CFLAGS="-xldscope=hidden"
1348        supports_symbol_hiding="yes"
1349      fi
1350      ;;
1351  esac
1352  if test "$supports_symbol_hiding" = "yes"; then
1353    tmp_save_CFLAGS="$CFLAGS"
1354    CFLAGS="$tmp_save_CFLAGS $tmp_CFLAGS"
1355    squeeze CFLAGS
1356    AC_COMPILE_IFELSE([
1357      AC_LANG_PROGRAM([[
1358        $tmp_EXTERN char *dummy(char *buff);
1359        char *dummy(char *buff)
1360        {
1361         if(buff)
1362           return ++buff;
1363         else
1364           return buff;
1365        }
1366      ]],[[
1367        char b[16];
1368        char *r = dummy(&b[0]);
1369        if(r)
1370          return (int)*r;
1371      ]])
1372    ],[
1373      supports_symbol_hiding="yes"
1374      if test -f conftest.err; then
1375        grep 'visibility' conftest.err >/dev/null
1376        if test "$?" -eq "0"; then
1377          supports_symbol_hiding="no"
1378        fi
1379      fi
1380    ],[
1381      supports_symbol_hiding="no"
1382      echo " " >&6
1383      sed 's/^/cc-src: /' conftest.$ac_ext >&6
1384      sed 's/^/cc-err: /' conftest.err >&6
1385      echo " " >&6
1386    ])
1387    CFLAGS="$tmp_save_CFLAGS"
1388  fi
1389  if test "$supports_symbol_hiding" = "yes"; then
1390    AC_MSG_RESULT([yes])
1391    symbol_hiding_CFLAGS="$tmp_CFLAGS"
1392    symbol_hiding_EXTERN="$tmp_EXTERN"
1393  else
1394    AC_MSG_RESULT([no])
1395  fi
1396])
1397
1398
1399dnl CARES_CHECK_COMPILER_PROTOTYPE_MISMATCH
1400dnl -------------------------------------------------
1401dnl Verifies if the compiler actually halts after the
1402dnl compilation phase without generating any object
1403dnl code file, when the source code tries to redefine
1404dnl a prototype which does not match previous one.
1405
1406AC_DEFUN([CARES_CHECK_COMPILER_PROTOTYPE_MISMATCH], [
1407  AC_REQUIRE([CARES_CHECK_COMPILER_HALT_ON_ERROR])dnl
1408  AC_MSG_CHECKING([if compiler halts on function prototype mismatch])
1409  AC_COMPILE_IFELSE([
1410    AC_LANG_PROGRAM([[
1411#     include <stdlib.h>
1412      int rand(int n);
1413      int rand(int n)
1414      {
1415        if(n)
1416          return ++n;
1417        else
1418          return n;
1419      }
1420    ]],[[
1421      int i[2];
1422      int j = rand(i[0]);
1423      if(j)
1424        return j;
1425    ]])
1426  ],[
1427    AC_MSG_RESULT([no])
1428    AC_MSG_ERROR([compiler does not halt on function prototype mismatch.])
1429  ],[
1430    AC_MSG_RESULT([yes])
1431  ])
1432])
1433
1434
1435dnl CARES_VAR_MATCH (VARNAME, VALUE)
1436dnl -------------------------------------------------
1437dnl Verifies if shell variable VARNAME contains VALUE.
1438dnl Contents of variable VARNAME and VALUE are handled
1439dnl as whitespace separated lists of words. If at least
1440dnl one word of VALUE is present in VARNAME the match
1441dnl is considered positive, otherwise false.
1442
1443AC_DEFUN([CARES_VAR_MATCH], [
1444  ac_var_match_word="no"
1445  for word1 in $[$1]; do
1446    for word2 in [$2]; do
1447      if test "$word1" = "$word2"; then
1448        ac_var_match_word="yes"
1449      fi
1450    done
1451  done
1452])
1453
1454
1455dnl CARES_VAR_MATCH_IFELSE (VARNAME, VALUE,
1456dnl                        [ACTION-IF-MATCH], [ACTION-IF-NOT-MATCH])
1457dnl -------------------------------------------------
1458dnl This performs a CURL_VAR_MATCH check and executes
1459dnl first branch if the match is positive, otherwise
1460dnl the second branch is executed.
1461
1462AC_DEFUN([CARES_VAR_MATCH_IFELSE], [
1463  CARES_VAR_MATCH([$1],[$2])
1464  if test "$ac_var_match_word" = "yes"; then
1465  ifelse($3,,:,[$3])
1466  ifelse($4,,,[else
1467    $4])
1468  fi
1469])
1470
1471
1472dnl CARES_VAR_STRIP (VARNAME, VALUE)
1473dnl -------------------------------------------------
1474dnl Contents of variable VARNAME and VALUE are handled
1475dnl as whitespace separated lists of words. Each word
1476dnl from VALUE is removed from VARNAME when present.
1477
1478AC_DEFUN([CARES_VAR_STRIP], [
1479  AC_REQUIRE([CARES_SHFUNC_SQUEEZE])dnl
1480  ac_var_stripped=""
1481  for word1 in $[$1]; do
1482    ac_var_strip_word="no"
1483    for word2 in [$2]; do
1484      if test "$word1" = "$word2"; then
1485        ac_var_strip_word="yes"
1486      fi
1487    done
1488    if test "$ac_var_strip_word" = "no"; then
1489      ac_var_stripped="$ac_var_stripped $word1"
1490    fi
1491  done
1492  dnl squeeze whitespace out of result
1493  [$1]="$ac_var_stripped"
1494  squeeze [$1]
1495])
1496
1497