diff options
Diffstat (limited to 'libio/gen-params')
-rwxr-xr-x | libio/gen-params | 698 |
1 files changed, 698 insertions, 0 deletions
diff --git a/libio/gen-params b/libio/gen-params new file mode 100755 index 00000000000..9fb7272dd83 --- /dev/null +++ b/libio/gen-params @@ -0,0 +1,698 @@ +#!/bin/sh +# Copyright (C) 1992, 1993, 1994 Free Software Foundation +# +# This file is part of the GNU IO Library. This library is free +# software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this library; see the file COPYING. If not, write to the Free +# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Written by Per Bothner (bothner@cygnus.com) + +# This is a shell-script that figures out various things about a +# system, and writes (to stdout) a C-style include files with +# suitable definitions, including all the standard Posix types. +# It works by compiling various test programs -- some are run through +# the C pre-processor, and the output examined. +# The test programs are only compiled, not executed, so the script +# should even if you're cross-compiling. +# It uses $CC (which defaults to cc) to compile C programs (extension .c), +# and $CXX (which defaults to gcc) to compile C++ programs (extension .C). +# The shell-script is written for libg++.a. + +# Usage: gen-params [NAME1=name1 ...] +# - where an assignment (such as size_t="unsigned int" means to +# use that value, instead of trying to figure it out. + +# Uncomment following line for debugging +# set -x + +SED=sed + +# Evaluate the arguments (which should be assignments): +for arg in "$@"; do + # Quote arg (i.e. FOO=bar => FOO='bar'), then eval it. + eval `echo "$arg" | ${SED} -e "s|^\(.*\)=\(.*\)|\1='\2'|"` +done + +macro_prefix=${macro_prefix-"_G_"} +rootdir=`pwd`/.. +gccdir=${gccdir-${rootdir}/gcc} +binutilsdir=${binutilsdir-${rootdir}/binutils} +CC=${CC-`if [ -f ${gccdir}/xgcc ] ; \ + then echo ${gccdir}/xgcc -B${gccdir}/ ; \ + else echo cc ; fi`} +CXX=${CXX-`if [ -f ${gccdir}/xgcc ] ; \ + then echo ${gccdir}/xgcc -B${gccdir}/ ; \ + else echo gcc ; fi`} +CPP=${CPP-`echo ${CC} -E`} +CONFIG_NM=${CONFIG_NM-`if [ -f ${binutilsdir}/nm.new ] ; \ + then echo ${binutilsdir}/nm.new ; \ + else echo nm ; fi`} + +cat <<!EOF! +/* AUTOMATICALLY GENERATED; DO NOT EDIT! */ +#ifndef ${macro_prefix}config_h +#define ${macro_prefix}config_h +!EOF! + +if [ x"${LIB_VERSION}" != "x" ] ; then + echo "#define ${macro_prefix}LIB_VERSION" '"'${LIB_VERSION}'"' +fi + +# This program is used to test if the compiler prepends '_' before identifiers. +# It is also used to check the g++ uses '$' or '.' various places. + +if test -z "${NAMES_HAVE_UNDERSCORE}" -o -z "${DOLLAR_IN_LABEL}" \ + -o -z "${VTABLE_LABEL_PREFIX}"; then + cat >dummy.h <<!EOF! +#ifdef __GNUG__ +#pragma interface +#endif + struct filebuf { + virtual int foo(); + }; +!EOF! + cat >dummy.C <<!EOF! +#ifdef __GNUG__ +#pragma implementation +#endif +#include "dummy.h" + int filebuf::foo() { return 0; } + extern "C" int FUNC(int); + int FUNC(int i) { return i+10; } +!EOF! + + if ${CXX} -O -c dummy.C ; then + if test -z "${NAMES_HAVE_UNDERSCORE}" ; then + if test "`${CONFIG_NM} dummy.o | grep _FUNC`" != ""; then + NAMES_HAVE_UNDERSCORE=1 + elif test "`${CONFIG_NM} dummy.o | grep FUNC`" != ""; then + NAMES_HAVE_UNDERSCORE=0 + else + echo "${CONFIG_NM} failed to find FUNC in dummy.o!" 1>&2; exit -1; + fi + fi + echo "#define ${macro_prefix}NAMES_HAVE_UNDERSCORE ${NAMES_HAVE_UNDERSCORE}" + + if test -z "${VTABLE_LABEL_PREFIX}" ; then + # Determine how virtual function tables are named. This is fragile, + # because different nm's produce output in different formats. + ${CONFIG_NM} dummy.o >TMP + if [ -n "`${SED} -n -e 's/ virtual table/nope/p' <TMP`" ] ; then + ${CONFIG_NM} --no-cplus dummy.o >TMP 2>/dev/null || + ${CONFIG_NM} --no-demangle dummy.o >TMP 2>/dev/null || + ${CONFIG_NM} dummy.o >TMP 2>/dev/null + fi + # First we look for a pattern that matches historical output from g++. + # We surround the actual label name by <> to separate it from + # other nm junk. + ${SED} -n -e 's/_*vt[$_.]7*filebuf/<&>/p' <TMP >dummy.out + # For paranoia's sake (e.g. if we're using some other C++ compiler) + # we try a more general pattern, and append the result. + grep -v foo <TMP \ + | ${SED} -n -e 's/[a-zA-Z0-9_.$]*filebuf[a-zA-Z0-9_.$]*/<&>/p' \ + >>dummy.out + # Now we get rid of the <>, and any other junk on the nm output line. + # (We get rid of <filebuf> in case nm included debugging output for + # class filebuf itself.) Finally, we select the first line of + # the result, and hope that's what we wanted! + vtab_name=`${SED} -n -e '/<filebuf>/d' -e 's/^.*<\(.*\)>.*$/\1/p' \ + <dummy.out | ${SED} -n -e '1p'` + case "${vtab_name}" in + *7filebuf) echo "#define ${macro_prefix}VTABLE_LABEL_HAS_LENGTH 1" ;; + *) echo "#define ${macro_prefix}VTABLE_LABEL_HAS_LENGTH 0" ;; + esac + VTABLE_LABEL_PREFIX=`echo $vtab_name | ${SED} -e 's/7*filebuf//'` + fi + echo "#define ${macro_prefix}VTABLE_LABEL_PREFIX" '"'"${VTABLE_LABEL_PREFIX}"'"' + if [ "${VTABLE_LABEL_PREFIX}" = "__vt_" -o \ + "${VTABLE_LABEL_PREFIX}" = "___vt_" ] ; then + echo "#define ${macro_prefix}USING_THUNKS" + fi + + # VTABLE_LABEL_PREFIX_ID is the same as VTABLE_LABEL_PREFIX, + # but the former is a C identifier, while the latter is a quoted + # st + if [ -z ""`echo ${VTABLE_LABEL_PREFIX} | ${SED} -e 's/[a-zA-Z0-9_]//g'` ] ; then + if [ "${NAMES_HAVE_UNDERSCORE}" = "1" ] ; then + VTABLE_LABEL_PREFIX=`echo ${VTABLE_LABEL_PREFIX} | ${SED} -e 's/^_//'` + fi + echo "#define ${macro_prefix}VTABLE_LABEL_PREFIX_ID ${VTABLE_LABEL_PREFIX}" + fi + +# if test -n "${DOLLAR_IN_LABEL}" ; then +# echo "#define ${macro_prefix}DOLLAR_IN_LABEL ${DOLLAR_IN_LABEL}" +# elif test "`${CONFIG_NM} dummy.o | grep 'vt[$$]7filebuf'`" != ""; then +# echo "#define ${macro_prefix}DOLLAR_IN_LABEL 1" +# elif test "`${CONFIG_NM} dummy.o | grep 'vt[.]7filebuf'`" != ""; then +# echo "#define ${macro_prefix}DOLLAR_IN_LABEL 0" +# elif test "`${CONFIG_NM} dummy.o | grep 'vtbl__7filebuf'`" != ""; then +# echo "#define ${macro_prefix}DOLLAR_IN_LABEL 0" +# else +# echo "gen-params: ${CONFIG_NM} failed to find vt[.\$]filebuf in dummy.o!" 1>&2; exit 1 +# fi + else + # The compile failed for some reason (no C++?) + echo "gen-params: could not compile dummy.C with ${CXX}" 1>&2; exit 1; + fi +fi + +# A little test program to check if struct stat has st_blksize. +cat >dummy.c <<!EOF! +#include <sys/types.h> +#include <sys/stat.h> +int BLKSIZE(struct stat *st) +{ + return st->st_blksize; +} +!EOF! + +if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_ST_BLKSIZE 1" +else + echo "#define ${macro_prefix}HAVE_ST_BLKSIZE 0" +fi + +# A little test program to check if the name 'clog' is defined in libm, +# as it is under DEC UNIX. +cat >dummy.c <<!EOF! +int clog; +main () {} +!EOF! + +if ${CC} dummy.c -lm 2>&1 >/dev/null | grep clog >/dev/null; then + echo "#define ${macro_prefix}CLOG_CONFLICT 1" +fi + +echo "" + +# Next, generate definitions for the standard types (such as mode_t) +# compatible with those in the standard C header files. +# It works by a dummy program through the C pre-processor, and then +# using sed to search for typedefs in the output. + +for hdr in wchar wctype; do + eval $hdr=0 + cat >dummy.c <<EOF +#include <${hdr}.h> +EOF + if ${CPP} dummy.c >/dev/null 2>&1 ; then eval $hdr=1; fi +done + +cat >dummy.c <<!EOF! +#include <sys/types.h> +#include <stddef.h> +#ifdef __STDC__ +#include <stdarg.h> +#else /* !__STDC__ */ +#include <varargs.h> +#endif /* __STDC__ */ +#include <stdio.h> +#include <time.h> +#include <signal.h> +#ifdef __STDC__ +#include <limits.h> +#endif +#if WCHAR == 1 +#include <wchar.h> +#endif +#if WCTYPE == 1 +#include <wctype.h> +#endif +#ifdef size_t +typedef size_t Xsize_t; +#elif defined(__SIZE_TYPE__) +typedef __SIZE_TYPE__ Xsize_t; +#endif +#ifdef ptrdiff_t +typedef ptrdiff_t Xptrdiff_t; +#elif defined(__PTRDIFF_TYPE__) +typedef __PTRDIFF_TYPE__ Xptrdiff_t; +#endif +#ifdef wchar_t +typedef wchar_t Xwchar_t; +#elif defined(__WCHAR_TYPE__) +typedef __WCHAR_TYPE__ Xwchar_t; +#endif +#ifdef va_list +typedef va_list XXXva_list; +#endif +#ifdef BUFSIZ +long XBUFSIZ=BUFSIZ; +#endif +#ifdef FOPEN_MAX +long XFOPEN_MAX=FOPEN_MAX; +#endif +#ifdef FILENAME_MAX +long XFILENAME_MAX=FILENAME_MAX; +#endif +#ifdef SHRT_MAX +long XSHRT_MAX=SHRT_MAX; +#endif +#ifdef INT_MAX +long XINT_MAX=INT_MAX; +#endif +#ifdef LONG_MAX +long XLONG_MAX=LONG_MAX; +#endif +#ifdef LONG_LONG_MAX +long XLONG_LONG_MAX=LONG_LONG_MAX; +#endif +!EOF! + +if ${CPP} dummy.c -DWCHAR=$wchar -DWCTYPE=$wctype >TMP ; then true +else + echo "gen-params: could not invoke ${CPP} on dummy.c" 1>&2 ; exit 1 +fi +tr ' ' ' ' <TMP >dummy.out + +for TYPE in dev_t clock_t fpos_t gid_t ino_t mode_t nlink_t off_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 + IMPORTED=`eval 'echo $'"$TYPE"` + if [ -n "${IMPORTED}" ] ; then + eval "$TYPE='$IMPORTED'" + else + t=$TYPE + VALUE='' + + # Follow `typedef VALUE TYPE' chains, but don't loop indefinitely. + for iteration in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do + # Search dummy.out for a typedef for X*$t. + sed_script=" + s/unsigned long long/_G_ullong/g + s/long long/_G_llong/g + /.*typedef *\\(.*[^ ]\\) *X*$t *;.*/{s||\1|;p;q;} + /.*typedef *\\(.*[^ a-zA-Z0-9_]\\)X*$t *;.*/{s||\1|;p;q;} + " + t=`${SED} -n "$sed_script" <dummy.out` + case "$t" in + '') + break;; + *) + # Found a type $t; save it in VALUE. + VALUE=$t + # If it won't cause problems in matching, + # look for a typedef for it in turn. + case "$VALUE" in + *.* | */* | *\ * | *\** | *\[* | *\\*) break;; + esac;; + esac + done + + case "$VALUE" in + ?*) eval "$TYPE=\"$VALUE\"" + esac + fi +done + +# Look for some standard macros. +for NAME in BUFSIZ FOPEN_MAX FILENAME_MAX NULL; do + IMPORTED=`eval 'echo $'"$NAME"` + if [ -n "${IMPORTED}" ] ; then + eval "$NAME='$IMPORTED /* specified */" + else + rm -f TMP + ${SED} -n -e 's| *;|;|g' -e "s|long X${NAME}= *\(.*\);|\1|w TMP" \ + <dummy.out>/dev/null + # Now select the first definition. + if [ -s TMP ]; then + eval "$NAME='"`${SED} -e '2,$d' <TMP`"'" + fi + fi +done + +# These macros must be numerical constants; strip any trailing 'L's. +for NAME in SHRT_MAX INT_MAX LONG_MAX LONG_LONG_MAX; do + IMPORTED=`eval 'echo $'"$NAME"` + if [ -n "${IMPORTED}" ] ; then + eval "$NAME='$IMPORTED /* specified */" + else + rm -f TMP + ${SED} -n -e 's| *;|;|g' -e "s|long X${NAME}= *\([0-9]*\)L* *;|\1|w TMP" \ + <dummy.out>/dev/null + # Now select the first definition. + if [ -s TMP ]; then + eval "$NAME='"`${SED} -e '2,$d' <TMP`"'" + fi + fi +done + +# Figure out integral type sizes. + +default_int16='short /* deduction failed */' +default_int32='long /* deduction failed */' +INT16=32767 +INT32=2147483647 + +if [ "${SHRT_MAX}" = $INT16 ] ; then + default_int16='short /* deduced */' + if [ "${LONG_MAX}" = $INT32 ] ; then + default_int32='long /* deduced */' + elif [ "${INT_MAX}" = $INT32 ] ; then + default_int32='int /* deduced */' + fi +fi + +[ -n "$u_int16_t" ] && uint16_t="$u_int16_t" +[ -n "$u_int32_t" ] && uint32_t="$u_int32_t" + +[ -z "$int16_t" ] && int16_t="$default_int16" +[ -z "$uint16_t" ] && uint16_t="unsigned $int16_t" +[ -z "$int32_t" ] && int32_t="$default_int32" +[ -z "$uint32_t" ] && uint32_t="unsigned $int32_t" + +cat <<!EOF! +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) +typedef int ${macro_prefix}int8_t __attribute__((__mode__(__QI__))); +typedef unsigned int ${macro_prefix}uint8_t __attribute__((__mode__(__QI__))); +typedef int ${macro_prefix}int16_t __attribute__((__mode__(__HI__))); +typedef unsigned int ${macro_prefix}uint16_t __attribute__((__mode__(__HI__))); +typedef int ${macro_prefix}int32_t __attribute__((__mode__(__SI__))); +typedef unsigned int ${macro_prefix}uint32_t __attribute__((__mode__(__SI__))); +typedef int ${macro_prefix}int64_t __attribute__((__mode__(__DI__))); +typedef unsigned int ${macro_prefix}uint64_t __attribute__((__mode__(__DI__))); +__extension__ typedef long long ${macro_prefix}llong; +__extension__ typedef unsigned long long ${macro_prefix}ullong; +#else +typedef $int16_t ${macro_prefix}int16_t; +typedef $uint16_t ${macro_prefix}uint16_t; +typedef $int32_t ${macro_prefix}int32_t; +typedef $uint32_t ${macro_prefix}uint32_t; +#endif + +typedef ${clock_t-int /* default */} ${macro_prefix}clock_t; +typedef ${dev_t-int /* default */} ${macro_prefix}dev_t; +typedef ${fpos_t-long /* default */} ${macro_prefix}fpos_t; +typedef ${gid_t-int /* default */} ${macro_prefix}gid_t; +typedef ${ino_t-int /* default */} ${macro_prefix}ino_t; +typedef ${mode_t-int /* default */} ${macro_prefix}mode_t; +typedef ${nlink_t-int /* default */} ${macro_prefix}nlink_t; +typedef ${off_t-long /* default */} ${macro_prefix}off_t; +typedef ${pid_t-int /* default */} ${macro_prefix}pid_t; +#ifndef __PTRDIFF_TYPE__ +#define __PTRDIFF_TYPE__ ${ptrdiff_t-long int /* default */} +#endif +typedef __PTRDIFF_TYPE__ ${macro_prefix}ptrdiff_t; +typedef ${sigset_t-int /* default */} ${macro_prefix}sigset_t; +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ ${size_t-unsigned long /* default */} +#endif +typedef __SIZE_TYPE__ ${macro_prefix}size_t; +typedef ${time_t-int /* default */} ${macro_prefix}time_t; +typedef ${uid_t-int /* default */} ${macro_prefix}uid_t; +typedef ${wchar_t-int /* default */} ${macro_prefix}wchar_t; + +#define ${macro_prefix}BUFSIZ ${BUFSIZ-1024 /* default */} +#define ${macro_prefix}FOPEN_MAX ${FOPEN_MAX-32 /* default */} +#define ${macro_prefix}FILENAME_MAX ${FILENAME_MAX-1024 /* default */} +#if defined (__cplusplus) || defined (__STDC__) +#define ${macro_prefix}ARGS(ARGLIST) ARGLIST +#else +#define ${macro_prefix}ARGS(ARGLIST) () +#endif +#if !defined (__GNUG__) || defined (__STRICT_ANSI__) +#define ${macro_prefix}NO_NRV +#endif +#if !defined (__GNUG__) +#define _G_NO_EXTERN_TEMPLATES +#endif +!EOF! + +# ssize_t is the signed version of size_t +if [ -n "${ssize_t}" ] ; then + echo "typedef ${ssize_t} ${macro_prefix}ssize_t;" +elif [ -z "${size_t}" ] ; then + echo "typedef long ${macro_prefix}ssize_t;" +else + # Remove "unsigned" from ${size_t} to get ${ssize_t}. + tmp="`echo ${size_t} | ${SED} -e 's|unsigned||g' -e 's| | |g'`" + if [ -z "$tmp" ] ; then + tmp=int + else + # check $tmp doesn't conflict with <unistd.h> + echo "#include <unistd.h> + extern $tmp read();" >dummy.c + ${CC} -c dummy.c >/dev/null 2>&1 || tmp=int + fi + echo "typedef $tmp /* default */ ${macro_prefix}ssize_t;" +fi + +# wint_t is often the integral type to which wchar_t promotes. +if [ -z "${wint_t}" ] ; then + for TYPE in int 'unsigned int' 'long int' 'long unsigned int'; do + cat >dummy.C <<!EOF! +#ifndef __WCHAR_TYPE__ +#define __WCHAR_TYPE__ ${wchar_t-int /* default */} +#endif +typedef __WCHAR_TYPE__ ${macro_prefix}wchar_t; +void foo ($TYPE); +void foo (double); +void bar (${macro_prefix}wchar_t w) +{ + foo (w); +} +!EOF! + if ${CXX} -c dummy.C >/dev/null 2>&1 ; then + wint_t="$TYPE /* default */" + break + fi + done +fi +echo "typedef ${wint_t-int /* wchar_t is broken */} ${macro_prefix}wint_t;" + +# va_list can cause problems (e.g. some systems have va_list as a struct). +# Check to see if ${va_list-char*} really is compatible with stdarg.h. +cat >dummy.C <<!EOF! +#define X_va_list ${va_list-char* /* default */} +extern long foo(X_va_list ap); /* Check that X_va_list compiles on its own */ +extern "C" { +#include <stdarg.h> +} +long foo(X_va_list ap) { return va_arg(ap, long); } +long bar(int i, ...) +{ va_list ap; long j; va_start(ap, i); j = foo(ap); va_end(ap); return j; } +!EOF! +if ${CXX} -c dummy.C >/dev/null 2>&1 ; then + # Ok: We have something that works. + echo "typedef ${va_list-char* /* default */} ${macro_prefix}va_list;" +else + # No, it breaks. Indicate that <stdarg.h> must be included. + echo "#define ${macro_prefix}NEED_STDARG_H +#define ${macro_prefix}va_list va_list" +fi + +cat >dummy.c <<!EOF! +#include <signal.h> +extern int (*signal())(); +extern int dummy (int); +main() +{ + int (*oldsig)(int) = signal (1, dummy); + (void) signal (2, oldsig); + return 0; +} +!EOF! +if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}signal_return_type int" +else + echo "#define ${macro_prefix}signal_return_type void" +fi + +# check sprintf return type + +cat >dummy.c <<!EOF! +#include <stdio.h> +extern int sprintf(); char buf[100]; +int main() { return sprintf(buf, "%d", 34); } +!EOF! +if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}sprintf_return_type int" +else + echo "#define ${macro_prefix}sprintf_return_type char*" +fi + +if test -n "${HAVE_ATEXIT}" ; then + echo "#define ${macro_prefix}HAVE_ATEXIT ${HAVE_ATEXIT}" +else + cat >dummy.c <<!EOF! +#include <stdlib.h> +int main() +{ + atexit (0); +} +!EOF! + if ${CC} dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_ATEXIT 1" + else + echo "#define ${macro_prefix}HAVE_ATEXIT 0" + fi +fi + + +# *** Check for presence of certain include files *** + +# check for sys/resource.h + +if test -n "${HAVE_SYS_RESOURCE}" ; then + echo "#define ${macro_prefix}HAVE_SYS_RESOURCE ${HAVE_SYS_RESOURCE}" +else + cat >dummy.c <<!EOF! +#include <sys/types.h> +#include <sys/time.h> +#include <sys/resource.h> + int main() + { + struct rusage res; + getrusage(RUSAGE_SELF, &res); + return (int)(res.ru_utime.tv_sec + (res.ru_utime.tv_usec / 1000000.0)); + } +!EOF! + # Note: We link because some systems have sys/resource, but not getrusage(). + if ${CC} dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_SYS_RESOURCE 1" + else + echo "#define ${macro_prefix}HAVE_SYS_RESOURCE 0" + fi +fi + +# check for struct tms in sys/times.h + +if test -n "${HAVE_SYS_TIMES}" ; then + echo "#define ${macro_prefix}HAVE_SYS_TIMES ${HAVE_SYS_TIMES}" +else + cat >dummy.c <<!EOF! +#include <sys/types.h> +#include <sys/times.h> + int main() + { + struct tms s; + return s.tms_utime; + } +!EOF! + if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_SYS_TIMES 1" + else + echo "#define ${macro_prefix}HAVE_SYS_TIMES 0" + fi +fi + +# check for sys/socket.h + +if test -n "${HAVE_SYS_SOCKET}" ; then + echo "#define ${macro_prefix}HAVE_SYS_SOCKET ${HAVE_SYS_SOCKET}" +else + echo '#include <sys/types.h>' >dummy.c + echo '#include <sys/socket.h>' >>dummy.c + if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_SYS_SOCKET 1" + else + echo "#define ${macro_prefix}HAVE_SYS_SOCKET 0" + fi +fi + +# check for sys/cdefs.h + +if test -n "${HAVE_SYS_CDEFS}" ; then + echo "#define ${macro_prefix}HAVE_SYS_CDEFS ${HAVE_SYS_CDEFS}" +else + echo '#include <sys/cdefs.h>' >dummy.c + echo 'extern int myfunc __P((int, int));' >>dummy.c + if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_SYS_CDEFS 1" + else + echo "#define ${macro_prefix}HAVE_SYS_CDEFS 0" + fi +fi + +# Check for a (Posix-compatible) sys/wait.h */ + +if test -n "${HAVE_SYS_WAIT}" ; then + echo "#define ${macro_prefix}HAVE_SYS_WAIT ${HAVE_SYS_WAIT}" +else + cat >dummy.c <<!EOF! +#include <sys/types.h> +#include <sys/wait.h> + int f() { int i; wait(&i); return i; } +!EOF! + if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_SYS_WAIT 1" + else + echo "#define ${macro_prefix}HAVE_SYS_WAIT 0" + fi +fi + +if test -n "${HAVE_UNISTD}" ; then + echo "#define ${macro_prefix}HAVE_UNISTD ${HAVE_UNISTD}" +else + echo '#include <unistd.h>' >dummy.c + if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_UNISTD 1" + else + echo "#define ${macro_prefix}HAVE_UNISTD 0" + fi +fi + +if test -n "${HAVE_DIRENT}" ; then + echo "#define ${macro_prefix}HAVE_DIRENT ${HAVE_DIRENT}" +else + echo '#include <sys/types.h> +#include <dirent.h>' >dummy.c + if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_DIRENT 1" + else + echo "#define ${macro_prefix}HAVE_DIRENT 0" + fi +fi + +if test -n "${HAVE_CURSES}" ; then + echo "#define ${macro_prefix}HAVE_CURSES ${HAVE_CURSES}" +else + echo '#include <curses.h>' >dummy.c + if ${CC} -c dummy.c >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_CURSES 1" + else + echo "#define ${macro_prefix}HAVE_CURSES 0" + fi +fi + +# There is no test for this at the moment; it is just set by the +# configuration files. +if test -n "${MATH_H_INLINES}" ; then + echo "#define ${macro_prefix}MATH_H_INLINES ${MATH_H_INLINES}" +else + echo "#define ${macro_prefix}MATH_H_INLINES 0" +fi + +if test -n "${HAVE_BOOL}" ; then + echo "#define ${macro_prefix}HAVE_BOOL ${HAVE_BOOL}" +else + echo 'bool i=true,j=false;' >dummy.C + if ${CXX} -c dummy.C >/dev/null 2>&1 ; then + echo "#define ${macro_prefix}HAVE_BOOL 1" + else + echo "#define ${macro_prefix}HAVE_BOOL 0" + fi +fi + +if test -n "${NO_USE_DTOA}" ; then + echo "#define ${macro_prefix}NO_USE_DTOA 1" +fi +if test -n "${USE_INT32_FLAGS}" ; then + echo "#define ${macro_prefix}USE_INT32_FLAGS 1" +fi + +# Uncomment the following line if you don't have working templates. +# echo "#define ${macro_prefix}NO_TEMPLATES" + +rm -f dummy.C dummy.o dummy.c dummy.out TMP core a.out + +echo "#endif /* !${macro_prefix}config_h */" |