1#!/bin/sh
2# Copyright (C) 1992, 1993, 1994, 1997, 1998, 1999 Free Software Foundation
3# 
4# This file is part of the GNU IO Library.  This library is free
5# software; you can redistribute it and/or modify it under the
6# terms of the GNU General Public License as published by the
7# Free Software Foundation; either version 2, or (at your option)
8# any later version.
9# 
10# This library is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14# 
15# You should have received a copy of the GNU General Public License
16# along with this library; see the file COPYING.  If not, write to the Free
17# Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
19#    Written by Per Bothner (bothner@cygnus.com)
20
21# This is a shell-script that figures out various things about a
22# system, and writes (to stdout) a C-style include files with
23# suitable definitions, including all the standard Posix types.
24# It works by compiling various test programs -- some are run through
25# the C pre-processor, and the output examined.
26# The test programs are only compiled, not executed, so the script
27# should even if you're cross-compiling.
28# It uses $CC (which defaults to cc) to compile C programs (extension .c),
29# and $CXX (which defaults to gcc) to compile C++ programs (extension .C).
30# The shell-script is written for libg++.a.
31
32# Usage: gen-params [NAME1=name1 ...]
33# - where an assignment (such as size_t="unsigned int" means to
34# use that value, instead of trying to figure it out.
35
36# Uncomment following line for debugging
37# set -x
38
39SED=sed
40
41# Evaluate the arguments (which should be assignments):
42for arg in "$@"; do
43  # Quote arg (i.e. FOO=bar => FOO='bar'), then eval it.
44  eval `echo "$arg" | ${SED} -e "s|^\(.*\)=\(.*\)|\1='\2'|"`
45done
46
47macro_prefix=${macro_prefix-"_G_"}
48rootdir=`pwd`/..
49gccdir=${gccdir-${rootdir}/gcc}
50binutilsdir=${binutilsdir-${rootdir}/binutils}
51CC=${CC-`if [ -f ${gccdir}/xgcc ] ; \
52	then echo ${gccdir}/xgcc -B${gccdir}/ ; \
53	else echo cc ; fi`}
54CXX=${CXX-`if [ -f ${gccdir}/xgcc ] ; \
55	then echo ${gccdir}/xgcc -B${gccdir}/ ; \
56	else echo gcc ; fi`}
57CPP=${CPP-`echo ${CC} -E`}
58CONFIG_NM=${CONFIG_NM-`if [ -f ${binutilsdir}/nm.new ] ; \
59	then echo ${binutilsdir}/nm.new ; \
60	else echo nm ; fi`}
61
62cat <<!EOF!
63/* AUTOMATICALLY GENERATED; DO NOT EDIT! */ 
64#ifndef ${macro_prefix}config_h
65#define ${macro_prefix}config_h
66!EOF!
67
68if [ x"${LIB_VERSION}" != "x" ] ; then
69  echo "#define ${macro_prefix}LIB_VERSION" '"'${LIB_VERSION}'"'
70fi
71
72# This program is used to test if the compiler prepends '_' before identifiers.
73# It is also used to check the g++ uses '$' or '.' various places.
74
75if test -z "${NAMES_HAVE_UNDERSCORE}" \
76   || test -z "${DOLLAR_IN_LABEL}" \
77   || test -z "${VTABLE_LABEL_PREFIX}"; then
78  cat >dummy.h <<!EOF!
79#ifdef __GNUG__
80#pragma interface
81#endif
82  struct filebuf {
83      virtual int foo();
84  };
85!EOF!
86  cat >dummy.C <<!EOF!
87#ifdef __GNUG__
88#pragma implementation
89#endif
90#include "dummy.h"
91  int filebuf::foo() { return 0; }
92  extern "C" int FUNC(int);
93  int FUNC(int i) { return i+10; }
94!EOF!
95
96  if ${CXX} -O -c dummy.C ; then
97    if test -z "${NAMES_HAVE_UNDERSCORE}" ; then
98      if test "`${CONFIG_NM} dummy.o | grep _FUNC`" != ""; then
99        NAMES_HAVE_UNDERSCORE=1
100      elif test "`${CONFIG_NM} dummy.o | grep FUNC`" != ""; then
101        NAMES_HAVE_UNDERSCORE=0
102      else
103        echo "${CONFIG_NM} failed to find FUNC in dummy.o!" 1>&2; exit -1;
104      fi
105    fi
106    echo "#define ${macro_prefix}NAMES_HAVE_UNDERSCORE ${NAMES_HAVE_UNDERSCORE}"
107
108    if test -z "${VTABLE_LABEL_PREFIX}" ; then
109      # Determine how virtual function tables are named.  This is fragile,
110      # because different nm's produce output in different formats.
111      ${CONFIG_NM} dummy.o >TMP
112      if [ -n "`${SED} -n -e 's/ virtual table/nope/p' <TMP`" ] ; then
113	${CONFIG_NM} --no-cplus dummy.o >TMP 2>/dev/null ||
114	  ${CONFIG_NM} --no-demangle dummy.o >TMP 2>/dev/null ||
115	  ${CONFIG_NM} dummy.o >TMP 2>/dev/null
116      fi
117      # First we look for a pattern that matches historical output from g++.
118      # We surround the actual label name by <> to separate it from
119      # other nm junk. 
120      ${SED} -n -e 's/_*vt[$_.]7*filebuf/<&>/p' <TMP >dummy.out
121      # For paranoia's sake (e.g. if we're using some other C++ compiler)
122      # we try a more general pattern, and append the result.
123      grep -v foo <TMP \
124	| ${SED} -n -e 's/[a-zA-Z0-9_.$]*filebuf[a-zA-Z0-9_.$]*/<&>/p' \
125	>>dummy.out
126      # Now we get rid of the <>, and any other junk on the nm output line.
127      # (We get rid of <filebuf> in case nm included debugging output for
128      # class filebuf itself.)  On windows32, we also need to delete the 
129      # unique sections (.data$_vt$*), otherwise we get the wrong result.
130      # Finally, we select the first line of the result, and hope that's 
131      # what we wanted!
132      vtab_name=`${SED} -n -e '/<filebuf>/d' \
133        -e '/\.data[$_.]<_vt\$7filebuf>/d' \
134        -e 's/^.*<\(.*\)>.*$/\1/p' \
135        <dummy.out | ${SED} -n -e '1p'`
136      case "${vtab_name}" in
137        *7filebuf) echo "#define ${macro_prefix}VTABLE_LABEL_HAS_LENGTH 1" ;;
138        *) echo "#define ${macro_prefix}VTABLE_LABEL_HAS_LENGTH 0" ;;
139      esac
140      VTABLE_LABEL_PREFIX=`echo $vtab_name | ${SED} -e 's/7*filebuf//'`
141    fi
142    echo "#define ${macro_prefix}VTABLE_LABEL_PREFIX" '"'"${VTABLE_LABEL_PREFIX}"'"'
143    if [ "${VTABLE_LABEL_PREFIX}" = "__vt_" -o \
144        "${VTABLE_LABEL_PREFIX}" = "___vt_" ] ; then
145      echo "#define ${macro_prefix}USING_THUNKS"
146    fi
147
148    # VTABLE_LABEL_PREFIX_ID is the same as VTABLE_LABEL_PREFIX,
149    # but the former is a C identifier, while the latter is a quoted
150    # st
151    if [ -z ""`echo ${VTABLE_LABEL_PREFIX} | ${SED} -e 's/[a-zA-Z0-9_]//g'` ] ; then
152      if [ "${NAMES_HAVE_UNDERSCORE}" = "1" ] ; then
153	VTABLE_LABEL_PREFIX=`echo ${VTABLE_LABEL_PREFIX} | ${SED} -e 's/^_//'`
154      fi
155      echo "#define ${macro_prefix}VTABLE_LABEL_PREFIX_ID ${VTABLE_LABEL_PREFIX}"
156    fi
157
158#    if test -n "${DOLLAR_IN_LABEL}" ; then
159#      echo "#define ${macro_prefix}DOLLAR_IN_LABEL ${DOLLAR_IN_LABEL}"
160#    elif test "`${CONFIG_NM} dummy.o | grep 'vt[$$]7filebuf'`" != ""; then
161#      echo "#define ${macro_prefix}DOLLAR_IN_LABEL 1"
162#    elif test "`${CONFIG_NM} dummy.o | grep 'vt[.]7filebuf'`" != ""; then
163#      echo "#define ${macro_prefix}DOLLAR_IN_LABEL 0"
164#    elif test "`${CONFIG_NM} dummy.o | grep 'vtbl__7filebuf'`" != ""; then
165#      echo "#define ${macro_prefix}DOLLAR_IN_LABEL 0"
166#    else
167#      echo "gen-params: ${CONFIG_NM} failed to find vt[.\$]filebuf in dummy.o!" 1>&2; exit 1
168#    fi
169  else
170    # The compile failed for some reason (no C++?)
171    echo "gen-params: could not compile dummy.C with ${CXX}" 1>&2; exit 1;
172  fi
173fi
174
175# A little test program to check if struct stat has st_blksize.
176cat >dummy.c <<!EOF!
177#include <sys/types.h>
178#include <sys/stat.h>
179int BLKSIZE(struct stat *st)
180{
181    return st->st_blksize;
182}
183!EOF!
184
185if ${CC} -c dummy.c >/dev/null 2>&1 ; then
186  echo "#define ${macro_prefix}HAVE_ST_BLKSIZE 1"
187else
188  echo "#define ${macro_prefix}HAVE_ST_BLKSIZE 0"
189fi
190
191# A little test program to check if the name 'clog' is defined in libm,
192# as it is under DEC UNIX.
193cat >dummy.c <<!EOF!
194int clog;
195main () {}
196!EOF!
197
198if ${CC} dummy.c -lm 2>&1 >/dev/null | grep clog >/dev/null; then
199  echo "#define ${macro_prefix}CLOG_CONFLICT 1"
200fi
201
202echo ""
203
204# Next, generate definitions for the standard types (such as mode_t)
205# compatible with those in the standard C header files.
206# It works by a dummy program through the C pre-processor, and then
207# using sed to search for typedefs in the output.
208
209for hdr in wchar wctype; do
210  eval $hdr=0
211  cat >dummy.c <<EOF
212#include <${hdr}.h>
213EOF
214  if ${CPP} dummy.c >/dev/null 2>&1 ; then eval $hdr=1; fi
215done
216
217cat >dummy.c <<!EOF!
218#include <sys/types.h>
219#include <stddef.h>
220#ifdef __STDC__
221#include <stdarg.h>
222#else /* !__STDC__ */
223#include <varargs.h>
224#endif /* __STDC__ */
225#include <stdio.h>
226#include <time.h>
227#include <signal.h>
228#ifdef __STDC__
229#include <limits.h>
230#endif
231#if WCHAR == 1
232#include <wchar.h>
233#endif
234#if WCTYPE == 1
235#include <wctype.h>
236#endif
237#ifdef size_t
238typedef size_t Xsize_t;
239#elif defined(__SIZE_TYPE__)
240typedef __SIZE_TYPE__ Xsize_t;
241#endif
242#ifdef ptrdiff_t
243typedef ptrdiff_t Xptrdiff_t;
244#elif defined(__PTRDIFF_TYPE__)
245typedef __PTRDIFF_TYPE__ Xptrdiff_t;
246#endif
247#ifdef wchar_t
248typedef wchar_t Xwchar_t;
249#elif defined(__WCHAR_TYPE__)
250typedef __WCHAR_TYPE__ Xwchar_t;
251#endif
252#ifdef va_list
253typedef va_list XXXva_list;
254#endif
255#ifdef BUFSIZ
256long XBUFSIZ=BUFSIZ;
257#endif
258#ifdef FOPEN_MAX
259long XFOPEN_MAX=FOPEN_MAX;
260#endif
261#ifdef FILENAME_MAX
262long XFILENAME_MAX=FILENAME_MAX;
263#endif
264#ifdef SHRT_MAX
265long XSHRT_MAX=SHRT_MAX;
266#endif
267#ifdef INT_MAX
268long XINT_MAX=INT_MAX;
269#endif
270#ifdef LONG_MAX
271long XLONG_MAX=LONG_MAX;
272#endif
273#ifdef LONG_LONG_MAX
274long XLONG_LONG_MAX=LONG_LONG_MAX;
275#endif
276!EOF!
277
278if ${CPP} dummy.c -DWCHAR=$wchar -DWCTYPE=$wctype >TMP ; then true
279else
280  echo "gen-params: could not invoke ${CPP} on dummy.c" 1>&2 ; exit 1
281fi
282tr '	' ' ' <TMP >dummy.out
283
284for TYPE in dev_t clock_t fpos_t fpos64_t gid_t ino_t mode_t nlink_t off_t off64_t pid_t ptrdiff_t sigset_t size_t ssize_t time_t uid_t va_list wchar_t wint_t int16_t uint16_t int32_t uint_32_t u_int16_t u_int32_t; do
285    eval IMPORTED=\$$TYPE
286    if [ -n "${IMPORTED}" ] ; then
287	eval "$TYPE='$IMPORTED'"
288    else
289	t=$TYPE
290	VALUE=''
291
292	# Follow `typedef VALUE TYPE' chains, but don't loop indefinitely.
293	for iteration in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
294	    # Search dummy.out for a typedef for X*$t.
295	    sed_script="
296		s/unsigned long long int/_G_ullong/g
297		s/long long int/_G_llong/g
298		s/unsigned long long/_G_ullong/g
299		s/long long/_G_llong/g
300		/.*typedef  *\\(.*[^ ]\\)  *X*$t *;.*/{s||\1|;p;q;}
301		/.*typedef  *\\(.*[^ a-zA-Z0-9_]\\)X*$t *;.*/{s||\1|;p;q;}
302	    "
303	    t=`${SED} -n "$sed_script" <dummy.out`
304	    case "$t" in
305	      '')
306		break;;
307	      *)
308		# Found a type $t; save it in VALUE.
309		VALUE=$t
310		# If it won't cause problems in matching,
311		# look for a typedef for it in turn.
312		case "$VALUE" in
313		  *.* | */* | *\ * | *\** | *\[* | *\\*) break;;
314		esac;;
315	    esac
316	done
317
318	case "$VALUE" in
319	  ?*) eval "$TYPE=\"$VALUE\""
320	esac
321    fi
322done
323
324# Look for some standard macros.
325for NAME in BUFSIZ FOPEN_MAX FILENAME_MAX NULL; do
326    eval IMPORTED=\$$NAME
327    if [ -n "${IMPORTED}" ] ; then
328	eval "$NAME='$IMPORTED /* specified */'"
329    else
330	rm -f TMP
331	${SED} -n -e 's| *;|;|g' -e "s|long X${NAME}= *\(.*\);|\1|w TMP" \
332	  <dummy.out>/dev/null
333	# Now select the first definition.
334	if [ -s TMP ]; then
335	    eval "$NAME='"`${SED} -e '2,$d' <TMP`"'"
336	fi
337    fi
338done
339
340# These macros must be numerical constants; strip any trailing 'L's.
341for NAME in SHRT_MAX INT_MAX LONG_MAX LONG_LONG_MAX; do
342    eval IMPORTED=\$$NAME
343    if [ -n "${IMPORTED}" ] ; then
344	eval "$NAME='$IMPORTED /* specified */'"
345    else
346	rm -f TMP
347	${SED} -n -e 's| *;|;|g' -e "s|long X${NAME}= *\([0-9]*\)L* *;|\1|w TMP" \
348	  <dummy.out>/dev/null
349	# Now select the first definition.
350	if [ -s TMP ]; then
351	    eval "$NAME='"`${SED} -e '2,$d' <TMP`"'"
352	fi
353    fi
354done
355
356# Figure out integral type sizes.
357
358default_int16='short /* deduction failed */'
359default_int32='long /* deduction failed */'
360INT16=32767
361INT32=2147483647
362
363if [ "${SHRT_MAX}" = $INT16 ] ; then
364  default_int16='short /* deduced */'
365  if [ "${LONG_MAX}" = $INT32 ] ; then
366    default_int32='long /* deduced */'
367  elif [ "${INT_MAX}" = $INT32 ] ; then
368    default_int32='int /* deduced */'
369  fi
370fi
371
372[ -n "$u_int16_t" ] && uint16_t="$u_int16_t"
373[ -n "$u_int32_t" ] && uint32_t="$u_int32_t"
374
375[ -z  "$int16_t" ] &&  int16_t="$default_int16"
376[ -z "$uint16_t" ] && uint16_t="unsigned $int16_t"
377[ -z  "$int32_t" ] &&  int32_t="$default_int32"
378[ -z "$uint32_t" ] && uint32_t="unsigned $int32_t"
379
380cat <<!EOF!
381#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
382typedef          int   ${macro_prefix}int8_t __attribute__((__mode__(__QI__)));
383typedef unsigned int  ${macro_prefix}uint8_t __attribute__((__mode__(__QI__)));
384typedef          int  ${macro_prefix}int16_t __attribute__((__mode__(__HI__)));
385typedef unsigned int ${macro_prefix}uint16_t __attribute__((__mode__(__HI__)));
386typedef          int  ${macro_prefix}int32_t __attribute__((__mode__(__SI__)));
387typedef unsigned int ${macro_prefix}uint32_t __attribute__((__mode__(__SI__)));
388typedef          int  ${macro_prefix}int64_t __attribute__((__mode__(__DI__)));
389typedef unsigned int ${macro_prefix}uint64_t __attribute__((__mode__(__DI__)));
390#if __GNUC__ > 2 || __GNUC_MINOR__ >= 8
391__extension__ typedef long long ${macro_prefix}llong;
392__extension__ typedef unsigned long long ${macro_prefix}ullong;
393#endif
394#else
395typedef  $int16_t  ${macro_prefix}int16_t;
396typedef $uint16_t ${macro_prefix}uint16_t;
397typedef  $int32_t  ${macro_prefix}int32_t;
398typedef $uint32_t ${macro_prefix}uint32_t;
399#endif
400
401typedef ${clock_t-int /* default */} ${macro_prefix}clock_t;
402typedef ${dev_t-int /* default */} ${macro_prefix}dev_t;
403typedef ${fpos_t-long /* default */} ${macro_prefix}fpos_t;
404typedef ${fpos64_t-long /* default */} ${macro_prefix}fpos64_t;
405typedef ${gid_t-int /* default */} ${macro_prefix}gid_t;
406typedef ${ino_t-int /* default */} ${macro_prefix}ino_t;
407typedef ${mode_t-int /* default */} ${macro_prefix}mode_t;
408typedef ${nlink_t-int /* default */} ${macro_prefix}nlink_t;
409typedef ${off_t-long /* default */} ${macro_prefix}off_t;
410typedef ${off64_t-long /* default */} ${macro_prefix}off64_t;
411typedef ${pid_t-int /* default */} ${macro_prefix}pid_t;
412#ifndef __PTRDIFF_TYPE__
413#define __PTRDIFF_TYPE__ ${ptrdiff_t-long int /* default */}
414#endif
415typedef __PTRDIFF_TYPE__ ${macro_prefix}ptrdiff_t;
416typedef ${sigset_t-int /* default */} ${macro_prefix}sigset_t;
417#ifndef __SIZE_TYPE__
418#define __SIZE_TYPE__ ${size_t-unsigned long /* default */}
419#endif
420typedef __SIZE_TYPE__ ${macro_prefix}size_t;
421typedef ${time_t-int /* default */} ${macro_prefix}time_t;
422typedef ${uid_t-int /* default */} ${macro_prefix}uid_t;
423typedef ${wchar_t-int /* default */} ${macro_prefix}wchar_t;
424
425#define ${macro_prefix}BUFSIZ ${BUFSIZ-1024 /* default */}
426#define ${macro_prefix}FOPEN_MAX ${FOPEN_MAX-32 /* default */}
427#define ${macro_prefix}FILENAME_MAX ${FILENAME_MAX-1024 /* default */}
428#if defined (__cplusplus) || defined (__STDC__)
429#define ${macro_prefix}ARGS(ARGLIST) ARGLIST
430#else
431#define ${macro_prefix}ARGS(ARGLIST) ()
432#endif
433#if !defined (__GNUG__) || defined (__STRICT_ANSI__)
434#define ${macro_prefix}NO_NRV
435#endif
436#if !defined (__GNUG__)
437#define _G_NO_EXTERN_TEMPLATES
438#endif
439!EOF!
440
441# ssize_t is the signed version of size_t
442if [ -n "${ssize_t}" ] ; then
443    echo "typedef ${ssize_t} ${macro_prefix}ssize_t;"
444elif [ -z "${size_t}" ] ; then
445    echo "typedef long ${macro_prefix}ssize_t;"
446else
447    # Remove "unsigned" from ${size_t} to get ${ssize_t}.
448    tmp="`echo ${size_t} | ${SED} -e 's|unsigned||g' -e 's|  | |g'`"
449    if [ -z "$tmp" ] ; then
450	tmp=int
451    else
452	# check $tmp doesn't conflict with <unistd.h>
453	echo "#include <unistd.h>
454	extern $tmp read();" >dummy.c
455	${CC} -c dummy.c >/dev/null 2>&1 || tmp=int
456    fi
457    echo "typedef $tmp /* default */ ${macro_prefix}ssize_t;"
458fi
459
460# wint_t is often the integral type to which wchar_t promotes.
461if [ -z "${wint_t}" ] ; then
462  for TYPE in int 'unsigned int' 'long int' 'long unsigned int'; do
463    cat >dummy.C <<!EOF!
464#ifndef __WCHAR_TYPE__
465#define __WCHAR_TYPE__ ${wchar_t-int /* default */}
466#endif
467typedef __WCHAR_TYPE__ ${macro_prefix}wchar_t;
468void foo ($TYPE);
469void foo (double);
470void bar (${macro_prefix}wchar_t w)
471{
472  foo (w);
473}
474!EOF!
475    if ${CXX} -c dummy.C >/dev/null 2>&1 ; then  
476      wint_t="$TYPE /* default */"
477      break
478    fi
479  done
480fi
481echo "typedef ${wint_t-int /* wchar_t is broken */} ${macro_prefix}wint_t;"
482
483# va_list can cause problems (e.g. some systems have va_list as a struct).
484# Check to see if ${va_list-char*} really is compatible with stdarg.h.
485cat >dummy.C <<!EOF!
486#define X_va_list ${va_list-char* /* default */}
487extern long foo(X_va_list ap); /* Check that X_va_list compiles on its own */
488extern "C" {
489#include <stdarg.h>
490}
491long foo(X_va_list ap) { return va_arg(ap, long); }
492long bar(int i, ...)
493{ va_list ap; long j; va_start(ap, i); j = foo(ap); va_end(ap); return j; }
494!EOF!
495if ${CXX} -c dummy.C >/dev/null 2>&1 ; then
496  # Ok: We have something that works.
497  echo "typedef ${va_list-char* /* default */} ${macro_prefix}va_list;"
498else
499  echo "#define ${macro_prefix}NEED_STDARG_H"
500  # Check and see if we have __gnuc_va_list, as we might set up define
501  # loops if we use va_list.
502  cat >dummy.C <<!EOF!
503#include <stdarg.h>
504long foo(__gnuc_va_list ap) { return va_arg(ap, long); }
505!EOF!
506  if ${CXX} -c dummy.C >/dev/null 2>&1 ; then
507    echo "#define ${macro_prefix}va_list __gnuc_va_list"
508  else
509    echo "#define ${macro_prefix}va_list va_list"
510  fi
511fi
512
513cat >dummy.c <<!EOF!
514#include <signal.h>
515extern int (*signal())();
516extern int dummy (int);
517main()
518{
519    int (*oldsig)(int) = signal (1, dummy);
520    (void) signal (2, oldsig);
521    return 0;
522}
523!EOF!
524if ${CC} -c dummy.c >/dev/null 2>&1 ; then
525  echo "#define ${macro_prefix}signal_return_type int"
526else
527  echo "#define ${macro_prefix}signal_return_type void"
528fi
529
530# check sprintf return type
531
532cat >dummy.c <<!EOF!
533#include <stdio.h>
534extern int sprintf(); char buf[100];
535int main() { return sprintf(buf, "%d", 34); }
536!EOF!
537if ${CC} -c dummy.c >/dev/null 2>&1 ; then
538  echo "#define ${macro_prefix}sprintf_return_type int"
539else
540  echo "#define ${macro_prefix}sprintf_return_type char*"
541fi
542
543if test -n "${HAVE_ATEXIT}" ; then
544 echo "#define ${macro_prefix}HAVE_ATEXIT ${HAVE_ATEXIT}"
545else
546  cat >dummy.c <<!EOF!
547#include <stdlib.h>
548int main()
549{
550  atexit (0);
551}
552!EOF!
553  if ${CC} dummy.c >/dev/null 2>&1 ; then
554    echo "#define ${macro_prefix}HAVE_ATEXIT 1"
555  else
556    echo "#define ${macro_prefix}HAVE_ATEXIT 0"
557  fi
558fi
559
560
561# *** Check for presence of certain include files ***
562
563# check for sys/resource.h
564
565if test -n "${HAVE_SYS_RESOURCE}" ; then
566 echo "#define ${macro_prefix}HAVE_SYS_RESOURCE ${HAVE_SYS_RESOURCE}"
567else
568  cat >dummy.c <<!EOF!
569#include <sys/types.h>
570#include <sys/time.h>
571#include <sys/resource.h>
572  int main()
573  {
574    struct rusage res;
575    getrusage(RUSAGE_SELF, &res);
576    return (int)(res.ru_utime.tv_sec + (res.ru_utime.tv_usec / 1000000.0));
577  }
578!EOF!
579  # Note: We link because some systems have sys/resource, but not getrusage().
580  if ${CC} dummy.c >/dev/null 2>&1 ; then
581    echo "#define ${macro_prefix}HAVE_SYS_RESOURCE 1"
582  else
583    echo "#define ${macro_prefix}HAVE_SYS_RESOURCE 0"
584  fi
585fi
586
587# check for struct tms in sys/times.h
588
589if test -n "${HAVE_SYS_TIMES}" ; then
590 echo "#define ${macro_prefix}HAVE_SYS_TIMES ${HAVE_SYS_TIMES}"
591else
592 cat >dummy.c <<!EOF!
593#include <sys/types.h>
594#include <sys/times.h>
595  int main()
596  {
597    struct tms s;
598    return s.tms_utime;
599  }
600!EOF!
601  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
602    echo "#define ${macro_prefix}HAVE_SYS_TIMES 1"
603  else
604    echo "#define ${macro_prefix}HAVE_SYS_TIMES 0"
605  fi
606fi
607
608# check for sys/socket.h
609
610if test -n "${HAVE_SYS_SOCKET}" ; then
611 echo "#define ${macro_prefix}HAVE_SYS_SOCKET ${HAVE_SYS_SOCKET}"
612else
613  echo '#include <sys/types.h>' >dummy.c
614  echo '#include <sys/socket.h>' >>dummy.c
615  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
616    echo "#define ${macro_prefix}HAVE_SYS_SOCKET 1"
617  else
618    echo "#define ${macro_prefix}HAVE_SYS_SOCKET 0"
619  fi
620fi
621
622# check for sys/cdefs.h
623
624if test -n "${HAVE_SYS_CDEFS}" ; then
625 echo "#define ${macro_prefix}HAVE_SYS_CDEFS ${HAVE_SYS_CDEFS}"
626else
627  echo '#include <sys/cdefs.h>' >dummy.c
628  echo 'extern int myfunc __P((int, int));' >>dummy.c
629  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
630    echo "#define ${macro_prefix}HAVE_SYS_CDEFS 1"
631  else
632    echo "#define ${macro_prefix}HAVE_SYS_CDEFS 0"
633  fi
634fi
635
636# Check for a (Posix-compatible) sys/wait.h */
637
638if test -n "${HAVE_SYS_WAIT}" ; then
639 echo "#define ${macro_prefix}HAVE_SYS_WAIT ${HAVE_SYS_WAIT}"
640else
641  cat >dummy.c <<!EOF!
642#include <sys/types.h>
643#include <sys/wait.h>
644  int f() { int i; wait(&i); return i; }
645!EOF!
646  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
647    echo "#define ${macro_prefix}HAVE_SYS_WAIT 1"
648  else
649    echo "#define ${macro_prefix}HAVE_SYS_WAIT 0"
650  fi
651fi
652
653if test -n "${HAVE_UNISTD}" ; then
654 echo "#define ${macro_prefix}HAVE_UNISTD ${HAVE_UNISTD}"
655else
656  echo '#include <unistd.h>' >dummy.c
657  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
658    echo "#define ${macro_prefix}HAVE_UNISTD 1"
659  else
660    echo "#define ${macro_prefix}HAVE_UNISTD 0"
661  fi
662fi
663
664if test -n "${HAVE_DIRENT}" ; then
665 echo "#define ${macro_prefix}HAVE_DIRENT ${HAVE_DIRENT}"
666else
667  echo '#include <sys/types.h>
668#include <dirent.h>' >dummy.c
669  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
670    echo "#define ${macro_prefix}HAVE_DIRENT 1"
671  else
672    echo "#define ${macro_prefix}HAVE_DIRENT 0"
673  fi
674fi
675
676if test -n "${HAVE_CURSES}" ; then
677 echo "#define ${macro_prefix}HAVE_CURSES ${HAVE_CURSES}"
678else
679  echo '#include <curses.h>' >dummy.c
680  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
681    echo "#define ${macro_prefix}HAVE_CURSES 1"
682  else
683    echo "#define ${macro_prefix}HAVE_CURSES 0"
684  fi
685fi
686
687# There is no test for this at the moment; it is just set by the
688# configuration files.
689if test -n "${MATH_H_INLINES}" ; then
690  echo "#define ${macro_prefix}MATH_H_INLINES ${MATH_H_INLINES}"
691else
692  echo "#define ${macro_prefix}MATH_H_INLINES 0"
693fi
694
695if test -n "${HAVE_BOOL}" ; then
696 echo "#define ${macro_prefix}HAVE_BOOL ${HAVE_BOOL}"
697else
698  echo 'bool i=true,j=false;' >dummy.C
699  if ${CXX} -c dummy.C >/dev/null 2>&1 ; then
700    echo "#define ${macro_prefix}HAVE_BOOL 1"
701  else
702    echo "#define ${macro_prefix}HAVE_BOOL 0"
703  fi
704fi
705
706if test -n "${NO_USE_DTOA}" ; then
707    echo "#define ${macro_prefix}NO_USE_DTOA 1"
708fi
709if test -n "${USE_INT32_FLAGS}" ; then
710    echo "#define ${macro_prefix}USE_INT32_FLAGS 1"
711fi
712
713# A little test program to check if __printf_fp is available.
714cat >dummy.c <<EOF
715int main()
716{
717    return __printf_fp ();
718}
719EOF
720
721if ${CC} dummy.c >/dev/null 2>&1 ; then
722  echo "#define ${macro_prefix}HAVE_PRINTF_FP 1"
723  echo "#define ${macro_prefix}HAVE_LONG_DOUBLE_IO 1"
724else
725  echo "#define ${macro_prefix}HAVE_PRINTF_FP 0"
726  echo "#define ${macro_prefix}HAVE_LONG_DOUBLE_IO 0"
727fi
728
729# Uncomment the following line if you don't have working templates.
730# echo "#define ${macro_prefix}NO_TEMPLATES"
731
732# Override bogus definitions of NULL in system headers.
733cat <<EOF
734#undef NULL
735#define __need_NULL
736#include <stddef.h>
737EOF
738
739rm -f dummy.C dummy.o dummy.c dummy.out TMP core a.out
740
741echo "#endif /* !${macro_prefix}config_h */"
742