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

Revision 4877, 74.9 KB (checked in by goodell, 5 months ago)

Add -Wno-format-zero-length to the strict arguments.

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    pac_common_strict_flags="-O2 -Wall -Wextra -Wno-missing-field-initializers -Wno-type-limits -Wstrict-prototypes -Wmissing-prototypes -DGCC_WALL -Wno-unused-parameter -Wno-unused-label -Wshadow -Wmissing-declarations -Wno-long-long -Wfloat-equal -Wdeclaration-after-statement -Wundef -Wno-endif-labels -Wpointer-arith -Wbad-function-cast -Wcast-align -Wwrite-strings -Wno-sign-compare -Waggregate-return -Wold-style-definition -Wmissing-noreturn -Wno-multichar -Wno-deprecated-declarations -Wpacked -Wnested-externs -Winvalid-pch -Wno-pointer-sign -Wvariadic-macros -std=c89 -Wno-format-zero-length"
1102    pac_cc_strict_flags=""
1103    case "$1" in
1104        yes|all|posix)
1105                enable_strict_done="yes"
1106                pac_cc_strict_flags="$pac_common_strict_flags -D_POSIX_C_SOURCE=199506L"
1107        ;;
1108
1109        noposix)
1110                enable_strict_done="yes"
1111                pac_cc_strict_flags="$pac_common_strict_flags"
1112        ;;
1113       
1114        no)
1115                # Accept and ignore this value
1116                :
1117        ;;
1118
1119        *)
1120                if test -n "$1" ; then
1121                   AC_MSG_WARN([Unrecognized value for enable-strict:$1])
1122                fi
1123        ;;
1124
1125    esac
1126
1127    # See if the above options work with the compiler
1128    accepted_flags=""
1129    for flag in $pac_cc_strict_flags ; do
1130        old_CFLAGS=$CFLAGS
1131        CFLAGS="$CFLAGS $accepted_flags $flag"
1132        AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[int a;])],accepted_flags="$accepted_flags $flag",)
1133        CFLAGS="$old_CFLAGS"
1134    done
1135    pac_cc_strict_flags=$accepted_flags
1136fi
1137])
1138
1139dnl/*D
1140dnl PAC_ARG_STRICT - Add --enable-strict to configure. 
1141dnl
1142dnl Synopsis:
1143dnl PAC_ARG_STRICT
1144dnl
1145dnl Output effects:
1146dnl Adds '--enable-strict' to the command line.
1147dnl
1148dnl D*/
1149AC_DEFUN([PAC_ARG_STRICT],[
1150AC_ARG_ENABLE(strict,
1151[--enable-strict  - Turn on strict compilation testing when using gcc])
1152PAC_CC_STRICT($enable_strict)
1153CFLAGS="$CFLAGS $pac_cc_strict_flags"
1154export CFLAGS
1155])
1156
1157dnl/*D
1158dnl PAC_ARG_CC_G - Add debugging flags for the C compiler
1159dnl
1160dnl Synopsis:
1161dnl PAC_ARG_CC_G
1162dnl
1163dnl Output Effect:
1164dnl Adds '-g' to 'COPTIONS' and exports 'COPTIONS'.  Sets and exports the
1165dnl variable 'enable_g_simple' so that subsidiary 'configure's will not
1166dnl add another '-g'.
1167dnl
1168dnl Notes:
1169dnl '--enable-g' should be used for all internal debugging modes if possible.
1170dnl Use the 'enable_val' that 'enable_g' is set to to pass particular values,
1171dnl and ignore any values that are not recognized (some other 'configure'
1172dnl may have used them.  Of course, if you need extra values, you must
1173dnl add code to extract values from 'enable_g'.
1174dnl
1175dnl For example, to look for a particular keyword, you could use
1176dnl.vb
1177dnl SaveIFS="$IFS"
1178dnl IFS=","
1179dnl for key in $enable_g ; do
1180dnl     case $key in
1181dnl         mem) # add code for memory debugging
1182dnl         ;;
1183dnl         *)   # ignore all other values
1184dnl         ;;
1185dnl     esac
1186dnl done
1187dnl IFS="$SaveIFS"
1188dnl.ve
1189dnl
1190dnl D*/
1191AC_DEFUN([PAC_ARG_CC_G],[
1192AC_ARG_ENABLE(g,
1193[--enable-g  - Turn on debugging of the package (typically adds -g to COPTIONS)])
1194export COPTIONS
1195export enable_g_simple
1196if test -n "$enable_g" -a "$enable_g" != "no" -a \
1197   "$enable_g_simple" != "done" ; then
1198    enable_g_simple="done"
1199    if test "$enable_g" = "g" -o "$enable_g" = "yes" ; then
1200        COPTIONS="$COPTIONS -g"
1201    fi
1202fi
1203])
1204dnl
1205dnl Simple version for both options
1206dnl
1207AC_DEFUN([PAC_ARG_CC_COMMON],[
1208PAC_ARG_CC_G
1209PAC_ARG_STRICT
1210])
1211dnl
1212dnl Eventually, this can be used instead of the funky Fortran stuff to
1213dnl access the command line from a C routine.
1214dnl #
1215dnl # Under IRIX (some version) __Argc and __Argv gave the argc,argv values
1216dnl #Under linux, __libc_argv and __libc_argc
1217dnl AC_MSG_CHECKING([for alternative argc,argv names])
1218dnl AC_TRY_LINK([
1219dnl extern int __Argc; extern char **__Argv;],[return __Argc;],
1220dnl alt_argv="__Argv")
1221dnl if test -z "$alt_argv" ; then
1222dnl    AC_TRY_LINK([
1223dnl extern int __libc_argc; extern char **__libc_argv;],[return __lib_argc;],
1224dnl alt_argv="__lib_argv")
1225dnl fi
1226dnl if test -z "$alt_argv" ; then
1227dnl   AC_MSG_RESULT(none found))
1228dnl else
1229dnl   AC_MSG_RESULT($alt_argv)
1230dnl fi
1231dnl
1232dnl
1233dnl Check whether we need -fno-common to correctly compile the source code.
1234dnl This is necessary if global variables are defined without values in
1235dnl gcc.  Here is the test
1236dnl conftest1.c:
1237dnl extern int a; int a;
1238dnl conftest2.c:
1239dnl extern int a; int main(int argc; char *argv[] ){ return a; }
1240dnl Make a library out of conftest1.c and try to link with it.
1241dnl If that fails, recompile it with -fno-common and see if that works.
1242dnl If so, add -fno-common to CFLAGS
1243dnl An alternative is to use, on some systems, ranlib -c to force
1244dnl the system to find common symbols.
1245dnl
1246AC_DEFUN([PAC_PROG_C_BROKEN_COMMON],[
1247AC_CACHE_CHECK([whether global variables handled properly],
1248ac_cv_prog_cc_globals_work,[
1249AC_REQUIRE([AC_PROG_RANLIB])
1250ac_cv_prog_cc_globals_work=no
1251rm -f libconftest.a
1252echo 'extern int a; int a;' > conftest1.c
1253echo 'extern int a; int main( ){ return a; }' > conftest2.c
1254if ${CC-cc} $CFLAGS -c conftest1.c >conftest.out 2>&1 ; then
1255    if ${AR-ar} cr libconftest.a conftest1.o >/dev/null 2>&1 ; then
1256        if ${RANLIB-:} libconftest.a >/dev/null 2>&1 ; then
1257            if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest.a >>conftest.out 2>&1 ; then
1258                # Success!  C works
1259                ac_cv_prog_cc_globals_work=yes
1260            else
1261                echo "Error linking program with uninitialized global" >&AC_FD_CC
1262                echo "Programs were:" >&AC_FD_CC
1263                echo "conftest1.c:" >&AC_FD_CC
1264                cat conftest1.c >&AC_FD_CC
1265                echo "conftest2.c:" >&AC_FD_CC
1266                cat conftest2.c >&AC_FD_CC
1267                echo "and link line was:" >&AC_FD_CC
1268                echo "${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest.a" >&AC_FD_CC
1269                echo "with output:" >&AC_FD_CC
1270                cat conftest.out >&AC_FD_CC
1271
1272                # Failure!  Do we need -fno-common?
1273                ${CC-cc} $CFLAGS -fno-common -c conftest1.c >> conftest.out 2>&1
1274                rm -f libconftest.a
1275                ${AR-ar} cr libconftest.a conftest1.o
1276                ${RANLIB-:} libconftest.a
1277                if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest.a >> conftest.out 2>&1 ; then
1278                    ac_cv_prog_cc_globals_work="needs -fno-common"
1279                    CFLAGS="$CFLAGS -fno-common"
1280                elif test -n "$RANLIB" ; then
1281                    # Try again, with ranlib changed to ranlib -c
1282                    # (send output to /dev/null incase this ranlib
1283                    # doesn't know -c)
1284                    ${RANLIB} -c libconftest.a >/dev/null 2>&1
1285                    if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest.a >> conftest.out 2>&1 ; then
1286                        RANLIB="$RANLIB -c"
1287                    #else
1288                    #   # That didn't work
1289                    #   :
1290                    fi
1291                #else
1292                #    :
1293                fi
1294            fi
1295        fi
1296    fi
1297fi
1298# This is needed for Mac OSX 10.5
1299rm -rf conftest.dSYM
1300rm -f conftest* libconftest*])
1301if test "$ac_cv_prog_cc_globals_work" = no ; then
1302    AC_MSG_WARN([Common symbols not supported on this system!])
1303fi
1304])
1305dnl
1306dnl
1307dnl Return the structure alignment in pac_cv_c_struct_align
1308dnl Possible values include
1309dnl     packed - no padding or alignment, any item may begin on any byte
1310dnl     largest - extent of a structure is a multiple of the largest item;
1311dnl               items are aligned with their size
1312dnl     four - structs padded to a multiple of four
1313dnl     two  - like four, but to a multiple of two
1314dnl     eight - If objects containing 8-byte items are padded to a multiple
1315dnl             of eight
1316dnl     largestor4 - like largest, except that for items of size > 4, align
1317dnl                  on 4-byte boundaries.  E.g., align on the
1318dnl                  min(4,max(size of items)).
1319dnl     largestorword - (should be named largestorqword, with qword meaning
1320dnl                     quad-word): Like largestor4, but with a special case
1321dnl                     for 16-byte items (this is the 16-byte aligned
1322dnl                     quad-word-load special case).
1323dnl
1324dnl In addition, a "Could not determine alignment" and a
1325dnl "Multiple cases:" return is possible. 
1326dnl
1327AC_DEFUN([PAC_C_STRUCT_ALIGNMENT],[
1328AC_CACHE_CHECK([for C struct alignment],pac_cv_c_struct_align,[
1329AC_TRY_RUN([
1330#include <stdio.h>
1331#ifdef DEBUG_STRUCT_ALIGNMENT
1332#define DBG(a,b,c) printf( "type %s, size = %d, extent = %d\n", a, b, c )
1333#define CHECK(cond,flag) if (cond) { flag = 0; \
1334    printf( "Setting %s to false because of %s\n", #flag, #cond ); }
1335#else
1336#define DBG(a,b,c)
1337#define CHECK(cond,flag) if (cond) { flag = 0; }
1338#endif
1339
1340int main( int argc, char *argv[] )
1341{
1342    FILE *cf;
1343    int is_packed  = 1;
1344    int is_two     = 1;
1345    int is_four    = 1;
1346    int is_eight   = 1;
1347    int is_largest = 1;
1348    int is_largestorword = 1;
1349    int is_largestor4 = 1;
1350    int numCases;
1351
1352    /* We've seen PowerPC systems where the alignment may
1353       be largest for some items but not for double + int */
1354    struct { char a; int b; } char_int;
1355    struct { short a; int b; } short_int;
1356    struct { char a; short b; } char_short;
1357    struct { char a; long b; } char_long;
1358    struct { char a; float b; } char_float;
1359    struct { char a; double b; } char_double;
1360    struct { char a; int b; char c; } char_int_char;
1361    struct { char a; short b; char c; } char_short_char;
1362#ifdef HAVE_LONG_DOUBLE
1363    struct { char a; long double b; } char_long_double;
1364#endif
1365    int size, extent;
1366
1367    size = sizeof(char) + sizeof(int);
1368    extent = sizeof(char_int);
1369    if (size != extent) is_packed = 0;
1370    CHECK((extent % sizeof(int)) != 0, is_largest);
1371    CHECK((extent % sizeof(int)) != 0, is_largestor4);
1372    CHECK((extent % sizeof(int)) != 0, is_largestorword);
1373    if ( (extent % 2) != 0) is_two = 0;
1374    if ( (extent % 4) != 0) is_four = 0;
1375    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1376    DBG("char_int",size,extent);
1377
1378    size = sizeof(short) + sizeof(int);
1379    extent = sizeof(short_int);
1380    if (size != extent) is_packed = 0;
1381    CHECK((extent % sizeof(int)) != 0, is_largest);
1382    CHECK((extent % sizeof(int)) != 0, is_largestor4);
1383    CHECK((extent % sizeof(int)) != 0, is_largestorword);
1384    if ( (extent % 2) != 0) is_two = 0;
1385    if ( (size == 6) && (extent == 8) ) is_two = 0;
1386    if ( (extent % 4) != 0) is_four = 0;
1387    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1388    DBG("short_int",size,extent);
1389
1390    size = sizeof(char) + sizeof(short);
1391    extent = sizeof(char_short);
1392    if (size != extent) is_packed = 0;
1393    CHECK((extent % sizeof(short)) != 0,is_largest);
1394    CHECK((extent % sizeof(short)) != 0,is_largestor4);
1395    CHECK((extent % sizeof(short)) != 0,is_largestorword);
1396    if ( (extent % 2) != 0) is_two = 0;
1397    if (sizeof(short) == 4 && (extent % 4) != 0) is_four = 0;
1398    if (sizeof(short) == 8 && (extent % 8) != 0) is_eight = 0;
1399    DBG("char_short",size,extent);
1400
1401    size = sizeof(char) + sizeof(long);
1402    extent = sizeof(char_long);
1403    if (size != extent) is_packed = 0;
1404    CHECK((extent % sizeof(long)) != 0,is_largest);
1405    CHECK((extent % 4) != 0,is_largestor4);
1406    CHECK((extent % sizeof(long)) != 0,is_largestorword);
1407    if ( (extent % 2) != 0) is_two = 0;
1408    if ( (extent % 4) != 0) is_four = 0;
1409    if (sizeof(long) == 8 && (extent % 8) != 0) is_eight = 0;
1410    DBG("char_long",size,extent);
1411
1412    size = sizeof(char) + sizeof(float);
1413    extent = sizeof(char_float);
1414    if (size != extent) is_packed = 0;
1415    CHECK((extent % sizeof(float)) != 0,is_largest);
1416    CHECK((extent % sizeof(float)) != 0,is_largestor4);
1417    CHECK((extent % sizeof(float)) != 0,is_largestorword);
1418    if ( (extent % 2) != 0) is_two = 0;
1419    if ( (extent % 4) != 0) is_four = 0;
1420    if (sizeof(float) == 8 && (extent % 8) != 0) is_eight = 0;
1421    DBG("char_float",size,extent);
1422
1423    size = sizeof(char) + sizeof(double);
1424    extent = sizeof(char_double);
1425    if (size != extent) is_packed = 0;
1426    CHECK((extent % sizeof(double)) != 0,is_largest);
1427    CHECK((extent % 4) != 0,is_largestor4);
1428    CHECK((extent % sizeof(int)) != 0,is_largestorword);
1429    if ( (extent % 2) != 0) is_two = 0;
1430    if ( (extent % 4) != 0) is_four = 0;
1431    if (sizeof(double) == 8 && (extent % 8) != 0) is_eight = 0;
1432    DBG("char_double",size,extent);
1433
1434#ifdef HAVE_LONG_DOUBLE
1435    size = sizeof(char) + sizeof(long double);
1436    extent = sizeof(char_long_double);
1437    if (size != extent) is_packed = 0;
1438    CHECK((extent % sizeof(long double)) != 0,is_largest);
1439    CHECK((extent % 4) != 0,is_largestor4);
1440    CHECK((extent % 16) == 0,is_largestor4);
1441    CHECK((extent % sizeof(long double)) != 0,is_largestorword);
1442    /* This case only applies to largestorword if long doubles are 16 bytes */
1443    if (sizeof(long double) != 16) is_largestorword = 0;
1444    if ( (extent % 2) != 0) is_two = 0;
1445    if ( (extent % 4) != 0) is_four = 0;
1446    if (sizeof(long double) >= 8 && (extent % 8) != 0) is_eight = 0;
1447    DBG("char_long-double",size,extent);
1448#else
1449    /* The special case of largestorword only applies if long double
1450       available */
1451    is_largestorword=0;
1452#endif
1453
1454    /* char int char helps separate largest from 4/8 aligned */
1455    size = sizeof(char) + sizeof(int) + sizeof(char);
1456    extent = sizeof(char_int_char);
1457    if (size != extent) is_packed = 0;
1458    CHECK((extent % sizeof(int)) != 0,is_largest);
1459    CHECK((extent % sizeof(int)) != 0,is_largestor4);
1460    CHECK((extent % sizeof(int)) != 0,is_largestorword);
1461    if ( (extent % 2) != 0) is_two = 0;
1462    if ( (extent % 4) != 0) is_four = 0;
1463    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1464    DBG("char_int_char",size,extent);
1465
1466    /* char short char helps separate largest from 4/8 aligned */
1467    size = sizeof(char) + sizeof(short) + sizeof(char);
1468    extent = sizeof(char_short_char);
1469    if (size != extent) is_packed = 0;
1470    CHECK((extent % sizeof(short)) != 0,is_largest);
1471    CHECK((extent % sizeof(short)) != 0,is_largestor4);
1472    CHECK((extent % sizeof(short)) != 0,is_largestorword);
1473    if ( (extent % 2) != 0) is_two = 0;
1474    if (sizeof(short) == 4 && (extent % 4) != 0) is_four = 0;
1475    CHECK((extent == 6) && (size == 4),is_four);
1476    if (sizeof(short) == 8 && (extent % 8) != 0) is_eight = 0;
1477    DBG("char_short_char",size,extent);
1478
1479    /* If aligned mod 8, it will be aligned mod 4 */
1480    if (is_eight) { is_four = 0; is_two = 0; }
1481
1482    if (is_four) is_two = 0;
1483
1484    /* largest superceeds eight */
1485    if (is_largest) is_eight = 0;
1486
1487    /* Tabulate the results */
1488    cf = fopen( "ctest.out", "w" );
1489    numCases = is_packed + is_largest + is_largestorword + is_largestor4 +
1490        is_two + is_four + is_eight;
1491    if (numCases == 0) {
1492        fprintf( cf, "Could not determine alignment\n" );
1493    }
1494    else {
1495        if (numCases != 1) {
1496            fprintf( cf, "Multiple cases:\n" );
1497        }
1498        if (is_packed) fprintf( cf, "packed\n" );
1499        if (is_largest) fprintf( cf, "largest\n" );
1500        if (is_largestorword) fprintf( cf, "largestorword\n" );
1501        if (is_largestor4) fprintf( cf, "largestor4\n" );
1502        if (is_two) fprintf( cf, "two\n" );
1503        if (is_four) fprintf( cf, "four\n" );
1504        if (is_eight) fprintf( cf, "eight\n" );
1505    }
1506    fclose( cf );
1507    return 0;
1508}],
1509pac_cv_c_struct_align=`cat ctest.out`
1510,pac_cv_c_struct_align="unknown",pac_cv_c_struct_align="$CROSS_ALIGN_STRUCT")
1511rm -f ctest.out
1512])
1513if test -z "$pac_cv_c_struct_align" ; then
1514    pac_cv_c_struct_align="unknown"
1515fi
1516])
1517dnl
1518dnl
1519dnl Return the integer structure alignment in pac_cv_c_max_integer_align
1520dnl Possible values include
1521dnl     packed
1522dnl     two
1523dnl     four
1524dnl     eight
1525dnl
1526dnl In addition, a "Could not determine alignment" and a "error!"
1527dnl return is possible. 
1528AC_DEFUN([PAC_C_MAX_INTEGER_ALIGN],[
1529AC_CACHE_CHECK([for max C struct integer alignment],
1530pac_cv_c_max_integer_align,[
1531AC_TRY_RUN([
1532#include <stdio.h>
1533#define DBG(a,b,c)
1534int main( int argc, char *argv[] )
1535{
1536    FILE *cf;
1537    int is_packed  = 1;
1538    int is_two     = 1;
1539    int is_four    = 1;
1540    int is_eight   = 1;
1541    struct { char a; int b; } char_int;
1542    struct { char a; short b; } char_short;
1543    struct { char a; long b; } char_long;
1544    struct { char a; int b; char c; } char_int_char;
1545    struct { char a; short b; char c; } char_short_char;
1546#ifdef HAVE_LONG_LONG_INT
1547    struct { long long int a; char b; } lli_c;
1548    struct { char a; long long int b; } c_lli;
1549#endif
1550    int size, extent, extent2;
1551
1552    /* assume max integer alignment isn't 8 if we don't have
1553     * an eight-byte value :)
1554     */
1555#ifdef HAVE_LONG_LONG_INT
1556    if (sizeof(int) < 8 && sizeof(long) < 8 && sizeof(long long int) < 8)
1557        is_eight = 0;
1558#else
1559    if (sizeof(int) < 8 && sizeof(long) < 8) is_eight = 0;
1560#endif
1561
1562    size = sizeof(char) + sizeof(int);
1563    extent = sizeof(char_int);
1564    if (size != extent) is_packed = 0;
1565    if ( (extent % 2) != 0) is_two = 0;
1566    if ( (extent % 4) != 0) is_four = 0;
1567    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1568    DBG("char_int",size,extent);
1569
1570    size = sizeof(char) + sizeof(short);
1571    extent = sizeof(char_short);
1572    if (size != extent) is_packed = 0;
1573    if ( (extent % 2) != 0) is_two = 0;
1574    if (sizeof(short) == 4 && (extent % 4) != 0) is_four = 0;
1575    if (sizeof(short) == 8 && (extent % 8) != 0) is_eight = 0;
1576    DBG("char_short",size,extent);
1577
1578    size = sizeof(char) + sizeof(long);
1579    extent = sizeof(char_long);
1580    if (size != extent) is_packed = 0;
1581    if ( (extent % 2) != 0) is_two = 0;
1582    if ( (extent % 4) != 0) is_four = 0;
1583    if (sizeof(long) == 8 && (extent % 8) != 0) is_eight = 0;
1584    DBG("char_long",size,extent);
1585
1586#ifdef HAVE_LONG_LONG_INT
1587    size = sizeof(char) + sizeof(long long int);
1588    extent = sizeof(lli_c);
1589    extent2 = sizeof(c_lli);
1590    if (size != extent) is_packed = 0;
1591    if ( (extent % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1592    if ( (extent % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1593    if (sizeof(long long int) >= 8 && (extent % 8) != 0 && (extent2 % 8) != 0)
1594        is_eight = 0;
1595#endif
1596
1597    size = sizeof(char) + sizeof(int) + sizeof(char);
1598    extent = sizeof(char_int_char);
1599    if (size != extent) is_packed = 0;
1600    if ( (extent % 2) != 0) is_two = 0;
1601    if ( (extent % 4) != 0) is_four = 0;
1602    if (sizeof(int) == 8 && (extent % 8) != 0) is_eight = 0;
1603    DBG("char_int_char",size,extent);
1604
1605    size = sizeof(char) + sizeof(short) + sizeof(char);
1606    extent = sizeof(char_short_char);
1607    if (size != extent) is_packed = 0;
1608    if ( (extent % 2) != 0) is_two = 0;
1609    if (sizeof(short) == 4 && (extent % 4) != 0) is_four = 0;
1610    if (sizeof(short) == 8 && (extent % 8) != 0) is_eight = 0;
1611    DBG("char_short_char",size,extent);
1612
1613    /* If aligned mod 8, it will be aligned mod 4 */
1614    if (is_eight) { is_four = 0; is_two = 0; }
1615
1616    if (is_four) is_two = 0;
1617
1618    /* Tabulate the results */
1619    cf = fopen( "ctest.out", "w" );
1620    if (is_packed + is_two + is_four + is_eight == 0) {
1621        fprintf( cf, "Could not determine alignment\n" );
1622    }
1623    else {
1624        if (is_packed + is_two + is_four + is_eight != 1) {
1625            fprintf( cf, "error!\n" );
1626        }
1627        else {
1628            if (is_packed) fprintf( cf, "packed\n" );
1629            if (is_two) fprintf( cf, "two\n" );
1630            if (is_four) fprintf( cf, "four\n" );
1631            if (is_eight) fprintf( cf, "eight\n" );
1632        }
1633    }
1634    fclose( cf );
1635    return 0;
1636}],
1637pac_cv_c_max_integer_align=`cat ctest.out`,
1638pac_cv_c_max_integer_align="unknown",
1639pac_cv_c_max_integer_align="$CROSS_ALIGN_STRUCT_INT")
1640rm -f ctest.out
1641])
1642if test -z "$pac_cv_c_max_integer_align" ; then
1643    pac_cv_c_max_integer_align="unknown"
1644fi
1645])
1646dnl
1647dnl
1648dnl Return the floating point structure alignment in
1649dnl pac_cv_c_max_fp_align.
1650dnl
1651dnl Possible values include:
1652dnl     packed
1653dnl     two
1654dnl     four
1655dnl     eight
1656dnl     sixteen
1657dnl
1658dnl In addition, a "Could not determine alignment" and a "error!"
1659dnl return is possible. 
1660AC_DEFUN([PAC_C_MAX_FP_ALIGN],[
1661AC_CACHE_CHECK([for max C struct floating point alignment],
1662pac_cv_c_max_fp_align,[
1663AC_TRY_RUN([
1664#include <stdio.h>
1665#define DBG(a,b,c)
1666int main( int argc, char *argv[] )
1667{
1668    FILE *cf;
1669    int is_packed  = 1;
1670    int is_two     = 1;
1671    int is_four    = 1;
1672    int is_eight   = 1;
1673    int is_sixteen = 1;
1674    struct { char a; float b; } char_float;
1675    struct { float b; char a; } float_char;
1676    struct { char a; double b; } char_double;
1677    struct { double b; char a; } double_char;
1678#ifdef HAVE_LONG_DOUBLE
1679    struct { char a; long double b; } char_long_double;
1680    struct { long double b; char a; } long_double_char;
1681    struct { long double a; int b; char c; } long_double_int_char;
1682#endif
1683    int size, extent1, extent2;
1684
1685    size = sizeof(char) + sizeof(float);
1686    extent1 = sizeof(char_float);
1687    extent2 = sizeof(float_char);
1688    if (size != extent1) is_packed = 0;
1689    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1690    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1691    if (sizeof(float) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1692        is_eight = 0;
1693    DBG("char_float",size,extent1);
1694
1695    size = sizeof(char) + sizeof(double);
1696    extent1 = sizeof(char_double);
1697    extent2 = sizeof(double_char);
1698    if (size != extent1) is_packed = 0;
1699    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1700    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1701    if (sizeof(double) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1702        is_eight = 0;
1703    DBG("char_double",size,extent1);
1704
1705#ifdef HAVE_LONG_DOUBLE
1706    size = sizeof(char) + sizeof(long double);
1707    extent1 = sizeof(char_long_double);
1708    extent2 = sizeof(long_double_char);
1709    if (size != extent1) is_packed = 0;
1710    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1711    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1712    if (sizeof(long double) >= 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1713        is_eight = 0;
1714    if (sizeof(long double) > 8 && (extent1 % 16) != 0
1715        && (extent2 % 16) != 0) is_sixteen = 0;
1716    DBG("char_long-double",size,extent1);
1717
1718    extent1 = sizeof(long_double_int_char);
1719    if ( (extent1 % 2) != 0) is_two = 0;
1720    if ( (extent1 % 4) != 0) is_four = 0;
1721    if (sizeof(long double) >= 8 && (extent1 % 8) != 0) is_eight = 0;
1722    if (sizeof(long double) > 8 && (extent1 % 16) != 0) is_sixteen = 0;
1723#else
1724    is_sixteen = 0;
1725#endif
1726
1727    if (is_sixteen) { is_eight = 0; is_four = 0; is_two = 0; }
1728
1729    if (is_eight) { is_four = 0; is_two = 0; }
1730
1731    if (is_four) is_two = 0;
1732
1733    /* Tabulate the results */
1734    cf = fopen( "ctest.out", "w" );
1735    if (is_packed + is_two + is_four + is_eight + is_sixteen == 0) {
1736        fprintf( cf, "Could not determine alignment\n" );
1737    }
1738    else {
1739        if (is_packed + is_two + is_four + is_eight + is_sixteen != 1) {
1740            fprintf( cf, "error!\n" );
1741        }
1742        else {
1743            if (is_packed) fprintf( cf, "packed\n" );
1744            if (is_two) fprintf( cf, "two\n" );
1745            if (is_four) fprintf( cf, "four\n" );
1746            if (is_eight) fprintf( cf, "eight\n" );
1747            if (is_sixteen) fprintf( cf, "sixteen\n" );
1748        }
1749    }
1750    fclose( cf );
1751    return 0;
1752}],
1753pac_cv_c_max_fp_align=`cat ctest.out`,
1754pac_cv_c_max_fp_align="unknown",
1755pac_cv_c_max_fp_align="$CROSS_ALIGN_STRUCT_FP")
1756rm -f ctest.out
1757])
1758if test -z "$pac_cv_c_max_fp_align" ; then
1759    pac_cv_c_max_fp_align="unknown"
1760fi
1761])
1762dnl
1763dnl
1764dnl Return the floating point structure alignment in
1765dnl pac_cv_c_max_double_fp_align.
1766dnl
1767dnl Possible values include:
1768dnl     packed
1769dnl     two
1770dnl     four
1771dnl     eight
1772dnl
1773dnl In addition, a "Could not determine alignment" and a "error!"
1774dnl return is possible. 
1775AC_DEFUN([PAC_C_MAX_DOUBLE_FP_ALIGN],[
1776AC_CACHE_CHECK([for max C struct alignment of structs with doubles],
1777pac_cv_c_max_double_fp_align,[
1778AC_TRY_RUN([
1779#include <stdio.h>
1780#define DBG(a,b,c)
1781int main( int argc, char *argv[] )
1782{
1783    FILE *cf;
1784    int is_packed  = 1;
1785    int is_two     = 1;
1786    int is_four    = 1;
1787    int is_eight   = 1;
1788    struct { char a; float b; } char_float;
1789    struct { float b; char a; } float_char;
1790    struct { char a; double b; } char_double;
1791    struct { double b; char a; } double_char;
1792    int size, extent1, extent2;
1793
1794    size = sizeof(char) + sizeof(float);
1795    extent1 = sizeof(char_float);
1796    extent2 = sizeof(float_char);
1797    if (size != extent1) is_packed = 0;
1798    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1799    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1800    if (sizeof(float) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1801        is_eight = 0;
1802    DBG("char_float",size,extent1);
1803
1804    size = sizeof(char) + sizeof(double);
1805    extent1 = sizeof(char_double);
1806    extent2 = sizeof(double_char);
1807    if (size != extent1) is_packed = 0;
1808    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1809    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1810    if (sizeof(double) == 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1811        is_eight = 0;
1812    DBG("char_double",size,extent1);
1813
1814    if (is_eight) { is_four = 0; is_two = 0; }
1815
1816    if (is_four) is_two = 0;
1817
1818    /* Tabulate the results */
1819    cf = fopen( "ctest.out", "w" );
1820    if (is_packed + is_two + is_four + is_eight == 0) {
1821        fprintf( cf, "Could not determine alignment\n" );
1822    }
1823    else {
1824        if (is_packed + is_two + is_four + is_eight != 1) {
1825            fprintf( cf, "error!\n" );
1826        }
1827        else {
1828            if (is_packed) fprintf( cf, "packed\n" );
1829            if (is_two) fprintf( cf, "two\n" );
1830            if (is_four) fprintf( cf, "four\n" );
1831            if (is_eight) fprintf( cf, "eight\n" );
1832        }
1833    }
1834    fclose( cf );
1835    return 0;
1836}],
1837pac_cv_c_max_double_fp_align=`cat ctest.out`,
1838pac_cv_c_max_double_fp_align="unknown",
1839pac_cv_c_max_double_fp_align="$CROSS_ALIGN_STRUCT_DOUBLE_FP")
1840rm -f ctest.out
1841])
1842if test -z "$pac_cv_c_max_double_fp_align" ; then
1843    pac_cv_c_max_double_fp_align="unknown"
1844fi
1845])
1846AC_DEFUN([PAC_C_MAX_LONGDOUBLE_FP_ALIGN],[
1847AC_CACHE_CHECK([for max C struct floating point alignment with long doubles],
1848pac_cv_c_max_longdouble_fp_align,[
1849AC_TRY_RUN([
1850#include <stdio.h>
1851#define DBG(a,b,c)
1852int main( int argc, char *argv[] )
1853{
1854    FILE *cf;
1855    int is_packed  = 1;
1856    int is_two     = 1;
1857    int is_four    = 1;
1858    int is_eight   = 1;
1859    int is_sixteen = 1;
1860    struct { char a; long double b; } char_long_double;
1861    struct { long double b; char a; } long_double_char;
1862    struct { long double a; int b; char c; } long_double_int_char;
1863    int size, extent1, extent2;
1864
1865    size = sizeof(char) + sizeof(long double);
1866    extent1 = sizeof(char_long_double);
1867    extent2 = sizeof(long_double_char);
1868    if (size != extent1) is_packed = 0;
1869    if ( (extent1 % 2) != 0 && (extent2 % 2) != 0) is_two = 0;
1870    if ( (extent1 % 4) != 0 && (extent2 % 4) != 0) is_four = 0;
1871    if (sizeof(long double) >= 8 && (extent1 % 8) != 0 && (extent2 % 8) != 0)
1872        is_eight = 0;
1873    if (sizeof(long double) > 8 && (extent1 % 16) != 0
1874        && (extent2 % 16) != 0) is_sixteen = 0;
1875    DBG("char_long-double",size,extent1);
1876
1877    extent1 = sizeof(long_double_int_char);
1878    if ( (extent1 % 2) != 0) is_two = 0;
1879    if ( (extent1 % 4) != 0) is_four = 0;
1880    if (sizeof(long double) >= 8 && (extent1 % 8) != 0) is_eight = 0;
1881    if (sizeof(long double) > 8 && (extent1 % 16) != 0) is_sixteen = 0;
1882
1883    if (is_sixteen) { is_eight = 0; is_four = 0; is_two = 0; }
1884
1885    if (is_eight) { is_four = 0; is_two = 0; }
1886
1887    if (is_four) is_two = 0;
1888
1889    /* Tabulate the results */
1890    cf = fopen( "ctest.out", "w" );
1891    if (is_packed + is_two + is_four + is_eight + is_sixteen == 0) {
1892        fprintf( cf, "Could not determine alignment\n" );
1893    }
1894    else {
1895        if (is_packed + is_two + is_four + is_eight + is_sixteen != 1) {
1896            fprintf( cf, "error!\n" );
1897        }
1898        else {
1899            if (is_packed) fprintf( cf, "packed\n" );
1900            if (is_two) fprintf( cf, "two\n" );
1901            if (is_four) fprintf( cf, "four\n" );
1902            if (is_eight) fprintf( cf, "eight\n" );
1903            if (is_sixteen) fprintf( cf, "sixteen\n" );
1904        }
1905    }
1906    fclose( cf );
1907    return 0;
1908}],
1909pac_cv_c_max_longdouble_fp_align=`cat ctest.out`,
1910pac_cv_c_max_longdouble_fp_align="unknown",
1911pac_cv_c_max_longdouble_fp_align="$CROSS_ALIGN_STRUCT_LONGDOUBLE_FP")
1912rm -f ctest.out
1913])
1914if test -z "$pac_cv_c_max_longdouble_fp_align" ; then
1915    pac_cv_c_max_longdouble_fp_align="unknown"
1916fi
1917])
1918dnl
1919dnl Other tests assume that there is potentially a maximum alignment
1920dnl and that if there is no maximum alignment, or a type is smaller than
1921dnl that value, then we align on the size of the value, with the exception
1922dnl of the "position-based alignment" rules we test for separately.
1923dnl
1924dnl It turns out that these assumptions have fallen short in at least one
1925dnl case, on MacBook Pros, where doubles are aligned on 4-byte boundaries
1926dnl even when long doubles are aligned on 16-byte boundaries. So this test
1927dnl is here specifically to handle this case.
1928dnl
1929dnl Puts result in pac_cv_c_double_alignment_exception.
1930dnl
1931dnl Possible values currently include no and four.
1932dnl
1933AC_DEFUN([PAC_C_DOUBLE_ALIGNMENT_EXCEPTION],[
1934AC_CACHE_CHECK([if double alignment breaks rules, find actual alignment],
1935pac_cv_c_double_alignment_exception,[
1936AC_TRY_RUN([
1937#include <stdio.h>
1938#define DBG(a,b,c)
1939int main( int argc, char *argv[] )
1940{
1941    FILE *cf;
1942    struct { char a; double b; } char_double;
1943    struct { double b; char a; } double_char;
1944    int extent1, extent2, align_4 = 0;
1945
1946    extent1 = sizeof(char_double);
1947    extent2 = sizeof(double_char);
1948
1949    /* we're interested in the largest value, will let separate test
1950     * deal with position-based issues.
1951     */
1952    if (extent1 < extent2) extent1 = extent2;
1953    if ((sizeof(double) == 8) && (extent1 % 8) != 0) {
1954       if (extent1 % 4 == 0) {
1955#ifdef HAVE_MAX_FP_ALIGNMENT
1956          if (HAVE_MAX_FP_ALIGNMENT >= 8) align_4 = 1;
1957#else
1958          align_4 = 1;
1959#endif
1960       }
1961    }
1962
1963    cf = fopen( "ctest.out", "w" );
1964
1965    if (align_4) fprintf( cf, "four\n" );
1966    else fprintf( cf, "no\n" );
1967
1968    fclose( cf );
1969    return 0;
1970}],
1971pac_cv_c_double_alignment_exception=`cat ctest.out`,
1972pac_cv_c_double_alignment_exception="unknown",
1973pac_cv_c_double_alignment_exception="$CROSS_ALIGN_DOUBLE_EXCEPTION")
1974rm -f ctest.out
1975])
1976if test -z "$pac_cv_c_double_alignment_exception" ; then
1977    pac_cv_c_double_alignment_exception="unknown"
1978fi
1979])
1980dnl
1981dnl
1982dnl Test for odd struct alignment rule that only applies max.
1983dnl padding when double value is at front of type.
1984dnl Puts result in pac_cv_c_double_pos_align.
1985dnl
1986dnl Search for "Power alignment mode" for more details.
1987dnl
1988dnl Possible values include yes, no, and unknown.
1989dnl
1990AC_DEFUN([PAC_C_DOUBLE_POS_ALIGN],[
1991AC_CACHE_CHECK([if alignment of structs with doubles is based on position],
1992pac_cv_c_double_pos_align,[
1993AC_TRY_RUN([
1994#include <stdio.h>
1995#define DBG(a,b,c)
1996int main( int argc, char *argv[] )
1997{
1998    FILE *cf;
1999    int padding_varies_by_pos = 0;
2000    struct { char a; double b; } char_double;
2001    struct { double b; char a; } double_char;
2002    int extent1, extent2;
2003
2004    extent1 = sizeof(char_double);
2005    extent2 = sizeof(double_char);
2006    if (extent1 != extent2) padding_varies_by_pos = 1;
2007
2008    cf = fopen( "ctest.out", "w" );
2009    if (padding_varies_by_pos) fprintf( cf, "yes\n" );
2010    else fprintf( cf, "no\n" );
2011
2012    fclose( cf );
2013    return 0;
2014}],
2015pac_cv_c_double_pos_align=`cat ctest.out`,
2016pac_cv_c_double_pos_align="unknown",
2017pac_cv_c_double_pos_align="$CROSS_ALIGN_DOUBLE_POS")
2018rm -f ctest.out
2019])
2020if test -z "$pac_cv_c_double_pos_align" ; then
2021    pac_cv_c_double_pos_align="unknown"
2022fi
2023])
2024dnl
2025dnl
2026dnl Test for odd struct alignment rule that only applies max.
2027dnl padding when long long int value is at front of type.
2028dnl Puts result in pac_cv_c_llint_pos_align.
2029dnl
2030dnl Search for "Power alignment mode" for more details.
2031dnl
2032dnl Possible values include yes, no, and unknown.
2033dnl
2034AC_DEFUN([PAC_C_LLINT_POS_ALIGN],[
2035AC_CACHE_CHECK([if alignment of structs with long long ints is based on position],
2036pac_cv_c_llint_pos_align,[
2037AC_TRY_RUN([
2038#include <stdio.h>
2039#define DBG(a,b,c)
2040int main( int argc, char *argv[] )
2041{
2042    FILE *cf;
2043    int padding_varies_by_pos = 0;
2044#ifdef HAVE_LONG_LONG_INT
2045    struct { char a; long long int b; } char_llint;
2046    struct { long long int b; char a; } llint_char;
2047    int extent1, extent2;
2048
2049    extent1 = sizeof(char_llint);
2050    extent2 = sizeof(llint_char);
2051    if (extent1 != extent2) padding_varies_by_pos = 1;
2052#endif
2053
2054    cf = fopen( "ctest.out", "w" );
2055    if (padding_varies_by_pos) fprintf( cf, "yes\n" );
2056    else fprintf( cf, "no\n" );
2057
2058    fclose( cf );
2059    return 0;
2060}],
2061pac_cv_c_llint_pos_align=`cat ctest.out`,
2062pac_cv_c_llint_pos_align="unknown",
2063pac_cv_c_llint_pos_align="$CROSS_ALIGN_LLINT_POS")
2064rm -f ctest.out
2065])
2066if test -z "$pac_cv_c_llint_pos_align" ; then
2067    pac_cv_c_llint_pos_align="unknown"
2068fi
2069])
2070
2071dnl
2072dnl
2073dnl/*D
2074dnl PAC_FUNC_NEEDS_DECL - Set NEEDS_<funcname>_DECL if a declaration is needed
2075dnl
2076dnl Synopsis:
2077dnl PAC_FUNC_NEEDS_DECL(headerfiles,funcname)
2078dnl
2079dnl Output Effect:
2080dnl Sets 'NEEDS_<funcname>_DECL' if 'funcname' is not declared by the
2081dnl headerfiles.
2082dnl
2083dnl Approach:
2084dnl Try to compile a program with the function, but passed with an incorrect
2085dnl calling sequence.  If the compilation fails, then the declaration
2086dnl is provided within the header files.  If the compilation succeeds,
2087dnl the declaration is required.
2088dnl
2089dnl We use a 'double' as the first argument to try and catch varargs
2090dnl routines that may use an int or pointer as the first argument.
2091dnl
2092dnl There is one difficulty - if the compiler has been instructed to
2093dnl fail on implicitly defined functions, then this test will always
2094dnl fail.
2095dnl
2096dnl D*/
2097AC_DEFUN([PAC_FUNC_NEEDS_DECL],[
2098AC_CACHE_CHECK([whether $2 needs a declaration],
2099pac_cv_func_decl_$2,[
2100AC_TRY_COMPILE([$1
2101int $2(double, int, double, const char *);],[int a=$2(1.0,27,1.0,"foo");],
2102pac_cv_func_decl_$2=yes,pac_cv_func_decl_$2=no)])
2103if test "$pac_cv_func_decl_$2" = "yes" ; then
2104changequote(<<,>>)dnl
2105define(<<PAC_FUNC_NAME>>, translit(NEEDS_$2_DECL, [a-z *], [A-Z__]))dnl
2106changequote([, ])dnl
2107    AC_DEFINE_UNQUOTED(PAC_FUNC_NAME,1,[Define if $2 needs a declaration])
2108undefine([PAC_FUNC_NAME])
2109fi
2110])dnl
2111dnl
2112dnl /*D
2113dnl PAC_CHECK_SIZEOF_DERIVED - Get the size of a user-defined type,
2114dnl such as a struct
2115dnl
2116dnl PAC_CHECK_SIZEOF_DERIVED(shortname,definition,defaultsize)
2117dnl Like AC_CHECK_SIZEOF, but handles arbitrary types.
2118dnl Unlike AC_CHECK_SIZEOF, does not define SIZEOF_xxx (because
2119dnl autoheader can''t handle this case)
2120dnl D*/
2121AC_DEFUN([PAC_CHECK_SIZEOF_DERIVED],[
2122changequote(<<,>>)dnl
2123define(<<AC_TYPE_NAME>>,translit(sizeof_$1,[a-z *], [A-Z_P]))dnl
2124define(<<AC_CV_NAME>>,translit(pac_cv_sizeof_$1,[ *], [_p]))dnl
2125changequote([,])dnl
2126rm -f conftestval
2127AC_MSG_CHECKING([for size of $1])
2128AC_CACHE_VAL(AC_CV_NAME,
2129[AC_TRY_RUN([#include <stdio.h>
2130main()
2131{
2132  $2 a;
2133  FILE *f=fopen("conftestval", "w");
2134  if (!f) exit(1);
2135  fprintf(f, "%d\n", sizeof(a));
2136  exit(0);
2137}],AC_CV_NAME=`cat conftestval`,AC_CV_NAME=0,ifelse([$3],,,AC_CV_NAME=$3))])
2138AC_MSG_RESULT($AC_CV_NAME)
2139dnl AC_DEFINE_UNQUOTED(AC_TYPE_NAME,$AC_CV_NAME)
2140undefine([AC_TYPE_NAME])undefine([AC_CV_NAME])
2141])
2142dnl
2143dnl /*D
2144dnl PAC_CHECK_SIZEOF_2TYPES - Get the size of a pair of types
2145dnl
2146dnl PAC_CHECK_SIZEOF_2TYPES(shortname,type1,type2,defaultsize)
2147dnl Like AC_CHECK_SIZEOF, but handles pairs of types.
2148dnl Unlike AC_CHECK_SIZEOF, does not define SIZEOF_xxx (because
2149dnl autoheader can''t handle this case)
2150dnl D*/
2151AC_DEFUN([PAC_CHECK_SIZEOF_2TYPES],[
2152changequote(<<,>>)dnl
2153define(<<AC_TYPE_NAME>>,translit(sizeof_$1,[a-z *], [A-Z_P]))dnl
2154define(<<AC_CV_NAME>>,translit(pac_cv_sizeof_$1,[ *], [_p]))dnl
2155changequote([,])dnl
2156rm -f conftestval
2157AC_MSG_CHECKING([for size of $1])
2158AC_CACHE_VAL(AC_CV_NAME,
2159[AC_TRY_RUN([#include <stdio.h>
2160main()
2161{
2162  $2 a;
2163  $3 b;
2164  FILE *f=fopen("conftestval", "w");
2165  if (!f) return 1; /* avoid exit */
2166  fprintf(f, "%d\n", (int)(sizeof(a) + sizeof(b)));
2167  return 0;
2168}],AC_CV_NAME=`cat conftestval`,AC_CV_NAME=0,ifelse([$4],,,AC_CV_NAME=$4))])
2169if test "X$AC_CV_NAME" = "X" ; then
2170    # We have a problem.  The test returned a zero status, but no output,
2171    # or we're cross-compiling (or think we are) and have no value for
2172    # this object
2173    :
2174fi
2175rm -f conftestval
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])
2180
2181dnl
2182dnl PAC_C_GNU_ATTRIBUTE - See if the GCC __attribute__ specifier is allow.
2183dnl Use the following
2184dnl #ifndef HAVE_GCC_ATTRIBUTE
2185dnl #define __attribute__(a)
2186dnl #endif
2187dnl If *not*, define __attribute__(a) as null
2188dnl
2189dnl We start by requiring Gcc.  Some other compilers accept __attribute__
2190dnl but generate warning messages, or have different interpretations
2191dnl (which seems to make __attribute__ just as bad as #pragma)
2192dnl For example, the Intel icc compiler accepts __attribute__ and
2193dnl __attribute__((pure)) but generates warnings for __attribute__((format...))
2194dnl
2195AC_DEFUN([PAC_C_GNU_ATTRIBUTE],[
2196AC_REQUIRE([AC_PROG_CC_GNU])
2197if test "$ac_cv_prog_gcc" = "yes" ; then
2198    AC_CACHE_CHECK([whether __attribute__ allowed],
2199pac_cv_gnu_attr_pure,[
2200AC_TRY_COMPILE([int foo(int) __attribute__ ((pure));],[int a;],
2201pac_cv_gnu_attr_pure=yes,pac_cv_gnu_attr_pure=no)])
2202AC_CACHE_CHECK([whether __attribute__((format)) allowed],
2203pac_cv_gnu_attr_format,[
2204AC_TRY_COMPILE([int foo(char *,...) __attribute__ ((format(printf,1,2)));],[int a;],
2205pac_cv_gnu_attr_format=yes,pac_cv_gnu_attr_format=no)])
2206    if test "$pac_cv_gnu_attr_pure" = "yes" -a "$pac_cv_gnu_attr_format" = "yes" ; then
2207        AC_DEFINE(HAVE_GCC_ATTRIBUTE,1,[Define if GNU __attribute__ is supported])
2208    fi
2209fi
2210])
2211dnl
2212dnl Check for a broken install (fails to preserve file modification times,
2213dnl thus breaking libraries.
2214dnl
2215dnl Create a library, install it, and then try to link against it.
2216AC_DEFUN([PAC_PROG_INSTALL_BREAKS_LIBS],[
2217AC_CACHE_CHECK([whether install breaks libraries],
2218ac_cv_prog_install_breaks_libs,[
2219AC_REQUIRE([AC_PROG_RANLIB])
2220AC_REQUIRE([AC_PROG_INSTALL])
2221AC_REQUIRE([AC_PROG_CC])
2222ac_cv_prog_install_breaks_libs=yes
2223# This is needed for Mac OSX 10.5
2224rm -rf conftest.dSYM
2225rm -f libconftest* conftest*
2226echo 'int foo(int);int foo(int a){return a;}' > conftest1.c
2227echo 'extern int foo(int); int main( int argc, char **argv){ return foo(0); }' > conftest2.c
2228if ${CC-cc} $CFLAGS -c conftest1.c >conftest.out 2>&1 ; then
2229    if ${AR-ar} cr libconftest.a conftest1.o >/dev/null 2>&1 ; then
2230        if ${RANLIB-:} libconftest.a >/dev/null 2>&1 ; then
2231            # Anything less than sleep 10, and Mac OS/X (Darwin)
2232            # will claim that install works because ranlib won't complain
2233            sleep 10
2234            libinstall="$INSTALL_DATA"
2235            eval "libinstall=\"$libinstall\""
2236            if ${libinstall} libconftest.a libconftest1.a  >/dev/null 2>&1 ; then
2237                if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest1.a >>conftest.out 2>&1 && test -x conftest ; then
2238                    # Success!  Install works
2239                    ac_cv_prog_install_breaks_libs=no
2240                else
2241                    # Failure!  Does install -p work?   
2242                    rm -f libconftest1.a
2243                    if ${libinstall} -p libconftest.a libconftest1.a >/dev/null 2>&1 ; then
2244                        if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest1.a >>conftest.out 2>&1 && test -x conftest ; then
2245                        # Success!  Install works
2246                            ac_cv_prog_install_breaks_libs="no, with -p"
2247                        fi
2248                    fi
2249                fi
2250            fi
2251        fi
2252    fi
2253fi
2254# This is needed for Mac OSX 10.5
2255rm -rf conftest.dSYM
2256rm -f conftest* libconftest*])
2257
2258if test -z "$RANLIB_AFTER_INSTALL" ; then
2259    RANLIB_AFTER_INSTALL=no
2260fi
2261case "$ac_cv_prog_install_breaks_libs" in
2262        yes)
2263            RANLIB_AFTER_INSTALL=yes
2264        ;;
2265        "no, with -p")
2266            INSTALL_DATA="$INSTALL_DATA -p"
2267        ;;
2268        *)
2269        # Do nothing
2270        :
2271        ;;
2272esac
2273AC_SUBST(RANLIB_AFTER_INSTALL)
2274])
2275
2276#
2277# determine if the compiler defines a symbol containing the function name
2278# Inspired by checks within the src/mpid/globus/configure.in file in MPICH2
2279#
2280# These tests check not only that the compiler defines some symbol, such
2281# as __FUNCTION__, but that the symbol correctly names the function.
2282#
2283# Defines
2284#   HAVE__FUNC__      (if __func__ defined)
2285#   HAVE_CAP__FUNC__  (if __FUNC__ defined)
2286#   HAVE__FUNCTION__  (if __FUNCTION__ defined)
2287#
2288AC_DEFUN([PAC_CC_FUNCTION_NAME_SYMBOL],[
2289AC_CACHE_CHECK([whether the compiler defines __func__],
2290pac_cv_have__func__,[
2291tmp_am_cross=no
2292AC_RUN_IFELSE([
2293#include <string.h>
2294int foo(void);
2295int foo(void)
2296{
2297    return (strcmp(__func__, "foo") == 0);
2298}
2299int main(int argc, char ** argv)
2300{
2301    return (foo() ? 0 : 1);
2302}
2303], pac_cv_have__func__=yes, pac_cv_have__func__=no,tmp_am_cross=yes)
2304if test "$tmp_am_cross" = yes ; then
2305    AC_LINK_IFELSE([
2306#include <string.h>
2307int foo(void);
2308int foo(void)
2309{
2310    return (strcmp(__func__, "foo") == 0);
2311}
2312int main(int argc, char ** argv)
2313{
2314    return (foo() ? 0 : 1);
2315}
2316], pac_cv_have__func__=yes, pac_cv_have__func__=no)
2317fi
2318])
2319
2320if test "$pac_cv_have__func__" = "yes" ; then
2321    AC_DEFINE(HAVE__FUNC__,,[define if the compiler defines __func__])
2322fi
2323
2324AC_CACHE_CHECK([whether the compiler defines __FUNC__],
2325pac_cv_have_cap__func__,[
2326tmp_am_cross=no
2327AC_RUN_IFELSE([
2328#include <string.h>
2329int foo(void);
2330int foo(void)
2331{
2332    return (strcmp(__FUNC__, "foo") == 0);
2333}
2334int main(int argc, char ** argv)
2335{
2336    return (foo() ? 0 : 1);
2337}
2338], pac_cv_have_cap__func__=yes, pac_cv_have_cap__func__=no,tmp_am_cross=yes)
2339if test "$tmp_am_cross" = yes ; then
2340    AC_LINK_IFELSE([
2341#include <string.h>
2342int foo(void);
2343int foo(void)
2344{
2345    return (strcmp(__FUNC__, "foo") == 0);
2346}
2347int main(int argc, char ** argv)
2348{
2349    return (foo() ? 0 : 1);
2350}
2351], pac_cv_have__func__=yes, pac_cv_have__func__=no)
2352fi
2353])
2354
2355if test "$pac_cv_have_cap__func__" = "yes" ; then
2356    AC_DEFINE(HAVE_CAP__FUNC__,,[define if the compiler defines __FUNC__])
2357fi
2358
2359AC_CACHE_CHECK([whether the compiler sets __FUNCTION__],
2360pac_cv_have__function__,[
2361tmp_am_cross=no
2362AC_RUN_IFELSE([
2363#include <string.h>
2364int foo(void);
2365int foo(void)
2366{
2367    return (strcmp(__FUNCTION__, "foo") == 0);
2368}
2369int main(int argc, char ** argv)
2370{
2371    return (foo() ? 0 : 1);
2372}
2373], pac_cv_have__function__=yes, pac_cv_have__function__=no,tmp_am_cross=yes)
2374if test "$tmp_am_cross" = yes ; then
2375    AC_LINK_IFELSE([
2376#include <string.h>
2377int foo(void);
2378int foo(void)
2379{
2380    return (strcmp(__FUNCTION__, "foo") == 0);
2381}
2382int main(int argc, char ** argv)
2383{
2384    return (foo() ? 0 : 1);
2385}
2386], pac_cv_have__func__=yes, pac_cv_have__func__=no)
2387fi
2388])
2389
2390if test "$pac_cv_have__function__" = "yes" ; then
2391    AC_DEFINE(HAVE__FUNCTION__,,[define if the compiler defines __FUNCTION__])
2392fi
2393
2394])
Note: See TracBrowser for help on using the browser.