root/mpich2/trunk/confdb/aclocal_cc.m4 @ 4878

Revision 4878, 75.3 KB (checked in by goodell, 5 months ago)

Separate warning flags onto separate lines for easier VCS tracking.

No reviewer.

Line 
1dnl
2dnl This is a replacement for AC_PROG_CC that does not prefer gcc and
3dnl that does not mess with CFLAGS.  See acspecific.m4 for the original defn.
4dnl
5dnl/*D
6dnl PAC_PROG_CC - Find a working C compiler
7dnl
8dnl Synopsis:
9dnl PAC_PROG_CC
10dnl
11dnl Output Effect:
12dnl   Sets the variable CC if it is not already set
13dnl
14dnl Notes:
15dnl   Unlike AC_PROG_CC, this does not prefer gcc and does not set CFLAGS.
16dnl   It does check that the compiler can compile a simple C program.
17dnl   It also sets the variable GCC to yes if the compiler is gcc.  It does
18dnl   not yet check for some special options needed in particular for
19dnl   parallel computers, such as -Tcray-t3e, or special options to get
20dnl   full ANSI/ISO C, such as -Aa for HP.
21dnl
22dnl D*/
23dnl 2.52 doesn't have AC_PROG_CC_GNU
24ifdef([AC_PROG_CC_GNU],,[AC_DEFUN([AC_PROG_CC_GNU],)])
25AC_DEFUN([PAC_PROG_CC],[
26AC_PROVIDE([AC_PROG_CC])
27AC_CHECK_PROGS(CC, cc xlC xlc pgcc icc pathcc gcc )
28test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
29PAC_PROG_CC_WORKS
30AC_PROG_CC_GNU
31if test "$ac_cv_prog_gcc" = yes; then
32  GCC=yes
33else
34  GCC=
35fi
36])
37dnl
38dnl/*D
39dnl PAC_C_CHECK_COMPILER_OPTION - Check that a compiler option is accepted
40dnl without warning messages
41dnl
42dnl Synopsis:
43dnl PAC_C_CHECK_COMPILER_OPTION(optionname,action-if-ok,action-if-fail)
44dnl
45dnl Output Effects:
46dnl
47dnl If no actions are specified, a working value is added to 'COPTIONS'
48dnl
49dnl Notes:
50dnl This is now careful to check that the output is different, since
51dnl some compilers are noisy.
52dnl
53dnl We are extra careful to prototype the functions in case compiler options
54dnl that complain about poor code are in effect.
55dnl
56dnl Because this is a long script, we have ensured that you can pass a
57dnl variable containing the option name as the first argument.
58dnl D*/
59AC_DEFUN([PAC_C_CHECK_COMPILER_OPTION],[
60AC_MSG_CHECKING([whether C compiler accepts option $1])
61save_CFLAGS="$CFLAGS"
62CFLAGS="$1 $CFLAGS"
63rm -f conftest.out
64echo 'int foo(void);int foo(void){return 0;}' > conftest2.c
65echo 'int main(void);int main(void){return 0;}' > conftest.c
66if ${CC-cc} $save_CFLAGS $CPPFLAGS -o conftest conftest.c $LDFLAGS >conftest.bas 2>&1 ; then
67   if ${CC-cc} $CFLAGS $CPPFLAGS -o conftest conftest.c $LDFLAGS >conftest.out 2>&1 ; then
68      if diff -b conftest.out conftest.bas >/dev/null 2>&1 ; then
69         AC_MSG_RESULT(yes)
70         AC_MSG_CHECKING([whether routines compiled with $1 can be linked with ones compiled without $1])       
71         rm -f conftest.out
72         rm -f conftest.bas
73         if ${CC-cc} -c $save_CFLAGS $CPPFLAGS conftest2.c >conftest2.out 2>&1 ; then
74            if ${CC-cc} $CFLAGS $CPPFLAGS -o conftest conftest2.o conftest.c $LDFLAGS >conftest.bas 2>&1 ; then
75               if ${CC-cc} $CFLAGS $CPPFLAGS -o conftest conftest2.o conftest.c $LDFLAGS >conftest.out 2>&1 ; then
76                  if diff -b conftest.out conftest.bas >/dev/null 2>&1 ; then
77                     AC_MSG_RESULT(yes)   
78                     CFLAGS="$save_CFLAGS"
79                     ifelse($2,,COPTIONS="$COPTIONS $1",$2)
80                  elif test -s conftest.out ; then
81                     cat conftest.out >&AC_FD_CC
82                     AC_MSG_RESULT(no)
83                     CFLAGS="$save_CFLAGS"
84                     $3
85                  else
86                     AC_MSG_RESULT(no)
87                     CFLAGS="$save_CFLAGS"
88                     $3
89                  fi 
90               else
91                  if test -s conftest.out ; then
92                     cat conftest.out >&AC_FD_CC
93                  fi
94                  AC_MSG_RESULT(no)
95                  CFLAGS="$save_CFLAGS"
96                  $3
97               fi
98            else
99               # Could not link with the option!
100               AC_MSG_RESULT(no)
101            fi
102         else
103            if test -s conftest2.out ; then
104               cat conftest2.out >&AC_FD_CC
105            fi
106            AC_MSG_RESULT(no)
107            CFLAGS="$save_CFLAGS"
108            $3
109         fi
110      else
111         cat conftest.out >&AC_FD_CC
112         AC_MSG_RESULT(no)
113         $3
114         CFLAGS="$save_CFLAGS"         
115      fi
116   else
117      AC_MSG_RESULT(no)
118      $3
119      if test -s conftest.out ; then cat conftest.out >&AC_FD_CC ; fi   
120      CFLAGS="$save_CFLAGS"
121   fi
122else
123    # Could not compile without the option!
124    AC_MSG_RESULT(no)
125fi
126# This is needed for Mac OSX 10.5
127rm -rf conftest.dSYM
128rm -f conftest*
129])
130dnl
131dnl/*D
132dnl PAC_C_OPTIMIZATION - Determine C options for producing optimized code
133dnl
134dnl Synopsis
135dnl PAC_C_OPTIMIZATION([action if found])
136dnl
137dnl Output Effect:
138dnl Adds options to 'COPTIONS' if no other action is specified
139dnl
140dnl Notes:
141dnl This is a temporary standin for compiler optimization.
142dnl It should try to match known systems to known compilers (checking, of
143dnl course), and then falling back to some common defaults.
144dnl Note that many compilers will complain about -g and aggressive
145dnl optimization. 
146dnl D*/
147AC_DEFUN([PAC_C_OPTIMIZATION],[
148    for copt in "-O4 -Ofast" "-Ofast" "-fast" "-O3" "-xO3" "-O" ; do
149        PAC_C_CHECK_COMPILER_OPTION($copt,found_opt=yes,found_opt=no)
150        if test "$found_opt" = "yes" ; then
151            ifelse($1,,COPTIONS="$COPTIONS $copt",$1)
152            break
153        fi
154    done
155    if test "$ac_cv_prog_gcc" = "yes" ; then
156        for copt in "-fomit-frame-pointer" "-finline-functions" \
157                 "-funroll-loops" ; do
158            PAC_C_CHECK_COMPILER_OPTION($copt,found_opt=yes,found_opt=no)
159            if test $found_opt = "yes" ; then
160                ifelse($1,,COPTIONS="$COPTIONS $copt",$1)
161                # no break because we're trying to add them all
162            fi
163        done
164        # We could also look for architecture-specific gcc options
165    fi
166
167])
168dnl
169dnl/*D
170dnl PAC_C_DEPENDS - Determine how to use the C compiler to generate
171dnl dependency information
172dnl
173dnl Synopsis:
174dnl PAC_C_DEPENDS
175dnl
176dnl Output Effects:
177dnl Sets the following shell variables and call AC_SUBST for them:
178dnl+ C_DEPEND_OPT - Compiler options needed to create dependencies
179dnl. C_DEPEND_OUT - Shell redirection for dependency file (may be empty)
180dnl. C_DEPEND_PREFIX - Empty (null) or true; this is used to handle
181dnl  systems that do not provide dependency information
182dnl- C_DEPEND_MV - Command to move created dependency file
183dnl Also creates a Depends file in the top directory (!).
184dnl
185dnl In addition, the variable 'C_DEPEND_DIR' must be set to indicate the
186dnl directory in which the dependency files should live. 
187dnl
188dnl Notes:
189dnl A typical Make rule that exploits this macro is
190dnl.vb
191dnl #
192dnl # Dependency processing
193dnl .SUFFIXES: .dep
194dnl DEP_SOURCES = ${SOURCES:%.c=.dep/%.dep}
195dnl C_DEPEND_DIR = .dep
196dnl Depends: ${DEP_SOURCES}
197dnl         @-rm -f Depends
198dnl         cat .dep/*.dep >Depends
199dnl .dep/%.dep:%.c
200dnl         @if [ ! -d .dep ] ; then mkdir .dep ; fi
201dnl         @@C_DEPEND_PREFIX@ ${C_COMPILE} @C_DEPEND_OPT@ $< @C_DEPEND_OUT@
202dnl         @@C_DEPEND_MV@
203dnl
204dnl depends-clean:
205dnl         @-rm -f *.dep ${srcdir}/*.dep Depends ${srcdir}/Depends
206dnl         @-touch Depends
207dnl.ve
208dnl
209dnl For each file 'foo.c', this creates a file 'foo.dep' and creates a file
210dnl 'Depends' that contains all of the '*.dep' files.
211dnl
212dnl For your convenience, the autoconf variable 'C_DO_DEPENDS' names a file
213dnl that may contain this code (you must have `dependsrule` or
214dnl `dependsrule.in` in the same directory as the other auxillery configure
215dnl scripts (set with dnl 'AC_CONFIG_AUX_DIR').  If you use `dependsrule.in`,
216dnl you must have `dependsrule` in 'AC_OUTPUT' before this `Makefile`.
217dnl
218dnl D*/
219dnl
220dnl Eventually, we can add an option to the C_DEPEND_MV to strip system
221dnl includes, such as /usr/xxxx and /opt/xxxx
222dnl
223AC_DEFUN([PAC_C_DEPENDS],[
224AC_SUBST(C_DEPEND_OPT)AM_IGNORE(C_DEPEND_OPT)
225AC_SUBST(C_DEPEND_OUT)AM_IGNORE(C_DEPEND_OUT)
226AC_SUBST(C_DEPEND_MV)AM_IGNORE(C_DEPEND_MV)
227AC_SUBST(C_DEPEND_PREFIX)AM_IGNORE(C_DEPEND_PREFIX)
228AC_SUBST_FILE(C_DO_DEPENDS)
229dnl set the value of the variable to a
230dnl file that contains the dependency code, such as
231dnl ${top_srcdir}/maint/dependrule
232if test -n "$ac_cv_c_depend_opt" ; then
233    AC_MSG_RESULT([Option $ac_cv_c_depend_opt creates dependencies (cached)])
234    C_DEPEND_OUT="$ac_cv_c_depend_out"
235    C_DEPEND_MV="$ac_cv_c_depend_mv"
236    C_DEPEND_OPT="$ac_cv_c_depend_opt"
237    C_DEPEND_PREFIX="$ac_cv_c_depend_prefix"
238    C_DO_DEPENDS="$ac_cv_c_do_depends"
239else
240   # Determine the values
241# This is needed for Mac OSX 10.5
242rm -rf conftest.dSYM
243rm -f conftest*
244dnl
245dnl Some systems (/usr/ucb/cc on Solaris) do not generate a dependency for
246dnl an include that doesn't begin in column 1
247dnl
248cat >conftest.c <<EOF
249    #include "confdefs.h"
250    int f(void) { return 0; }
251EOF
252dnl -xM1 is Solaris C compiler (no /usr/include files)
253dnl -MM is gcc (no /usr/include files)
254dnl -MMD is gcc to .d
255dnl .u is xlC (AIX) output
256for copt in "-xM1" "-c -xM1" "-xM" "-c -xM" "-MM" "-M" "-c -M"; do
257    AC_MSG_CHECKING([whether $copt option generates dependencies])
258    rm -f conftest.o conftest.u conftest.d conftest.err conftest.out
259    dnl also need to check that error output is empty
260    if $CC $CFLAGS $copt conftest.c >conftest.out 2>conftest.err && \
261        test ! -s conftest.err ; then
262        dnl Check for dependency info in conftest.out
263        if test -s conftest.u ; then
264            C_DEPEND_OUT=""
265            C_DEPEND_MV='mv $[*].u ${C_DEPEND_DIR}/$[*].dep'
266            pac_dep_file=conftest.u
267        elif test -s conftest.d ; then
268            C_DEPEND_OUT=""
269            C_DEPEND_MV='mv $[*].d ${C_DEPEND_DIR}/$[*].dep'
270            pac_dep_file=conftest.d
271        else
272            dnl C_DEPEND_OUT='>${C_DEPEND_DIR}/$[*].dep'
273            dnl This for is needed for VPATH.  Perhaps the others should match.
274            C_DEPEND_OUT='>$@'
275            C_DEPEND_MV=:
276            pac_dep_file=conftest.out
277        fi
278        if grep 'confdefs.h' $pac_dep_file >/dev/null 2>&1 ; then
279            AC_MSG_RESULT(yes)
280            C_DEPEND_OPT="$copt"
281            AC_MSG_CHECKING([whether .o file created with dependency file])
282            if test -s conftest.o ; then
283                AC_MSG_RESULT(yes)
284            else
285                AC_MSG_RESULT(no)
286                echo "Output of $copt option was" >&AC_FD_CC
287                cat $pac_dep_file >&AC_FD_CC
288            fi
289            break
290        else
291            AC_MSG_RESULT(no)
292        fi
293    else
294        echo "Error in compiling program with flags $copt" >&AC_FD_CC
295        cat conftest.out >&AC_FD_CC
296        if test -s conftest.err ; then cat conftest.err >&AC_FD_CC ; fi
297        AC_MSG_RESULT(no)
298    fi
299    copt=""
300done
301    if test -f $CONFIG_AUX_DIR/dependsrule -o \
302            -f $CONFIG_AUX_DIR/dependsrule.in; then
303        C_DO_DEPENDS="$CONFIG_AUX_DIR/dependsrule"
304    else
305        C_DO_DEPENDS="/dev/null"
306    fi
307    if test "X$copt" = "X" ; then
308        C_DEPEND_PREFIX="true"
309    else
310        C_DEPEND_PREFIX=""
311    fi
312    ac_cv_c_depend_out="$C_DEPEND_OUT"
313    ac_cv_c_depend_mv="$C_DEPEND_MV"
314    ac_cv_c_depend_opt="$C_DEPEND_OPT"
315    ac_cv_c_depend_prefix="$C_DEPEND_PREFIX"
316    ac_cv_c_do_depends="$C_DO_DEPENDS"
317fi
318])
319dnl
320dnl/*D
321dnl PAC_C_PROTOTYPES - Check that the compiler accepts ANSI prototypes. 
322dnl
323dnl Synopsis:
324dnl PAC_C_PROTOTYPES([action if true],[action if false])
325dnl
326dnl D*/
327AC_DEFUN([PAC_C_PROTOTYPES],[
328AC_CACHE_CHECK([whether $CC supports function prototypes],
329pac_cv_c_prototypes,[
330AC_TRY_COMPILE([int f(double a){return 0;}],[return 0];,
331pac_cv_c_prototypes="yes",pac_cv_c_prototypes="no")])
332if test "$pac_cv_c_prototypes" = "yes" ; then
333    ifelse([$1],,:,[$1])
334else
335    ifelse([$2],,:,[$2])
336fi
337])dnl
338dnl
339dnl/*D
340dnl PAC_FUNC_SEMCTL - Check for semctl and its argument types
341dnl
342dnl Synopsis:
343dnl PAC_FUNC_SEMCTL
344dnl
345dnl Output Effects:
346dnl Sets 'HAVE_SEMCTL' if semctl is available.
347dnl Sets 'HAVE_UNION_SEMUN' if 'union semun' is available.
348dnl Sets 'SEMCTL_NEEDS_SEMUN' if a 'union semun' type must be passed as the
349dnl fourth argument to 'semctl'.
350dnl D*/
351dnl Check for semctl and arguments
352AC_DEFUN([PAC_FUNC_SEMCTL],[
353AC_CHECK_FUNC(semctl)
354if test "$ac_cv_func_semctl" = "yes" ; then
355    AC_CACHE_CHECK([for union semun],
356    pac_cv_type_union_semun,[
357    AC_TRY_COMPILE([#include <sys/types.h>
358#include <sys/ipc.h>
359#include <sys/sem.h>],[union semun arg;arg.val=0;],
360    pac_cv_type_union_semun="yes",pac_cv_type_union_semun="no")])
361    if test "$pac_cv_type_union_semun" = "yes" ; then
362        AC_DEFINE(HAVE_UNION_SEMUN,1,[Has union semun])
363        #
364        # See if we can use an int in semctl or if we need the union
365        AC_CACHE_CHECK([whether semctl needs union semun],
366        pac_cv_func_semctl_needs_semun,[
367        AC_TRY_COMPILE([#include <sys/types.h>
368#include <sys/ipc.h>
369#include <sys/sem.h>],[
370int arg = 0; semctl( 1, 1, SETVAL, arg );],
371        pac_cv_func_semctl_needs_semun="yes",
372        pac_cv_func_semctl_needs_semun="no")
373        ])
374        if test "$pac_cv_func_semctl_needs_semun" = "yes" ; then
375            AC_DEFINE(SEMCTL_NEEDS_SEMUN,1,[Needs an explicit definition of semun])
376        fi
377    fi
378fi
379])
380dnl
381dnl/*D
382dnl PAC_C_VOLATILE - Check if C supports volatile
383dnl
384dnl Synopsis:
385dnl PAC_C_VOLATILE
386dnl
387dnl Output Effect:
388dnl Defines 'volatile' as empty if volatile is not available.
389dnl
390dnl D*/
391AC_DEFUN([PAC_C_VOLATILE],[
392AC_CACHE_CHECK([for volatile],
393pac_cv_c_volatile,[
394AC_TRY_COMPILE(,[volatile int a;],pac_cv_c_volatile="yes",
395pac_cv_c_volatile="no")])
396if test "$pac_cv_c_volatile" = "no" ; then
397    AC_DEFINE(volatile,,[if C does not support volatile])
398fi
399])dnl
400dnl
401dnl/*D
402dnl PAC_C_INLINE - Check if C supports inline
403dnl
404dnl Synopsis:
405dnl PAC_C_INLINE
406dnl
407dnl Output Effect:
408dnl Defines 'inline' as empty if inline is not available.
409dnl
410dnl D*/
411AC_DEFUN([PAC_C_INLINE],[
412AC_CACHE_CHECK([for inline],
413pac_cv_c_inline,[
414AC_TRY_COMPILE([inline int a( int b ){return b+1;}],[int a;],
415pac_cv_c_inline="yes",pac_cv_c_inline="no")])
416if test "$pac_cv_c_inline" = "no" ; then
417    AC_DEFINE(inline,,[if C does not support inline])
418fi
419])dnl
420dnl
421dnl/*D
422dnl PAC_C_CONST - Check if C supports const
423dnl
424dnl Synopsis:
425dnl PAC_C_CONST
426dnl
427dnl Output Effect:
428dnl AC_MSG_ERROR if const is not supported.
429dnl
430dnl D*/
431dnl AC_DEFUN(PAC_C_CONST,[
432dnl AC_CACHE_CHECK([for support of const in C],
433dnl pac_cv_c_const,[
434dnl AC_LANG_PUSH(C)
435dnl AC_TRY_COMPILE(,[const int a = 1; int b; b = a;],
436dnl pac_cv_c_const="yes", pac_cv_c_const="no")])
437dnl if test "$pac_cv_c_const" = "no" ; then
438dnl     AC_MSG_ERROR([C does not support const! Abort...])
439dnl fi
440dnl AC_LANG_POP(C)
441dnl ])dnl
442AC_DEFUN([PAC_C_CONST],
443[AC_CACHE_CHECK([for an ANSI C-conforming const], pac_cv_c_const,
444[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
445[[/* FIXME: Include the comments suggested by Paul. */
446#ifndef __cplusplus
447  /* Ultrix mips cc rejects this.  */
448  typedef int charset[2];
449  const charset cs = {0,0};
450  /* SunOS 4.1.1 cc rejects this.  */
451  char const *const *pcpcc;
452  char **ppc;
453  /* NEC SVR4.0.2 mips cc rejects this.  */
454  struct point {int x, y;};
455  static struct point const zero = {0,0};
456  /* AIX XL C 1.02.0.0 rejects this.
457     It does not let you subtract one const X* pointer from another in
458     an arm of an if-expression whose if-part is not a constant
459     expression */
460  const char *g = "string";
461  pcpcc = &g + (g ? g-g : 0);
462  /* HPUX 7.0 cc rejects these. */
463  ++pcpcc;
464  ppc = (char**) pcpcc;
465  pcpcc = (char const *const *) ppc;
466  { /* SCO 3.2v4 cc rejects this.  */
467    char const *s = 0 ? (char *) 0 : (char const *) 0;
468    if (s) return 0;
469  }
470  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
471    int x[] = {25, 17};
472    const int *foo = &x[0];
473    ++foo;
474  }
475  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
476    typedef const int *iptr;
477    iptr p = 0;
478    ++p;
479  }
480  { /* AIX XL C 1.02.0.0 rejects this saying
481       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
482    struct s { int j; const int *ap[3]; };
483    struct s a;
484    struct s *b = &a;
485    b->j = 5;
486  }
487  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
488    const int foo = 10;
489    if (!foo) return 0;
490  }
491  return !cs[0] && !zero.x;
492#endif
493]])],
494                   [pac_cv_c_const=yes],
495                   [pac_cv_c_const=no])])
496if test $pac_cv_c_const = no; then
497  AC_DEFINE(const,,
498            [Define to empty if `const' does not conform to ANSI C.])
499fi
500])dnl
501dnl
502dnl/*D
503dnl PAC_C_CPP_CONCAT - Check whether the C compiler accepts ISO CPP string
504dnl   concatenation
505dnl
506dnl Synopsis:
507dnl PAC_C_CPP_CONCAT([true-action],[false-action])
508dnl
509dnl Output Effects:
510dnl Invokes the true or false action
511dnl
512dnl D*/
513AC_DEFUN([PAC_C_CPP_CONCAT],[
514pac_pound="#"
515AC_CACHE_CHECK([whether the compiler $CC accepts $ac_pound$ac_pound for concatenation in cpp],
516pac_cv_c_cpp_concat,[
517AC_TRY_COMPILE([
518#define concat(a,b) a##b],[int concat(a,b);return ab;],
519pac_cv_cpp_concat="yes",pac_cv_cpp_concat="no")])
520if test $pac_cv_c_cpp_concat = "yes" ; then
521    ifelse([$1],,:,[$1])
522else
523    ifelse([$2],,:,[$2])
524fi
525])dnl
526dnl
527dnl/*D
528dnl PAC_FUNC_GETTIMEOFDAY - Check whether gettimeofday takes 1 or 2 arguments
529dnl
530dnl Synopsis
531dnl  PAC_IS_GETTIMEOFDAY_OK(ok_action,failure_action)
532dnl
533dnl Notes:
534dnl One version of Solaris accepted only one argument.
535dnl
536dnl D*/
537AC_DEFUN([PAC_FUNC_GETTIMEOFDAY],[
538AC_CACHE_CHECK([whether gettimeofday takes 2 arguments],
539pac_cv_func_gettimeofday,[
540AC_TRY_COMPILE([#include <sys/time.h>],[struct timeval tp;
541gettimeofday(&tp,(void*)0);return 0;],pac_cv_func_gettimeofday="yes",
542pac_cv_func_gettimeofday="no")
543])
544if test "$pac_cv_func_gettimeofday" = "yes" ; then
545     ifelse($1,,:,$1)
546else
547     ifelse($2,,:,$2)
548fi
549])
550dnl
551dnl/*D
552dnl PAC_C_RESTRICT - Check if C supports restrict
553dnl
554dnl Synopsis:
555dnl PAC_C_RESTRICT
556dnl
557dnl Output Effect:
558dnl Defines 'restrict' if some version of restrict is supported; otherwise
559dnl defines 'restrict' as empty.  This allows you to include 'restrict' in
560dnl declarations in the same way that 'AC_C_CONST' allows you to use 'const'
561dnl in declarations even when the C compiler does not support 'const'
562dnl
563dnl Note that some compilers accept restrict only with additional options.
564dnl DEC/Compaq/HP Alpha Unix (Tru64 etc.) -accept restrict_keyword
565dnl
566dnl D*/
567AC_DEFUN([PAC_C_RESTRICT],[
568AC_CACHE_CHECK([for restrict],
569pac_cv_c_restrict,[
570AC_TRY_COMPILE(,[int * restrict a;],pac_cv_c_restrict="restrict",
571pac_cv_c_restrict="no")
572if test "$pac_cv_c_restrict" = "no" ; then
573   AC_TRY_COMPILE(,[int * _Restrict a;],pac_cv_c_restrict="_Restrict",
574   pac_cv_c_restrict="no")
575fi
576if test "$pac_cv_c_restrict" = "no" ; then
577   AC_TRY_COMPILE(,[int * __restrict a;],pac_cv_c_restrict="__restrict",
578   pac_cv_c_restrict="no")
579fi
580])
581if test "$pac_cv_c_restrict" = "no" ; then
582  restrict_val=""
583elif test "$pac_cv_c_restrict" != "restrict" ; then
584  restrict_val=$pac_cv_c_restrict
585fi
586if test "$restrict_val" != "restrict" ; then
587  AC_DEFINE_UNQUOTED(restrict,$restrict_val,[if C does not support restrict])
588fi
589])dnl
590dnl
591dnl/*D
592dnl PAC_HEADER_STDARG - Check whether standard args are defined and whether
593dnl they are old style or new style
594dnl
595dnl Synopsis:
596dnl PAC_HEADER_STDARG(action if works, action if oldstyle, action if fails)
597dnl
598dnl Output Effects:
599dnl Defines HAVE_STDARG_H if the header exists.
600dnl defines
601dnl
602dnl Notes:
603dnl It isn't enough to check for stdarg.  Even gcc doesn't get it right;
604dnl on some systems, the gcc version of stdio.h loads stdarg.h `with the wrong
605dnl options` (causing it to choose the `old style` 'va_start' etc).
606dnl
607dnl The original test tried the two-arg version first; the old-style
608dnl va_start took only a single arg.
609dnl This turns out to be VERY tricky, because some compilers (e.g., Solaris)
610dnl are quite happy to accept the *wrong* number of arguments to a macro!
611dnl Instead, we try to find a clean compile version, using our special
612dnl PAC_C_TRY_COMPILE_CLEAN command.
613dnl
614dnl D*/
615AC_DEFUN([PAC_HEADER_STDARG],[
616AC_CHECK_HEADER(stdarg.h)
617dnl Sets ac_cv_header_stdarg_h
618if test "$ac_cv_header_stdarg_h" = "yes" ; then
619    dnl results are yes,oldstyle,no.
620    AC_CACHE_CHECK([whether stdarg is oldstyle],
621    pac_cv_header_stdarg_oldstyle,[
622PAC_C_TRY_COMPILE_CLEAN([#include <stdio.h>
623#include <stdarg.h>],
624[int func( int a, ... ){
625int b;
626va_list ap;
627va_start( ap );
628b = va_arg(ap, int);
629printf( "%d-%d\n", a, b );
630va_end(ap);
631fflush(stdout);
632return 0;
633}
634int main() { func( 1, 2 ); return 0;}],pac_check_compile)
635case "$pac_check_compile" in
636    0)  pac_cv_header_stdarg_oldstyle="yes"
637        ;;
638    1)  pac_cv_header_stdarg_oldstyle="may be newstyle"
639        ;;
640    2)  pac_cv_header_stdarg_oldstyle="no"   # compile failed
641        ;;
642esac
643])
644if test "$pac_cv_header_stdarg_oldstyle" = "yes" ; then
645    ifelse($2,,:,[$2])
646else
647    AC_CACHE_CHECK([whether stdarg works],
648    pac_cv_header_stdarg_works,[
649    PAC_C_TRY_COMPILE_CLEAN([
650#include <stdio.h>
651#include <stdarg.h>],[
652int func( int a, ... ){
653int b;
654va_list ap;
655va_start( ap, a );
656b = va_arg(ap, int);
657printf( "%d-%d\n", a, b );
658va_end(ap);
659fflush(stdout);
660return 0;
661}
662int main() { func( 1, 2 ); return 0;}],pac_check_compile)
663case "$pac_check_compile" in
664    0)  pac_cv_header_stdarg_works="yes"
665        ;;
666    1)  pac_cv_header_stdarg_works="yes with warnings"
667        ;;
668    2)  pac_cv_header_stdarg_works="no"
669        ;;
670esac
671])
672fi   # test on oldstyle
673if test "$pac_cv_header_stdarg_works" = "no" ; then
674    ifelse($3,,:,[$3])
675else
676    ifelse($1,,:,[$1])
677fi
678else
679    ifelse($3,,:,[$3])
680fi  # test on header
681])
682dnl/*D
683dnl PAC_C_TRY_COMPILE_CLEAN - Try to compile a program, separating success
684dnl with no warnings from success with warnings.
685dnl
686dnl Synopsis:
687dnl PAC_C_TRY_COMPILE_CLEAN(header,program,flagvar)
688dnl
689dnl Output Effect:
690dnl The 'flagvar' is set to 0 (clean), 1 (dirty but success ok), or 2
691dnl (failed).
692dnl
693dnl D*/
694AC_DEFUN([PAC_C_TRY_COMPILE_CLEAN],[
695$3=2
696dnl Get the compiler output to test against
697if test -z "$pac_TRY_COMPLILE_CLEAN" ; then
698    # This is needed for Mac OSX 10.5
699    rm -rf conftest.dSYM
700    rm -f conftest*
701    echo 'int try(void);int try(void){return 0;}' > conftest.c
702    if ${CC-cc} $CFLAGS -c conftest.c >conftest.bas 2>&1 ; then
703        if test -s conftest.bas ; then
704            pac_TRY_COMPILE_CLEAN_OUT=`cat conftest.bas`
705        fi
706        pac_TRY_COMPILE_CLEAN=1
707    else
708        AC_MSG_WARN([Could not compile simple test program!])
709        if test -s conftest.bas ; then  cat conftest.bas >> config.log ; fi
710    fi
711fi
712dnl
713dnl Create the program that we need to test with
714# This is needed for Mac OSX 10.5
715rm -rf conftest.dSYM
716rm -f conftest*
717cat >conftest.c <<EOF
718#include "confdefs.h"
719[$1]
720[$2]
721EOF
722dnl
723dnl Compile it and test
724if ${CC-cc} $CFLAGS -c conftest.c >conftest.bas 2>&1 ; then
725    dnl Success.  Is the output the same?
726    if test "$pac_TRY_COMPILE_CLEAN_OUT" = "`cat conftest.bas`" ; then
727        $3=0
728    else
729        cat conftest.c >>config.log
730        if test -s conftest.bas ; then  cat conftest.bas >> config.log ; fi
731        $3=1
732    fi
733else
734    dnl Failure.  Set flag to 2
735    cat conftest.c >>config.log
736    if test -s conftest.bas ; then cat conftest.bas >> config.log ; fi
737    $3=2
738fi
739# This is needed for Mac OSX 10.5
740rm -rf conftest.dSYM
741rm -f conftest*
742])
743dnl
744dnl/*D
745dnl PAC_PROG_C_UNALIGNED_DOUBLES - Check that the C compiler allows unaligned
746dnl doubles
747dnl
748dnl Synopsis:
749dnl   PAC_PROG_C_UNALIGNED_DOUBLES(action-if-true,action-if-false,
750dnl       action-if-unknown)
751dnl
752dnl Notes:
753dnl 'action-if-unknown' is used in the case of cross-compilation.
754dnl D*/
755AC_DEFUN([PAC_PROG_C_UNALIGNED_DOUBLES],[
756AC_CACHE_CHECK([whether C compiler allows unaligned doubles],
757pac_cv_prog_c_unaligned_doubles,[
758AC_TRY_RUN([
759void fetch_double( v )
760double *v;
761{
762*v = 1.0;
763}
764int main( argc, argv )
765int argc;
766char **argv;
767{
768int p[4];
769double *p_val;
770fetch_double( (double *)&(p[0]) );
771p_val = (double *)&(p[0]);
772if (*p_val != 1.0) return 1;
773fetch_double( (double *)&(p[1]) );
774p_val = (double *)&(p[1]);
775if (*p_val != 1.0) return 1;
776return 0;
777}
778],pac_cv_prog_c_unaligned_doubles="yes",pac_cv_prog_c_unaligned_doubles="no",
779pac_cv_prog_c_unaligned_doubles="unknown")])
780ifelse($1,,,if test "X$pac_cv_prog_c_unaligned_doubles" = "yes" ; then
781$1
782fi)
783ifelse($2,,,if test "X$pac_cv_prog_c_unaligned_doubles" = "no" ; then
784$2
785fi)
786ifelse($3,,,if test "X$pac_cv_prog_c_unaligned_doubles" = "unknown" ; then
787$3
788fi)
789])
790dnl
791dnl/*D
792dnl PAC_PROG_C_WEAK_SYMBOLS - Test whether C supports weak alias symbols.
793dnl
794dnl Synopsis
795dnl PAC_PROG_C_WEAK_SYMBOLS(action-if-true,action-if-false)
796dnl
797dnl Output Effect:
798dnl Defines one of the following if a weak symbol pragma is found:
799dnl.vb
800dnl    HAVE_PRAGMA_WEAK - #pragma weak
801dnl    HAVE_PRAGMA_HP_SEC_DEF - #pragma _HP_SECONDARY_DEF
802dnl    HAVE_PRAGMA_CRI_DUP  - #pragma _CRI duplicate x as y
803dnl.ve
804dnl May also define
805dnl.vb
806dnl    HAVE_WEAK_ATTRIBUTE
807dnl.ve
808dnl if functions can be declared as 'int foo(...) __attribute__ ((weak));'
809dnl sets the shell variable pac_cv_attr_weak to yes.
810dnl Also checks for __attribute__((weak_import)) which is supported by
811dnl Apple in Mac OSX (at least in Darwin).  Note that this provides only
812dnl weak symbols, not weak aliases
813dnl
814dnl D*/
815AC_DEFUN([PAC_PROG_C_WEAK_SYMBOLS],[
816pragma_extra_message=""
817AC_CACHE_CHECK([for type of weak symbol alias support],
818pac_cv_prog_c_weak_symbols,[
819# Test for weak symbol support...
820# We can't put # in the message because it causes autoconf to generate
821# incorrect code
822AC_TRY_LINK([
823extern int PFoo(int);
824#pragma weak PFoo = Foo
825int Foo(int a) { return a; }
826],[return PFoo(1);],has_pragma_weak=yes)
827#
828# Some systems (Linux ia64 and ecc, for example), support weak symbols
829# only within a single object file!  This tests that case.
830# Note that there is an extern int PFoo declaration before the
831# pragma.  Some compilers require this in order to make the weak symbol
832# extenally visible. 
833if test "$has_pragma_weak" = yes ; then
834    # This is needed for Mac OSX 10.5
835    rm -rf conftest.dSYM
836    rm -f conftest*
837    cat >>conftest1.c <<EOF
838extern int PFoo(int);
839#pragma weak PFoo = Foo
840int Foo(int);
841int Foo(int a) { return a; }
842EOF
843    cat >>conftest2.c <<EOF
844extern int PFoo(int);
845int main(int argc, char **argv) {
846return PFoo(0);}
847EOF
848    ac_link2='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest1.c conftest2.c $LIBS >conftest.out 2>&1'
849    if eval $ac_link2 ; then
850        # The gcc 3.4.x compiler accepts the pragma weak, but does not
851        # correctly implement it on systems where the loader doesn't
852        # support weak symbols (e.g., cygwin).  This is a bug in gcc, but it
853        # it is one that *we* have to detect.
854        # This is needed for Mac OSX 10.5
855        rm -rf conftest.dSYM
856        rm -f conftest*
857        cat >>conftest1.c <<EOF
858extern int PFoo(int);
859#pragma weak PFoo = Foo
860int Foo(int);
861int Foo(int a) { return a; }
862EOF
863    cat >>conftest2.c <<EOF
864extern int Foo(int);
865int PFoo(int a) { return a+1;}
866int main(int argc, char **argv) {
867return Foo(0);}
868EOF
869        if eval $ac_link2 ; then
870            pac_cv_prog_c_weak_symbols="pragma weak"
871        else
872            echo "$ac_link2" >> config.log
873            echo "Failed program was" >> config.log
874            cat conftest1.c >>config.log
875            cat conftest2.c >>config.log
876            if test -s conftest.out ; then cat conftest.out >> config.log ; fi
877            has_pragma_weak=0
878            pragma_extra_message="pragma weak accepted but does not work (probably creates two non-weak entries)"
879        fi
880    else
881      echo "$ac_link2" >>config.log
882      echo "Failed program was" >>config.log
883      cat conftest1.c >>config.log
884      cat conftest2.c >>config.log
885      if test -s conftest.out ; then cat conftest.out >> config.log ; fi
886      has_pragma_weak=0
887      pragma_extra_message="pragma weak does not work outside of a file"
888    fi
889    # This is needed for Mac OSX 10.5
890    rm -rf conftest.dSYM
891    rm -f conftest*
892fi
893dnl
894if test -z "$pac_cv_prog_c_weak_symbols" ; then
895    AC_TRY_LINK([
896extern int PFoo(int);
897#pragma _HP_SECONDARY_DEF Foo  PFoo
898int Foo(int a) { return a; }
899],[return PFoo(1);],pac_cv_prog_c_weak_symbols="pragma _HP_SECONDARY_DEF")
900fi
901dnl
902if test -z "$pac_cv_prog_c_weak_symbols" ; then
903    AC_TRY_LINK([
904extern int PFoo(int);
905#pragma _CRI duplicate PFoo as Foo
906int Foo(int a) { return a; }
907],[return PFoo(1);],pac_cv_prog_c_weak_symbols="pragma _CRI duplicate x as y")
908fi
909dnl
910if test -z "$pac_cv_prog_c_weak_symbols" ; then
911    pac_cv_prog_c_weak_symbols="no"
912fi
913dnl
914dnl If there is an extra explanatory message, echo it now so that it
915dnl doesn't interfere with the cache result value
916if test -n "$pragma_extra_message" ; then
917    echo $pragma_extra_message
918fi
919dnl
920])
921if test "$pac_cv_prog_c_weak_symbols" = "no" ; then
922    ifelse([$2],,:,[$2])
923else
924    case "$pac_cv_prog_c_weak_symbols" in
925        "pragma weak") AC_DEFINE(HAVE_PRAGMA_WEAK,1,[Supports weak pragma])
926        ;;
927        "pragma _HP")  AC_DEFINE(HAVE_PRAGMA_HP_SEC_DEF,1,[HP style weak pragma])
928        ;;
929        "pragma _CRI") AC_DEFINE(HAVE_PRAGMA_CRI_DUP,1,[Cray style weak pragma])
930        ;;
931    esac
932    ifelse([$1],,:,[$1])
933fi
934AC_CACHE_CHECK([whether __attribute__ ((weak)) allowed],
935pac_cv_attr_weak,[
936AC_TRY_COMPILE([int foo(int) __attribute__ ((weak));],[int a;],
937pac_cv_attr_weak=yes,pac_cv_attr_weak=no)])
938# Note that being able to compile with weak_import doesn't mean that
939# it works.
940AC_CACHE_CHECK([whether __attribute ((weak_import)) allowed],
941pac_cv_attr_weak_import,[
942AC_TRY_COMPILE([int foo(int) __attribute__ ((weak_import));],[int a;],
943pac_cv_attr_weak_import=yes,pac_cv_attr_weak_import=no)])
944])
945
946#
947# This is a replacement that checks that FAILURES are signaled as well
948# (later configure macros look for the .o file, not just success from the
949# compiler, but they should not HAVE to
950#
951dnl --- insert 2.52 compatibility here ---
952dnl 2.52 does not have AC_PROG_CC_WORKS
953ifdef([AC_PROG_CC_WORKS],,[AC_DEFUN([AC_PROG_CC_WORKS],)])
954dnl
955AC_DEFUN([PAC_PROG_CC_WORKS],
956[AC_PROG_CC_WORKS
957AC_MSG_CHECKING([whether the C compiler sets its return status correctly])
958AC_LANG_SAVE
959AC_LANG_C
960AC_TRY_COMPILE(,[int a = bzzzt;],notbroken=no,notbroken=yes)
961AC_MSG_RESULT($notbroken)
962if test "$notbroken" = "no" ; then
963    AC_MSG_ERROR([installation or configuration problem: C compiler does not
964correctly set error code when a fatal error occurs])
965fi
966])
967dnl
968dnl/*D
969dnl PAC_PROG_C_MULTIPLE_WEAK_SYMBOLS - Test whether C and the
970dnl linker allow multiple weak symbols.
971dnl
972dnl Synopsis
973dnl PAC_PROG_C_MULTIPLE_WEAK_SYMBOLS(action-if-true,action-if-false)
974dnl
975dnl
976dnl D*/
977AC_DEFUN([PAC_PROG_C_MULTIPLE_WEAK_SYMBOLS],[
978AC_CACHE_CHECK([for multiple weak symbol support],
979pac_cv_prog_c_multiple_weak_symbols,[
980# Test for multiple weak symbol support...
981#
982# This is needed for Mac OSX 10.5
983rm -rf conftest.dSYM
984rm -f conftest*
985cat >>conftest1.c <<EOF
986extern int PFoo(int);
987extern int PFoo_(int);
988extern int pfoo_(int);
989#pragma weak PFoo = Foo
990#pragma weak PFoo_ = Foo
991#pragma weak pfoo_ = Foo
992int Foo(int);
993int Foo(a) { return a; }
994EOF
995cat >>conftest2.c <<EOF
996extern int PFoo(int), PFoo_(int), pfoo_(int);
997int main() {
998return PFoo(0) + PFoo_(1) + pfoo_(2);}
999EOF
1000ac_link2='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest1.c conftest2.c $LIBS >conftest.out 2>&1'
1001if eval $ac_link2 ; then
1002    pac_cv_prog_c_multiple_weak_symbols="yes"
1003else
1004    echo "$ac_link2" >>config.log
1005    echo "Failed program was" >>config.log
1006    cat conftest1.c >>config.log
1007    cat conftest2.c >>config.log
1008    if test -s conftest.out ; then cat conftest.out >> config.log ; fi
1009fi
1010# This is needed for Mac OSX 10.5
1011rm -rf conftest.dSYM
1012rm -f conftest*
1013dnl
1014])
1015if test "$pac_cv_prog_c_multiple_weak_symbols" = "yes" ; then
1016    ifelse([$1],,:,[$1])
1017else
1018    ifelse([$2],,:,[$2])
1019fi
1020])
1021dnl
1022dnl/*D
1023dnl PAC_FUNC_CRYPT - Check that the function crypt is defined
1024dnl
1025dnl Synopsis:
1026dnl PAC_FUNC_CRYPT
1027dnl
1028dnl Output Effects:
1029dnl
1030dnl In Solaris, the crypt function is not defined in unistd unless
1031dnl _XOPEN_SOURCE is defines and _XOPEN_VERSION is 4 or greater.
1032dnl We test by looking for a missing crypt by defining our own
1033dnl incompatible one and trying to compile it.
1034dnl Defines NEED_CRYPT_PROTOTYPE if no prototype is found.
1035dnl D*/
1036AC_DEFUN([PAC_FUNC_CRYPT],[
1037AC_CACHE_CHECK([whether crypt defined in unistd.h],
1038pac_cv_func_crypt_defined,[
1039AC_TRY_COMPILE([
1040#include <unistd.h>
1041double crypt(double a){return a;}],[return 0];,
1042pac_cv_func_crypt_defined="no",pac_cv_func_crypt_defined="yes")])
1043if test "$pac_cv_func_crypt_defined" = "no" ; then
1044    # check to see if defining _XOPEN_SOURCE helps
1045    AC_CACHE_CHECK([whether crypt defined in unistd with _XOPEN_SOURCE],
1046pac_cv_func_crypt_xopen,[
1047    AC_TRY_COMPILE([
1048#define _XOPEN_SOURCE   
1049#include <unistd.h>
1050double crypt(double a){return a;}],[return 0];,
1051pac_cv_func_crypt_xopen="no",pac_cv_func_crypt_xopen="yes")])
1052fi
1053if test "$pac_cv_func_crypt_xopen" = "yes" ; then
1054    AC_DEFINE(_XOPEN_SOURCE,1,[if xopen needed for crypt])
1055elif test "$pac_cv_func_crypt_defined" = "no" ; then
1056    AC_DEFINE(NEED_CRYPT_PROTOTYPE,1,[if a prototype for crypt is needed])
1057fi
1058])dnl
1059
1060dnl Use the value of enable-strict to update CFLAGS
1061dnl pac_cc_strict_flags contains the strict flags.
1062dnl
1063dnl -std=c89 is used to select the C89 version of the ANSI/ISO C standard.
1064dnl As of this writing, many C compilers still accepted only this version,
1065dnl not the later C99 version. When all compilers accept C99, this
1066dnl should be changed to the appropriate standard level.  Note that we've
1067dnl had trouble with gcc 2.95.3 accepting -std=c89 but then trying to
1068dnl compile program with a invalid set of options
1069dnl (-D __STRICT_ANSI__-trigraphs)
1070AC_DEFUN([PAC_CC_STRICT],[
1071export enable_strict_done
1072if test "$enable_strict_done" != "yes" ; then
1073
1074    # Some comments on strict warning options.
1075    # These were added to reduce warnings:
1076    #   -Wno-missing-field-initializers  -- We want to allow a struct to be
1077    #       initialized to zero using "struct x y = {0};" and not require
1078    #       each field to be initialized individually.
1079    #   -Wno-type-limits -- There are places where we compare an unsigned to
1080    #       a constant that happens to be zero e.g., if x is unsigned and
1081    #       MIN_VAL is zero, we'd like to do "MPIU_Assert(x >= MIN_VAL);".
1082    #       Note this option is not supported by gcc 4.2.
1083    #   -Wno-unused-parameter -- For portability, some parameters go unused
1084    #       when we have different implementations of functions for
1085    #       different platforms
1086    #   -Wno-unused-label -- We add fn_exit: and fn_fail: on all functions,
1087    #       but fn_fail may not be used if the function doesn't return an
1088    #       error.
1089    #   -Wno-sign-compare -- read() and write() return bytes read/written
1090    #       as a signed value, but we often compare this to size_t (or
1091    #       msg_sz_t) variables.
1092    # These were removed to reduce warnings:
1093    #   -Wcast-qual -- Sometimes we need to cast "volatile char*" to
1094    #       "char*", e.g., for memcpy.
1095    #   -Wpadded -- We catch struct padding with asserts when we need to
1096    #   -Wredundant-decls -- Having redundant declarations is benign and the
1097    #       code already has some.
1098    #   -Wno-format-zero-length -- this warning is irritating and useless, since
1099    #                              a zero-length format string is very well defined
1100
1101    # the embedded newlines in this string are safe because we evaluate each
1102    # argument in the for-loop below and append them to the CFLAGS with a space
1103    # as the separator instead
1104    pac_common_strict_flags="
1105        -O2
1106        -Wall
1107        -Wextra
1108        -Wno-missing-field-initializers
1109        -Wno-type-limits
1110        -Wstrict-prototypes
1111        -Wmissing-prototypes
1112        -DGCC_WALL
1113        -Wno-unused-parameter
1114        -Wno-unused-label
1115        -Wshadow
1116        -Wmissing-declarations
1117        -Wno-long-long
1118        -Wfloat-equal
1119        -Wdeclaration-after-statement
1120        -Wundef
1121        -Wno-endif-labels
1122        -Wpointer-arith
1123        -Wbad-function-cast
1124        -Wcast-align
1125        -Wwrite-strings
1126        -Wno-sign-compare
1127        -Waggregate-return
1128        -Wold-style-definition
1129        -Wmissing-noreturn
1130        -Wno-multichar
1131        -Wno-deprecated-declarations
1132        -Wpacked
1133        -Wnested-externs
1134        -Winvalid-pch
1135        -Wno-pointer-sign
1136        -Wvariadic-macros
1137        -std=c89
1138        -Wno-format-zero-length
1139    "
1140    pac_cc_strict_flags=""
1141    case "$1" in
1142        yes|all|posix)
1143                enable_strict_done="yes"
1144                pac_cc_strict_flags="$pac_common_strict_flags -D_POSIX_C_SOURCE=199506L"
1145        ;;
1146
1147        noposix)
1148                enable_strict_done="yes"
1149                pac_cc_strict_flags="$pac_common_strict_flags"
1150        ;;
1151       
1152        no)
1153                # Accept and ignore this value
1154                :
1155        ;;
1156
1157        *)
1158                if test -n "$1" ; then
1159                   AC_MSG_WARN([Unrecognized value for enable-strict:$1])
1160                fi
1161        ;;
1162
1163    esac
1164
1165    # See if the above options work with the compiler
1166    accepted_flags=""
1167    for flag in $pac_cc_strict_flags ; do
1168        old_CFLAGS=$CFLAGS
1169        CFLAGS="$CFLAGS $accepted_flags $flag"
1170        AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[int a;])],accepted_flags="$accepted_flags $flag",)
1171        CFLAGS="$old_CFLAGS"
1172    done
1173    pac_cc_strict_flags=$accepted_flags
1174fi
1175])
1176
1177dnl/*D
1178dnl PAC_ARG_STRICT - Add --enable-strict to configure. 
1179dnl
1180dnl Synopsis:
1181dnl PAC_ARG_STRICT
1182dnl
1183dnl Output effects:
1184dnl Adds '--enable-strict' to the command line.
1185dnl
1186dnl D*/
1187AC_DEFUN([PAC_ARG_STRICT],[
1188AC_ARG_ENABLE(strict,
1189[--enable-strict  - Turn on strict compilation testing when using gcc])
1190PAC_CC_STRICT($enable_strict)
1191CFLAGS="$CFLAGS $pac_cc_strict_flags"
1192export CFLAGS
1193])
1194
1195dnl/*D
1196dnl PAC_ARG_CC_G - Add debugging flags for the C compiler
1197dnl
1198dnl Synopsis:
1199dnl PAC_ARG_CC_G
1200dnl
1201dnl Output Effect:
1202dnl Adds '-g' to 'COPTIONS' and exports 'COPTIONS'.  Sets and exports the
1203dnl variable 'enable_g_simple' so that subsidiary 'configure's will not
1204dnl add another '-g'.
1205dnl
1206dnl Notes:
1207dnl '--enable-g' should be used for all internal debugging modes if possible.
1208dnl Use the 'enable_val' that 'enable_g' is set to to pass particular values,
1209dnl and ignore any values that are not recognized (some other 'configure'
1210dnl may have used them.  Of course, if you need extra values, you must
1211dnl add code to extract values from 'enable_g'.
1212dnl
1213dnl For example, to look for a particular keyword, you could use
1214dnl.vb
1215dnl SaveIFS="$IFS"
1216dnl IFS=","
1217dnl for key in $enable_g ; do
1218dnl     case $key in
1219dnl         mem) # add code for memory debugging
1220dnl         ;;
1221dnl         *)   # ignore all other values
1222dnl         ;;
1223dnl     esac
1224dnl done
1225dnl IFS="$SaveIFS"
1226dnl.ve
1227dnl
1228dnl D*/
1229AC_DEFUN([PAC_ARG_CC_G],[
1230AC_ARG_ENABLE(g,
1231[--enable-g  - Turn on debugging of the package (typically adds -g to COPTIONS)])
1232export COPTIONS
1233export enable_g_simple
1234if test -n "$enable_g" -a "$enable_g" != "no" -a \
1235   "$enable_g_simple" != "done" ; then
1236    enable_g_simple="done"
1237    if test "$enable_g" = "g" -o "$enable_g" = "yes" ; then
1238        COPTIONS="$COPTIONS -g"
1239    fi
1240fi
1241])
1242dnl
1243dnl Simple version for both options
1244dnl
1245AC_DEFUN([PAC_ARG_CC_COMMON],[
1246PAC_ARG_CC_G
1247PAC_ARG_STRICT
1248])
1249dnl
1250dnl Eventually, this can be used instead of the funky Fortran stuff to
1251dnl access the command line from a C routine.
1252dnl #
1253dnl # Under IRIX (some version) __Argc and __Argv gave the argc,argv values
1254dnl #Under linux, __libc_argv and __libc_argc
1255dnl AC_MSG_CHECKING([for alternative argc,argv names])
1256dnl AC_TRY_LINK([
1257dnl extern int __Argc; extern char **__Argv;],[return __Argc;],
1258dnl alt_argv="__Argv")
1259dnl if test -z "$alt_argv" ; then
1260dnl    AC_TRY_LINK([
1261dnl extern int __libc_argc; extern char **__libc_argv;],[return __lib_argc;],
1262dnl alt_argv="__lib_argv")
1263dnl fi
1264dnl if test -z "$alt_argv" ; then
1265dnl   AC_MSG_RESULT(none found))
1266dnl else
1267dnl   AC_MSG_RESULT($alt_argv)
1268dnl fi
1269dnl
1270dnl
1271dnl Check whether we need -fno-common to correctly compile the source code.
1272dnl This is necessary if global variables are defined without values in
1273dnl gcc.  Here is the test
1274dnl conftest1.c:
1275dnl extern int a; int a;
1276dnl conftest2.c:
1277dnl extern int a; int main(int argc; char *argv[] ){ return a; }
1278dnl Make a library out of conftest1.c and try to link with it.
1279dnl If that fails, recompile it with -fno-common and see if that works.
1280dnl If so, add -fno-common to CFLAGS
1281dnl An alternative is to use, on some systems, ranlib -c to force
1282dnl the system to find common symbols.
1283dnl
1284AC_DEFUN([PAC_PROG_C_BROKEN_COMMON],[
1285AC_CACHE_CHECK([whether global variables handled properly],
1286ac_cv_prog_cc_globals_work,[
1287AC_REQUIRE([AC_PROG_RANLIB])
1288ac_cv_prog_cc_globals_work=no
1289rm -f libconftest.a
1290echo 'extern int a; int a;' > conftest1.c
1291echo 'extern int a; int main( ){ return a; }' > conftest2.c
1292if ${CC-cc} $CFLAGS -c conftest1.c >conftest.out 2>&1 ; then
1293    if ${AR-ar} cr libconftest.a conftest1.o >/dev/null 2>&1 ; then
1294        if ${RANLIB-:} libconftest.a >/dev/null 2>&1 ; then
1295            if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest.a >>conftest.out 2>&1 ; then
1296                # Success!  C works
1297                ac_cv_prog_cc_globals_work=yes
1298            else
1299                echo "Error linking program with uninitialized global" >&AC_FD_CC
1300                echo "Programs were:" >&AC_FD_CC
1301                echo "conftest1.c:" >&AC_FD_CC
1302                cat conftest1.c >&AC_FD_CC
1303                echo "conftest2.c:" >&AC_FD_CC
1304                cat conftest2.c >&AC_FD_CC
1305                echo "and link line was:" >&AC_FD_CC
1306                echo "${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest.a" >&AC_FD_CC
1307                echo "with output:" >&AC_FD_CC
1308                cat conftest.out >&AC_FD_CC
1309
1310                # Failure!  Do we need -fno-common?
1311                ${CC-cc} $CFLAGS -fno-common -c conftest1.c >> conftest.out 2>&1
1312                rm -f libconftest.a
1313                ${AR-ar} cr libconftest.a conftest1.o
1314                ${RANLIB-:} libconftest.a
1315                if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest.a >> conftest.out 2>&1 ; then
1316                    ac_cv_prog_cc_globals_work="needs -fno-common"
1317                    CFLAGS="$CFLAGS -fno-common"
1318                elif test -n "$RANLIB" ; then
1319                    # Try again, with ranlib changed to ranlib -c
1320                    # (send output to /dev/null incase this ranlib
1321                    # doesn't know -c)
1322                    ${RANLIB} -c libconftest.a >/dev/null 2>&1
1323                    if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest.a >> conftest.out 2>&1 ; then
1324                        RANLIB="$RANLIB -c"
1325                    #else
1326                    #   # That didn't work
1327                    #   :
1328                    fi
1329                #else
1330                #    :
1331                fi
1332            fi
1333        fi
1334    fi
1335fi
1336# This is needed for Mac OSX 10.5
1337rm -rf conftest.dSYM
1338rm -f conftest* libconftest*])
1339if test "$ac_cv_prog_cc_globals_work" = no ; then
1340    AC_MSG_WARN([Common symbols not supported on this system!])
1341fi
1342])
1343dnl
1344dnl
1345dnl Return the structure alignment in pac_cv_c_struct_align
1346dnl Possible values include
1347dnl     packed - no padding or alignment, any item may begin on any byte
1348dnl     largest - extent of a structure is a multiple of the largest item;
1349dnl               items are aligned with their size
1350dnl     four - structs padded to a multiple of four
1351dnl     two  - like four, but to a multiple of two
1352dnl     eight - If objects containing 8-byte items are padded to a multiple
1353dnl             of eight
1354dnl     largestor4 - like largest, except that for items of size > 4, align
1355dnl                  on 4-byte boundaries.  E.g., align on the
1356dnl                  min(4,max(size of items)).
1357dnl     largestorword - (should be named largestorqword, with qword meaning
1358dnl                     quad-word): Like largestor4, but with a special case
1359dnl                     for 16-byte items (this is the 16-byte aligned
1360dnl                     quad-word-load special case).
1361dnl
1362dnl In addition, a "Could not determine alignment" and a
1363dnl "Multiple cases:" return is possible. 
1364dnl
1365AC_DEFUN([PAC_C_STRUCT_ALIGNMENT],[
1366AC_CACHE_CHECK([for C struct alignment],pac_cv_c_struct_align,[
1367AC_TRY_RUN([
1368#include <stdio.h>
1369#ifdef DEBUG_STRUCT_ALIGNMENT
1370#define DBG(a,b,c) printf( "type %s, size = %d, extent = %d\n", a, b, c )
1371#define CHECK(cond,flag) if (cond) { flag = 0; \
1372    printf( "Setting %s to false because of %s\n", #flag, #cond ); }
1373#else
1374#define DBG(a,b,c)
1375#define CHECK(cond,flag) if (cond) { flag = 0; }
1376#endif
1377
1378int main( int argc, char *argv[] )
1379{
1380    FILE *cf;
1381    int is_packed  = 1;
1382    int is_two     = 1;
1383    int is_four    = 1;
1384    int is_eight   = 1;
1385    int is_largest = 1;
1386    int is_largestorword = 1;
1387    int is_largestor4 = 1;
1388    int numCases;
1389
1390    /* We've seen PowerPC systems where the alignment may
1391       be largest for some items but not for double + int */
1392    struct { char a; int b; } char_int;
1393    struct { short a; int b; } short_int;
1394    struct { char a; short b; } char_short;
1395    struct { char a; long b; } char_long;
1396    struct { char a; float b; } char_float;
1397    struct { char a; double b; } char_double;
1398    struct { char a; int b; char c; } char_int_char;
1399    struct { char a; short b; char c; } char_short_char;
1400#ifdef HAVE_LONG_DOUBLE
1401    struct { char a; long double b; } char_long_double;
1402#endif
1403    int size, extent;
1404
1405    size = sizeof(char) + sizeof(int);
1406    extent = sizeof(char_int);
1407    if (size != extent) is_packed = 0;
1408    CHECK((extent % sizeof(int)) != 0, is_largest);
1409    CHECK((extent % sizeof(int)) != 0, is_largestor4);
1410    CHECK((extent % sizeof(int)) != 0, is_largestorword);
1411    if ( (extent % 2) != 0) is_two = 0;
1412    if ( (extent % 4) != 0) is_four = 0;
1413    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1414    DBG("char_int",size,extent);
1415
1416    size = sizeof(short) + sizeof(int);
1417    extent = sizeof(short_int);
1418    if (size != extent) is_packed = 0;
1419    CHECK((extent % sizeof(int)) != 0, is_largest);
1420    CHECK((extent % sizeof(int)) != 0, is_largestor4);
1421    CHECK((extent % sizeof(int)) != 0, is_largestorword);
1422    if ( (extent % 2) != 0) is_two = 0;
1423    if ( (size == 6) && (extent == 8) ) is_two = 0;
1424    if ( (extent % 4) != 0) is_four = 0;
1425    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1426    DBG("short_int",size,extent);
1427
1428    size = sizeof(char) + sizeof(short);
1429    extent = sizeof(char_short);
1430    if (size != extent) is_packed = 0;
1431    CHECK((extent % sizeof(short)) != 0,is_largest);
1432    CHECK((extent % sizeof(short)) != 0,is_largestor4);
1433    CHECK((extent % sizeof(short)) != 0,is_largestorword);
1434    if ( (extent % 2) != 0) is_two = 0;
1435    if (sizeof(short) == 4 && (extent % 4) != 0) is_four = 0;
1436    if (sizeof(short) == 8 && (extent % 8) != 0) is_eight = 0;
1437    DBG("char_short",size,extent);
1438
1439    size = sizeof(char) + sizeof(long);
1440    extent = sizeof(char_long);
1441    if (size != extent) is_packed = 0;
1442    CHECK((extent % sizeof(long)) != 0,is_largest);
1443    CHECK((extent % 4) != 0,is_largestor4);
1444    CHECK((extent % sizeof(long)) != 0,is_largestorword);
1445    if ( (extent % 2) != 0) is_two = 0;
1446    if ( (extent % 4) != 0) is_four = 0;
1447    if (sizeof(long) == 8 && (extent % 8) != 0) is_eight = 0;
1448    DBG("char_long",size,extent);
1449
1450    size = sizeof(char) + sizeof(float);
1451    extent = sizeof(char_float);
1452    if (size != extent) is_packed = 0;
1453    CHECK((extent % sizeof(float)) != 0,is_largest);
1454    CHECK((extent % sizeof(float)) != 0,is_largestor4);
1455    CHECK((extent % sizeof(float)) != 0,is_largestorword);
1456    if ( (extent % 2) != 0) is_two = 0;
1457    if ( (extent % 4) != 0) is_four = 0;
1458    if (sizeof(float) == 8 && (extent % 8) != 0) is_eight = 0;
1459    DBG("char_float",size,extent);
1460
1461    size = sizeof(char) + sizeof(double);
1462    extent = sizeof(char_double);
1463    if (size != extent) is_packed = 0;
1464    CHECK((extent % sizeof(double)) != 0,is_largest);
1465    CHECK((extent % 4) != 0,is_largestor4);
1466    CHECK((extent % sizeof(int)) != 0,is_largestorword);
1467    if ( (extent % 2) != 0) is_two = 0;
1468    if ( (extent % 4) != 0) is_four = 0;
1469    if (sizeof(double) == 8 && (extent % 8) != 0) is_eight = 0;
1470    DBG("char_double",size,extent);
1471
1472#ifdef HAVE_LONG_DOUBLE
1473    size = sizeof(char) + sizeof(long double);
1474    extent = sizeof(char_long_double);
1475    if (size != extent) is_packed = 0;
1476    CHECK((extent % sizeof(long double)) != 0,is_largest);
1477    CHECK((extent % 4) != 0,is_largestor4);
1478    CHECK((extent % 16) == 0,is_largestor4);
1479    CHECK((extent % sizeof(long double)) != 0,is_largestorword);
1480    /* This case only applies to largestorword if long doubles are 16 bytes */
1481    if (sizeof(long double) != 16) is_largestorword = 0;
1482    if ( (extent % 2) != 0) is_two = 0;
1483    if ( (extent % 4) != 0) is_four = 0;
1484    if (sizeof(long double) >= 8 && (extent % 8) != 0) is_eight = 0;
1485    DBG("char_long-double",size,extent);
1486#else
1487    /* The special case of largestorword only applies if long double
1488       available */
1489    is_largestorword=0;
1490#endif
1491
1492    /* char int char helps separate largest from 4/8 aligned */
1493    size = sizeof(char) + sizeof(int) + sizeof(char);
1494    extent = sizeof(char_int_char);
1495    if (size != extent) is_packed = 0;
1496    CHECK((extent % sizeof(int)) != 0,is_largest);
1497    CHECK((extent % sizeof(int)) != 0,is_largestor4);
1498    CHECK((extent % sizeof(int)) != 0,is_largestorword);
1499    if ( (extent % 2) != 0) is_two = 0;
1500    if ( (extent % 4) != 0) is_four = 0;
1501    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1502    DBG("char_int_char",size,extent);
1503
1504    /* char short char helps separate largest from 4/8 aligned */
1505    size = sizeof(char) + sizeof(short) + sizeof(char);
1506    extent = sizeof(char_short_char);
1507    if (size != extent) is_packed = 0;
1508    CHECK((extent % sizeof(short)) != 0,is_largest);
1509    CHECK((extent % sizeof(short)) != 0,is_largestor4);
1510    CHECK((extent % sizeof(short)) != 0,is_largestorword);
1511    if ( (extent % 2) != 0) is_two = 0;
1512    if (sizeof(short) == 4 && (extent % 4) != 0) is_four = 0;
1513    CHECK((extent == 6) && (size == 4),is_four);
1514    if (sizeof(short) == 8 && (extent % 8) != 0) is_eight = 0;
1515    DBG("char_short_char",size,extent);
1516
1517    /* If aligned mod 8, it will be aligned mod 4 */
1518    if (is_eight) { is_four = 0; is_two = 0; }
1519
1520    if (is_four) is_two = 0;
1521
1522    /* largest superceeds eight */
1523    if (is_largest) is_eight = 0;
1524
1525    /* Tabulate the results */
1526    cf = fopen( "ctest.out", "w" );
1527    numCases = is_packed + is_largest + is_largestorword + is_largestor4 +
1528        is_two + is_four + is_eight;
1529    if (numCases == 0) {
1530        fprintf( cf, "Could not determine alignment\n" );
1531    }
1532    else {
1533        if (numCases != 1) {
1534            fprintf( cf, "Multiple cases:\n" );
1535        }
1536        if (is_packed) fprintf( cf, "packed\n" );
1537        if (is_largest) fprintf( cf, "largest\n" );
1538        if (is_largestorword) fprintf( cf, "largestorword\n" );
1539        if (is_largestor4) fprintf( cf, "largestor4\n" );
1540        if (is_two) fprintf( cf, "two\n" );
1541        if (is_four) fprintf( cf, "four\n" );
1542        if (is_eight) fprintf( cf, "eight\n" );
1543    }
1544    fclose( cf );
1545    return 0;
1546}],
1547pac_cv_c_struct_align=`cat ctest.out`
1548,pac_cv_c_struct_align="unknown",pac_cv_c_struct_align="$CROSS_ALIGN_STRUCT")
1549rm -f ctest.out
1550])
1551if test -z "$pac_cv_c_struct_align" ; then
1552    pac_cv_c_struct_align="unknown"
1553fi
1554])
1555dnl
1556dnl
1557dnl Return the integer structure alignment in pac_cv_c_max_integer_align
1558dnl Possible values include
1559dnl     packed
1560dnl     two
1561dnl     four
1562dnl     eight
1563dnl
1564dnl In addition, a "Could not determine alignment" and a "error!"
1565dnl return is possible. 
1566AC_DEFUN([PAC_C_MAX_INTEGER_ALIGN],[
1567AC_CACHE_CHECK([for max C struct integer alignment],
1568pac_cv_c_max_integer_align,[
1569AC_TRY_RUN([
1570#include <stdio.h>
1571#define DBG(a,b,c)
1572int main( int argc, char *argv[] )
1573{
1574    FILE *cf;
1575    int is_packed  = 1;
1576    int is_two     = 1;
1577    int is_four    = 1;
1578    int is_eight   = 1;
1579    struct { char a; int b; } char_int;
1580    struct { char a; short b; } char_short;
1581    struct { char a; long b; } char_long;
1582    struct { char a; int b; char c; } char_int_char;
1583    struct { char a; short b; char c; } char_short_char;
1584#ifdef HAVE_LONG_LONG_INT
1585    struct { long long int a; char b; } lli_c;
1586    struct { char a; long long int b; } c_lli;
1587#endif
1588    int size, extent, extent2;
1589
1590    /* assume max integer alignment isn't 8 if we don't have
1591     * an eight-byte value :)
1592     */
1593#ifdef HAVE_LONG_LONG_INT
1594    if (sizeof(int) < 8 && sizeof(long) < 8 && sizeof(long long int) < 8)
1595        is_eight = 0;
1596#else
1597    if (sizeof(int) < 8 && sizeof(long) < 8) is_eight = 0;
1598#endif
1599
1600    size = sizeof(char) + sizeof(int);
1601    extent = sizeof(char_int);
1602    if (size != extent) is_packed = 0;
1603    if ( (extent % 2) != 0) is_two = 0;
1604    if ( (extent % 4) != 0) is_four = 0;
1605    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1606    DBG("char_int",size,extent);
1607
1608    size = sizeof(char) + sizeof(short);
1609    extent = sizeof(char_short);
1610    if (size != extent) is_packed = 0;
1611    if ( (extent % 2) != 0) is_two = 0;
1612    if (sizeof(short) == 4 && (extent % 4) != 0) is_four = 0;
1613    if (sizeof(short) == 8 && (extent % 8) != 0) is_eight = 0;
1614    DBG("char_short",size,extent);
1615
1616    size = sizeof(char) + sizeof(long);
1617    extent = sizeof(char_long);
1618    if (size != extent) is_packed = 0;
1619    if ( (extent % 2) != 0) is_two = 0;
1620    if ( (extent % 4) != 0) is_four = 0;
1621    if (sizeof(long) == 8 && (extent % 8) != 0) is_eight = 0;
1622    DBG("char_long",size,extent);
1623
1624#ifdef HAVE_LONG_LONG_INT
1625    size = sizeof(char) + sizeof(long long int);
1626    extent = sizeof(lli_c);
1627    extent2 = sizeof(c_lli);
1628    if (size != extent) is_packed = 0;
1629    if ( (extent % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1630    if ( (extent % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1631    if (sizeof(long long int) >= 8 && (extent % 8) != 0 && (extent2 % 8) != 0)
1632        is_eight = 0;
1633#endif
1634
1635    size = sizeof(char) + sizeof(int) + sizeof(char);
1636    extent = sizeof(char_int_char);
1637    if (size != extent) is_packed = 0;
1638    if ( (extent % 2) != 0) is_two = 0;
1639    if ( (extent % 4) != 0) is_four = 0;
1640    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1641    DBG("char_int_char",size,extent);
1642
1643    size = sizeof(char) + sizeof(short) + sizeof(char);
1644    extent = sizeof(char_short_char);
1645    if (size != extent) is_packed = 0;
1646    if ( (extent % 2) != 0) is_two = 0;
1647    if (sizeof(short) == 4 && (extent % 4) != 0) is_four = 0;
1648    if (sizeof(short) == 8 && (extent % 8) != 0) is_eight = 0;
1649    DBG("char_short_char",size,extent);
1650
1651    /* If aligned mod 8, it will be aligned mod 4 */
1652    if (is_eight) { is_four = 0; is_two = 0; }
1653
1654    if (is_four) is_two = 0;
1655
1656    /* Tabulate the results */
1657    cf = fopen( "ctest.out", "w" );
1658    if (is_packed + is_two + is_four + is_eight == 0) {
1659        fprintf( cf, "Could not determine alignment\n" );
1660    }
1661    else {
1662        if (is_packed + is_two + is_four + is_eight != 1) {
1663            fprintf( cf, "error!\n" );
1664        }
1665        else {
1666            if (is_packed) fprintf( cf, "packed\n" );
1667            if (is_two) fprintf( cf, "two\n" );
1668            if (is_four) fprintf( cf, "four\n" );
1669            if (is_eight) fprintf( cf, "eight\n" );
1670        }
1671    }
1672    fclose( cf );
1673    return 0;
1674}],
1675pac_cv_c_max_integer_align=`cat ctest.out`,
1676pac_cv_c_max_integer_align="unknown",
1677pac_cv_c_max_integer_align="$CROSS_ALIGN_STRUCT_INT")
1678rm -f ctest.out
1679])
1680if test -z "$pac_cv_c_max_integer_align" ; then
1681    pac_cv_c_max_integer_align="unknown"
1682fi
1683])
1684dnl
1685dnl
1686dnl Return the floating point structure alignment in
1687dnl pac_cv_c_max_fp_align.
1688dnl
1689dnl Possible values include:
1690dnl     packed
1691dnl     two
1692dnl     four
1693dnl     eight
1694dnl     sixteen
1695dnl
1696dnl In addition, a "Could not determine alignment" and a "error!"
1697dnl return is possible. 
1698AC_DEFUN([PAC_C_MAX_FP_ALIGN],[
1699AC_CACHE_CHECK([for max C struct floating point alignment],
1700pac_cv_c_max_fp_align,[
1701AC_TRY_RUN([
1702#include <stdio.h>
1703#define DBG(a,b,c)
1704int main( int argc, char *argv[] )
1705{
1706    FILE *cf;
1707    int is_packed  = 1;
1708    int is_two     = 1;
1709    int is_four    = 1;
1710    int is_eight   = 1;
1711    int is_sixteen = 1;
1712    struct { char a; float b; } char_float;
1713    struct { float b; char a; } float_char;
1714    struct { char a; double b; } char_double;
1715    struct { double b; char a; } double_char;
1716#ifdef HAVE_LONG_DOUBLE
1717    struct { char a; long double b; } char_long_double;
1718    struct { long double b; char a; } long_double_char;
1719    struct { long double a; int b; char c; } long_double_int_char;
1720#endif
1721    int size, extent1, extent2;
1722
1723    size = sizeof(char) + sizeof(float);
1724    extent1 = sizeof(char_float);
1725    extent2 = sizeof(float_char);
1726    if (size != extent1) is_packed = 0;
1727    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1728    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1729    if (sizeof(float) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1730        is_eight = 0;
1731    DBG("char_float",size,extent1);
1732
1733    size = sizeof(char) + sizeof(double);
1734    extent1 = sizeof(char_double);
1735    extent2 = sizeof(double_char);
1736    if (size != extent1) is_packed = 0;
1737    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1738    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1739    if (sizeof(double) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1740        is_eight = 0;
1741    DBG("char_double",size,extent1);
1742
1743#ifdef HAVE_LONG_DOUBLE
1744    size = sizeof(char) + sizeof(long double);
1745    extent1 = sizeof(char_long_double);
1746    extent2 = sizeof(long_double_char);
1747    if (size != extent1) is_packed = 0;
1748    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1749    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1750    if (sizeof(long double) >= 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1751        is_eight = 0;
1752    if (sizeof(long double) > 8 && (extent1 % 16) != 0
1753        && (extent2 % 16) != 0) is_sixteen = 0;
1754    DBG("char_long-double",size,extent1);
1755
1756    extent1 = sizeof(long_double_int_char);
1757    if ( (extent1 % 2) != 0) is_two = 0;
1758    if ( (extent1 % 4) != 0) is_four = 0;
1759    if (sizeof(long double) >= 8 && (extent1 % 8) != 0) is_eight = 0;
1760    if (sizeof(long double) > 8 && (extent1 % 16) != 0) is_sixteen = 0;
1761#else
1762    is_sixteen = 0;
1763#endif
1764
1765    if (is_sixteen) { is_eight = 0; is_four = 0; is_two = 0; }
1766
1767    if (is_eight) { is_four = 0; is_two = 0; }
1768
1769    if (is_four) is_two = 0;
1770
1771    /* Tabulate the results */
1772    cf = fopen( "ctest.out", "w" );
1773    if (is_packed + is_two + is_four + is_eight + is_sixteen == 0) {
1774        fprintf( cf, "Could not determine alignment\n" );
1775    }
1776    else {
1777        if (is_packed + is_two + is_four + is_eight + is_sixteen != 1) {
1778            fprintf( cf, "error!\n" );
1779        }
1780        else {
1781            if (is_packed) fprintf( cf, "packed\n" );
1782            if (is_two) fprintf( cf, "two\n" );
1783            if (is_four) fprintf( cf, "four\n" );
1784            if (is_eight) fprintf( cf, "eight\n" );
1785            if (is_sixteen) fprintf( cf, "sixteen\n" );
1786        }
1787    }
1788    fclose( cf );
1789    return 0;
1790}],
1791pac_cv_c_max_fp_align=`cat ctest.out`,
1792pac_cv_c_max_fp_align="unknown",
1793pac_cv_c_max_fp_align="$CROSS_ALIGN_STRUCT_FP")
1794rm -f ctest.out
1795])
1796if test -z "$pac_cv_c_max_fp_align" ; then
1797    pac_cv_c_max_fp_align="unknown"
1798fi
1799])
1800dnl
1801dnl
1802dnl Return the floating point structure alignment in
1803dnl pac_cv_c_max_double_fp_align.
1804dnl
1805dnl Possible values include:
1806dnl     packed
1807dnl     two
1808dnl     four
1809dnl     eight
1810dnl
1811dnl In addition, a "Could not determine alignment" and a "error!"
1812dnl return is possible. 
1813AC_DEFUN([PAC_C_MAX_DOUBLE_FP_ALIGN],[
1814AC_CACHE_CHECK([for max C struct alignment of structs with doubles],
1815pac_cv_c_max_double_fp_align,[
1816AC_TRY_RUN([
1817#include <stdio.h>
1818#define DBG(a,b,c)
1819int main( int argc, char *argv[] )
1820{
1821    FILE *cf;
1822    int is_packed  = 1;
1823    int is_two     = 1;
1824    int is_four    = 1;
1825    int is_eight   = 1;
1826    struct { char a; float b; } char_float;
1827    struct { float b; char a; } float_char;
1828    struct { char a; double b; } char_double;
1829    struct { double b; char a; } double_char;
1830    int size, extent1, extent2;
1831
1832    size = sizeof(char) + sizeof(float);
1833    extent1 = sizeof(char_float);
1834    extent2 = sizeof(float_char);
1835    if (size != extent1) is_packed = 0;
1836    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1837    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1838    if (sizeof(float) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1839        is_eight = 0;
1840    DBG("char_float",size,extent1);
1841
1842    size = sizeof(char) + sizeof(double);
1843    extent1 = sizeof(char_double);
1844    extent2 = sizeof(double_char);
1845    if (size != extent1) is_packed = 0;
1846    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1847    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1848    if (sizeof(double) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1849        is_eight = 0;
1850    DBG("char_double",size,extent1);
1851
1852    if (is_eight) { is_four = 0; is_two = 0; }
1853
1854    if (is_four) is_two = 0;
1855
1856    /* Tabulate the results */
1857    cf = fopen( "ctest.out", "w" );
1858    if (is_packed + is_two + is_four + is_eight == 0) {
1859        fprintf( cf, "Could not determine alignment\n" );
1860    }
1861    else {
1862        if (is_packed + is_two + is_four + is_eight != 1) {
1863            fprintf( cf, "error!\n" );
1864        }
1865        else {
1866            if (is_packed) fprintf( cf, "packed\n" );
1867            if (is_two) fprintf( cf, "two\n" );
1868            if (is_four) fprintf( cf, "four\n" );
1869            if (is_eight) fprintf( cf, "eight\n" );
1870        }
1871    }
1872    fclose( cf );
1873    return 0;
1874}],
1875pac_cv_c_max_double_fp_align=`cat ctest.out`,
1876pac_cv_c_max_double_fp_align="unknown",
1877pac_cv_c_max_double_fp_align="$CROSS_ALIGN_STRUCT_DOUBLE_FP")
1878rm -f ctest.out
1879])
1880if test -z "$pac_cv_c_max_double_fp_align" ; then
1881    pac_cv_c_max_double_fp_align="unknown"
1882fi
1883])
1884AC_DEFUN([PAC_C_MAX_LONGDOUBLE_FP_ALIGN],[
1885AC_CACHE_CHECK([for max C struct floating point alignment with long doubles],
1886pac_cv_c_max_longdouble_fp_align,[
1887AC_TRY_RUN([
1888#include <stdio.h>
1889#define DBG(a,b,c)
1890int main( int argc, char *argv[] )
1891{
1892    FILE *cf;
1893    int is_packed  = 1;
1894    int is_two     = 1;
1895    int is_four    = 1;
1896    int is_eight   = 1;
1897    int is_sixteen = 1;
1898    struct { char a; long double b; } char_long_double;
1899    struct { long double b; char a; } long_double_char;
1900    struct { long double a; int b; char c; } long_double_int_char;
1901    int size, extent1, extent2;
1902
1903    size = sizeof(char) + sizeof(long double);
1904    extent1 = sizeof(char_long_double);
1905    extent2 = sizeof(long_double_char);
1906    if (size != extent1) is_packed = 0;
1907    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1908    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1909    if (sizeof(long double) >= 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1910        is_eight = 0;
1911    if (sizeof(long double) > 8 && (extent1 % 16) != 0
1912        && (extent2 % 16) != 0) is_sixteen = 0;
1913    DBG("char_long-double",size,extent1);
1914
1915    extent1 = sizeof(long_double_int_char);
1916    if ( (extent1 % 2) != 0) is_two = 0;
1917    if ( (extent1 % 4) != 0) is_four = 0;
1918    if (sizeof(long double) >= 8 && (extent1 % 8) != 0) is_eight = 0;
1919    if (sizeof(long double) > 8 && (extent1 % 16) != 0) is_sixteen = 0;
1920
1921    if (is_sixteen) { is_eight = 0; is_four = 0; is_two = 0; }
1922
1923    if (is_eight) { is_four = 0; is_two = 0; }
1924
1925    if (is_four) is_two = 0;
1926
1927    /* Tabulate the results */
1928    cf = fopen( "ctest.out", "w" );
1929    if (is_packed + is_two + is_four + is_eight + is_sixteen == 0) {
1930        fprintf( cf, "Could not determine alignment\n" );
1931    }
1932    else {
1933        if (is_packed + is_two + is_four + is_eight + is_sixteen != 1) {
1934            fprintf( cf, "error!\n" );
1935        }
1936        else {
1937            if (is_packed) fprintf( cf, "packed\n" );
1938            if (is_two) fprintf( cf, "two\n" );
1939            if (is_four) fprintf( cf, "four\n" );
1940            if (is_eight) fprintf( cf, "eight\n" );
1941            if (is_sixteen) fprintf( cf, "sixteen\n" );
1942        }
1943    }
1944    fclose( cf );
1945    return 0;
1946}],
1947pac_cv_c_max_longdouble_fp_align=`cat ctest.out`,
1948pac_cv_c_max_longdouble_fp_align="unknown",
1949pac_cv_c_max_longdouble_fp_align="$CROSS_ALIGN_STRUCT_LONGDOUBLE_FP")
1950rm -f ctest.out
1951])
1952if test -z "$pac_cv_c_max_longdouble_fp_align" ; then
1953    pac_cv_c_max_longdouble_fp_align="unknown"
1954fi
1955])
1956dnl
1957dnl Other tests assume that there is potentially a maximum alignment
1958dnl and that if there is no maximum alignment, or a type is smaller than
1959dnl that value, then we align on the size of the value, with the exception
1960dnl of the "position-based alignment" rules we test for separately.
1961dnl
1962dnl It turns out that these assumptions have fallen short in at least one
1963dnl case, on MacBook Pros, where doubles are aligned on 4-byte boundaries
1964dnl even when long doubles are aligned on 16-byte boundaries. So this test
1965dnl is here specifically to handle this case.
1966dnl
1967dnl Puts result in pac_cv_c_double_alignment_exception.
1968dnl
1969dnl Possible values currently include no and four.
1970dnl
1971AC_DEFUN([PAC_C_DOUBLE_ALIGNMENT_EXCEPTION],[
1972AC_CACHE_CHECK([if double alignment breaks rules, find actual alignment],
1973pac_cv_c_double_alignment_exception,[
1974AC_TRY_RUN([
1975#include <stdio.h>
1976#define DBG(a,b,c)
1977int main( int argc, char *argv[] )
1978{
1979    FILE *cf;
1980    struct { char a; double b; } char_double;
1981    struct { double b; char a; } double_char;
1982    int extent1, extent2, align_4 = 0;
1983
1984    extent1 = sizeof(char_double);
1985    extent2 = sizeof(double_char);
1986
1987    /* we're interested in the largest value, will let separate test
1988     * deal with position-based issues.
1989     */
1990    if (extent1 < extent2) extent1 = extent2;
1991    if ((sizeof(double) == 8) && (extent1 % 8) != 0) {
1992       if (extent1 % 4 == 0) {
1993#ifdef HAVE_MAX_FP_ALIGNMENT
1994          if (HAVE_MAX_FP_ALIGNMENT >= 8) align_4 = 1;
1995#else
1996          align_4 = 1;
1997#endif
1998       }
1999    }
2000
2001    cf = fopen( "ctest.out", "w" );
2002
2003    if (align_4) fprintf( cf, "four\n" );
2004    else fprintf( cf, "no\n" );
2005
2006    fclose( cf );
2007    return 0;
2008}],
2009pac_cv_c_double_alignment_exception=`cat ctest.out`,
2010pac_cv_c_double_alignment_exception="unknown",
2011pac_cv_c_double_alignment_exception="$CROSS_ALIGN_DOUBLE_EXCEPTION")
2012rm -f ctest.out
2013])
2014if test -z "$pac_cv_c_double_alignment_exception" ; then
2015    pac_cv_c_double_alignment_exception="unknown"
2016fi
2017])
2018dnl
2019dnl
2020dnl Test for odd struct alignment rule that only applies max.
2021dnl padding when double value is at front of type.
2022dnl Puts result in pac_cv_c_double_pos_align.
2023dnl
2024dnl Search for "Power alignment mode" for more details.
2025dnl
2026dnl Possible values include yes, no, and unknown.
2027dnl
2028AC_DEFUN([PAC_C_DOUBLE_POS_ALIGN],[
2029AC_CACHE_CHECK([if alignment of structs with doubles is based on position],
2030pac_cv_c_double_pos_align,[
2031AC_TRY_RUN([
2032#include <stdio.h>
2033#define DBG(a,b,c)
2034int main( int argc, char *argv[] )
2035{
2036    FILE *cf;
2037    int padding_varies_by_pos = 0;
2038    struct { char a; double b; } char_double;
2039    struct { double b; char a; } double_char;
2040    int extent1, extent2;
2041
2042    extent1 = sizeof(char_double);
2043    extent2 = sizeof(double_char);
2044    if (extent1 != extent2) padding_varies_by_pos = 1;
2045
2046    cf = fopen( "ctest.out", "w" );
2047    if (padding_varies_by_pos) fprintf( cf, "yes\n" );
2048    else fprintf( cf, "no\n" );
2049
2050    fclose( cf );
2051    return 0;
2052}],
2053pac_cv_c_double_pos_align=`cat ctest.out`,
2054pac_cv_c_double_pos_align="unknown",
2055pac_cv_c_double_pos_align="$CROSS_ALIGN_DOUBLE_POS")
2056rm -f ctest.out
2057])
2058if test -z "$pac_cv_c_double_pos_align" ; then
2059    pac_cv_c_double_pos_align="unknown"
2060fi
2061])
2062dnl
2063dnl
2064dnl Test for odd struct alignment rule that only applies max.
2065dnl padding when long long int value is at front of type.
2066dnl Puts result in pac_cv_c_llint_pos_align.
2067dnl
2068dnl Search for "Power alignment mode" for more details.
2069dnl
2070dnl Possible values include yes, no, and unknown.
2071dnl
2072AC_DEFUN([PAC_C_LLINT_POS_ALIGN],[
2073AC_CACHE_CHECK([if alignment of structs with long long ints is based on position],
2074pac_cv_c_llint_pos_align,[
2075AC_TRY_RUN([
2076#include <stdio.h>
2077#define DBG(a,b,c)
2078int main( int argc, char *argv[] )
2079{
2080    FILE *cf;
2081    int padding_varies_by_pos = 0;
2082#ifdef HAVE_LONG_LONG_INT
2083    struct { char a; long long int b; } char_llint;
2084    struct { long long int b; char a; } llint_char;
2085    int extent1, extent2;
2086
2087    extent1 = sizeof(char_llint);
2088    extent2 = sizeof(llint_char);
2089    if (extent1 != extent2) padding_varies_by_pos = 1;
2090#endif
2091
2092    cf = fopen( "ctest.out", "w" );
2093    if (padding_varies_by_pos) fprintf( cf, "yes\n" );
2094    else fprintf( cf, "no\n" );
2095
2096    fclose( cf );
2097    return 0;
2098}],
2099pac_cv_c_llint_pos_align=`cat ctest.out`,
2100pac_cv_c_llint_pos_align="unknown",
2101pac_cv_c_llint_pos_align="$CROSS_ALIGN_LLINT_POS")
2102rm -f ctest.out
2103])
2104if test -z "$pac_cv_c_llint_pos_align" ; then
2105    pac_cv_c_llint_pos_align="unknown"
2106fi
2107])
2108
2109dnl
2110dnl
2111dnl/*D
2112dnl PAC_FUNC_NEEDS_DECL - Set NEEDS_<funcname>_DECL if a declaration is needed
2113dnl
2114dnl Synopsis:
2115dnl PAC_FUNC_NEEDS_DECL(headerfiles,funcname)
2116dnl
2117dnl Output Effect:
2118dnl Sets 'NEEDS_<funcname>_DECL' if 'funcname' is not declared by the
2119dnl headerfiles.
2120dnl
2121dnl Approach:
2122dnl Try to compile a program with the function, but passed with an incorrect
2123dnl calling sequence.  If the compilation fails, then the declaration
2124dnl is provided within the header files.  If the compilation succeeds,
2125dnl the declaration is required.
2126dnl
2127dnl We use a 'double' as the first argument to try and catch varargs
2128dnl routines that may use an int or pointer as the first argument.
2129dnl
2130dnl There is one difficulty - if the compiler has been instructed to
2131dnl fail on implicitly defined functions, then this test will always
2132dnl fail.
2133dnl
2134dnl D*/
2135AC_DEFUN([PAC_FUNC_NEEDS_DECL],[
2136AC_CACHE_CHECK([whether $2 needs a declaration],
2137pac_cv_func_decl_$2,[
2138AC_TRY_COMPILE([$1
2139int $2(double, int, double, const char *);],[int a=$2(1.0,27,1.0,"foo");],
2140pac_cv_func_decl_$2=yes,pac_cv_func_decl_$2=no)])
2141if test "$pac_cv_func_decl_$2" = "yes" ; then
2142changequote(<<,>>)dnl
2143define(<<PAC_FUNC_NAME>>, translit(NEEDS_$2_DECL, [a-z *], [A-Z__]))dnl
2144changequote([, ])dnl
2145    AC_DEFINE_UNQUOTED(PAC_FUNC_NAME,1,[Define if $2 needs a declaration])
2146undefine([PAC_FUNC_NAME])
2147fi
2148])dnl
2149dnl
2150dnl /*D
2151dnl PAC_CHECK_SIZEOF_DERIVED - Get the size of a user-defined type,
2152dnl such as a struct
2153dnl
2154dnl PAC_CHECK_SIZEOF_DERIVED(shortname,definition,defaultsize)
2155dnl Like AC_CHECK_SIZEOF, but handles arbitrary types.
2156dnl Unlike AC_CHECK_SIZEOF, does not define SIZEOF_xxx (because
2157dnl autoheader can''t handle this case)
2158dnl D*/
2159AC_DEFUN([PAC_CHECK_SIZEOF_DERIVED],[
2160changequote(<<,>>)dnl
2161define(<<AC_TYPE_NAME>>,translit(sizeof_$1,[a-z *], [A-Z_P]))dnl
2162define(<<AC_CV_NAME>>,translit(pac_cv_sizeof_$1,[ *], [_p]))dnl
2163changequote([,])dnl
2164rm -f conftestval
2165AC_MSG_CHECKING([for size of $1])
2166AC_CACHE_VAL(AC_CV_NAME,
2167[AC_TRY_RUN([#include <stdio.h>
2168main()
2169{
2170  $2 a;
2171  FILE *f=fopen("conftestval", "w");
2172  if (!f) exit(1);
2173  fprintf(f, "%d\n", sizeof(a));
2174  exit(0);
2175}],AC_CV_NAME=`cat conftestval`,AC_CV_NAME=0,ifelse([$3],,,AC_CV_NAME=$3))])
2176AC_MSG_RESULT($AC_CV_NAME)
2177dnl AC_DEFINE_UNQUOTED(AC_TYPE_NAME,$AC_CV_NAME)
2178undefine([AC_TYPE_NAME])undefine([AC_CV_NAME])
2179])
2180dnl
2181dnl /*D
2182dnl PAC_CHECK_SIZEOF_2TYPES - Get the size of a pair of types
2183dnl
2184dnl PAC_CHECK_SIZEOF_2TYPES(shortname,type1,type2,defaultsize)
2185dnl Like AC_CHECK_SIZEOF, but handles pairs of types.
2186dnl Unlike AC_CHECK_SIZEOF, does not define SIZEOF_xxx (because
2187dnl autoheader can''t handle this case)
2188dnl D*/
2189AC_DEFUN([PAC_CHECK_SIZEOF_2TYPES],[
2190changequote(<<,>>)dnl
2191define(<<AC_TYPE_NAME>>,translit(sizeof_$1,[a-z *], [A-Z_P]))dnl
2192define(<<AC_CV_NAME>>,translit(pac_cv_sizeof_$1,[ *], [_p]))dnl
2193changequote([,])dnl
2194rm -f conftestval
2195AC_MSG_CHECKING([for size of $1])
2196AC_CACHE_VAL(AC_CV_NAME,
2197[AC_TRY_RUN([#include <stdio.h>
2198main()
2199{
2200  $2 a;
2201  $3 b;
2202  FILE *f=fopen("conftestval", "w");
2203  if (!f) return 1; /* avoid exit */
2204  fprintf(f, "%d\n", (int)(sizeof(a) + sizeof(b)));
2205  return 0;
2206}],AC_CV_NAME=`cat conftestval`,AC_CV_NAME=0,ifelse([$4],,,AC_CV_NAME=$4))])
2207if test "X$AC_CV_NAME" = "X" ; then
2208    # We have a problem.  The test returned a zero status, but no output,
2209    # or we're cross-compiling (or think we are) and have no value for
2210    # this object
2211    :
2212fi
2213rm -f conftestval
2214AC_MSG_RESULT($AC_CV_NAME)
2215dnl AC_DEFINE_UNQUOTED(AC_TYPE_NAME,$AC_CV_NAME)
2216undefine([AC_TYPE_NAME])undefine([AC_CV_NAME])
2217])
2218
2219dnl
2220dnl PAC_C_GNU_ATTRIBUTE - See if the GCC __attribute__ specifier is allow.
2221dnl Use the following
2222dnl #ifndef HAVE_GCC_ATTRIBUTE
2223dnl #define __attribute__(a)
2224dnl #endif
2225dnl If *not*, define __attribute__(a) as null
2226dnl
2227dnl We start by requiring Gcc.  Some other compilers accept __attribute__
2228dnl but generate warning messages, or have different interpretations
2229dnl (which seems to make __attribute__ just as bad as #pragma)
2230dnl For example, the Intel icc compiler accepts __attribute__ and
2231dnl __attribute__((pure)) but generates warnings for __attribute__((format...))
2232dnl
2233AC_DEFUN([PAC_C_GNU_ATTRIBUTE],[
2234AC_REQUIRE([AC_PROG_CC_GNU])
2235if test "$ac_cv_prog_gcc" = "yes" ; then
2236    AC_CACHE_CHECK([whether __attribute__ allowed],
2237pac_cv_gnu_attr_pure,[
2238AC_TRY_COMPILE([int foo(int) __attribute__ ((pure));],[int a;],
2239pac_cv_gnu_attr_pure=yes,pac_cv_gnu_attr_pure=no)])
2240AC_CACHE_CHECK([whether __attribute__((format)) allowed],
2241pac_cv_gnu_attr_format,[
2242AC_TRY_COMPILE([int foo(char *,...) __attribute__ ((format(printf,1,2)));],[int a;],
2243pac_cv_gnu_attr_format=yes,pac_cv_gnu_attr_format=no)])
2244    if test "$pac_cv_gnu_attr_pure" = "yes" -a "$pac_cv_gnu_attr_format" = "yes" ; then
2245        AC_DEFINE(HAVE_GCC_ATTRIBUTE,1,[Define if GNU __attribute__ is supported])
2246    fi
2247fi
2248])
2249dnl
2250dnl Check for a broken install (fails to preserve file modification times,
2251dnl thus breaking libraries.
2252dnl
2253dnl Create a library, install it, and then try to link against it.
2254AC_DEFUN([PAC_PROG_INSTALL_BREAKS_LIBS],[
2255AC_CACHE_CHECK([whether install breaks libraries],
2256ac_cv_prog_install_breaks_libs,[
2257AC_REQUIRE([AC_PROG_RANLIB])
2258AC_REQUIRE([AC_PROG_INSTALL])
2259AC_REQUIRE([AC_PROG_CC])
2260ac_cv_prog_install_breaks_libs=yes
2261# This is needed for Mac OSX 10.5
2262rm -rf conftest.dSYM
2263rm -f libconftest* conftest*
2264echo 'int foo(int);int foo(int a){return a;}' > conftest1.c
2265echo 'extern int foo(int); int main( int argc, char **argv){ return foo(0); }' > conftest2.c
2266if ${CC-cc} $CFLAGS -c conftest1.c >conftest.out 2>&1 ; then
2267    if ${AR-ar} cr libconftest.a conftest1.o >/dev/null 2>&1 ; then
2268        if ${RANLIB-:} libconftest.a >/dev/null 2>&1 ; then
2269            # Anything less than sleep 10, and Mac OS/X (Darwin)
2270            # will claim that install works because ranlib won't complain
2271            sleep 10
2272            libinstall="$INSTALL_DATA"
2273            eval "libinstall=\"$libinstall\""
2274            if ${libinstall} libconftest.a libconftest1.a  >/dev/null 2>&1 ; then
2275                if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest1.a >>conftest.out 2>&1 && test -x conftest ; then
2276                    # Success!  Install works
2277                    ac_cv_prog_install_breaks_libs=no
2278                else
2279                    # Failure!  Does install -p work?   
2280                    rm -f libconftest1.a
2281                    if ${libinstall} -p libconftest.a libconftest1.a >/dev/null 2>&1 ; then
2282                        if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest1.a >>conftest.out 2>&1 && test -x conftest ; then
2283                        # Success!  Install works
2284                            ac_cv_prog_install_breaks_libs="no, with -p"
2285                        fi
2286                    fi
2287                fi
2288            fi
2289        fi
2290    fi
2291fi
2292# This is needed for Mac OSX 10.5
2293rm -rf conftest.dSYM
2294rm -f conftest* libconftest*])
2295
2296if test -z "$RANLIB_AFTER_INSTALL" ; then
2297    RANLIB_AFTER_INSTALL=no
2298fi
2299case "$ac_cv_prog_install_breaks_libs" in
2300        yes)
2301            RANLIB_AFTER_INSTALL=yes
2302        ;;
2303        "no, with -p")
2304            INSTALL_DATA="$INSTALL_DATA -p"
2305        ;;
2306        *)
2307        # Do nothing
2308        :
2309        ;;
2310esac
2311AC_SUBST(RANLIB_AFTER_INSTALL)
2312])
2313
2314#
2315# determine if the compiler defines a symbol containing the function name
2316# Inspired by checks within the src/mpid/globus/configure.in file in MPICH2
2317#
2318# These tests check not only that the compiler defines some symbol, such
2319# as __FUNCTION__, but that the symbol correctly names the function.
2320#
2321# Defines
2322#   HAVE__FUNC__      (if __func__ defined)
2323#   HAVE_CAP__FUNC__  (if __FUNC__ defined)
2324#   HAVE__FUNCTION__  (if __FUNCTION__ defined)
2325#
2326AC_DEFUN([PAC_CC_FUNCTION_NAME_SYMBOL],[
2327AC_CACHE_CHECK([whether the compiler defines __func__],
2328pac_cv_have__func__,[
2329tmp_am_cross=no
2330AC_RUN_IFELSE([
2331#include <string.h>
2332int foo(void);
2333int foo(void)
2334{
2335    return (strcmp(__func__, "foo") == 0);
2336}
2337int main(int argc, char ** argv)
2338{
2339    return (foo() ? 0 : 1);
2340}
2341], pac_cv_have__func__=yes, pac_cv_have__func__=no,tmp_am_cross=yes)
2342if test "$tmp_am_cross" = yes ; then
2343    AC_LINK_IFELSE([
2344#include <string.h>
2345int foo(void);
2346int foo(void)
2347{
2348    return (strcmp(__func__, "foo") == 0);
2349}
2350int main(int argc, char ** argv)
2351{
2352    return (foo() ? 0 : 1);
2353}
2354], pac_cv_have__func__=yes, pac_cv_have__func__=no)
2355fi
2356])
2357
2358if test "$pac_cv_have__func__" = "yes" ; then
2359    AC_DEFINE(HAVE__FUNC__,,[define if the compiler defines __func__])
2360fi
2361
2362AC_CACHE_CHECK([whether the compiler defines __FUNC__],
2363pac_cv_have_cap__func__,[
2364tmp_am_cross=no
2365AC_RUN_IFELSE([
2366#include <string.h>
2367int foo(void);
2368int foo(void)
2369{
2370    return (strcmp(__FUNC__, "foo") == 0);
2371}
2372int main(int argc, char ** argv)
2373{
2374    return (foo() ? 0 : 1);
2375}
2376], pac_cv_have_cap__func__=yes, pac_cv_have_cap__func__=no,tmp_am_cross=yes)
2377if test "$tmp_am_cross" = yes ; then
2378    AC_LINK_IFELSE([
2379#include <string.h>
2380int foo(void);
2381int foo(void)
2382{
2383    return (strcmp(__FUNC__, "foo") == 0);
2384}
2385int main(int argc, char ** argv)
2386{
2387    return (foo() ? 0 : 1);
2388}
2389], pac_cv_have__func__=yes, pac_cv_have__func__=no)
2390fi
2391])
2392
2393if test "$pac_cv_have_cap__func__" = "yes" ; then
2394    AC_DEFINE(HAVE_CAP__FUNC__,,[define if the compiler defines __FUNC__])
2395fi
2396
2397AC_CACHE_CHECK([whether the compiler sets __FUNCTION__],
2398pac_cv_have__function__,[
2399tmp_am_cross=no
2400AC_RUN_IFELSE([
2401#include <string.h>
2402int foo(void);
2403int foo(void)
2404{
2405    return (strcmp(__FUNCTION__, "foo") == 0);
2406}
2407int main(int argc, char ** argv)
2408{
2409    return (foo() ? 0 : 1);
2410}
2411], pac_cv_have__function__=yes, pac_cv_have__function__=no,tmp_am_cross=yes)
2412if test "$tmp_am_cross" = yes ; then
2413    AC_LINK_IFELSE([
2414#include <string.h>
2415int foo(void);
2416int foo(void)
2417{
2418    return (strcmp(__FUNCTION__, "foo") == 0);
2419}
2420int main(int argc, char ** argv)
2421{
2422    return (foo() ? 0 : 1);
2423}
2424], pac_cv_have__func__=yes, pac_cv_have__func__=no)
2425fi
2426])
2427
2428if test "$pac_cv_have__function__" = "yes" ; then
2429    AC_DEFINE(HAVE__FUNCTION__,,[define if the compiler defines __FUNCTION__])
2430fi
2431
2432])
Note: See TracBrowser for help on using the browser.