#!/bin/sh
SED=sed
for arg in "$@"; do
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! */
!EOF!
if [ x"${LIB_VERSION}" != "x" ] ; then
echo "#define ${macro_prefix}LIB_VERSION" '"'${LIB_VERSION}'"'
fi
if test -z "${NAMES_HAVE_UNDERSCORE}" \
|| test -z "${DOLLAR_IN_LABEL}" \
|| test -z "${VTABLE_LABEL_PREFIX}"; then
cat >dummy.h <<!EOF!
struct filebuf {
virtual int foo();
};
!EOF!
cat >dummy.C <<!EOF!
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
${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
${SED} -n -e 's/_*vt[$_.]7*filebuf/<&>/p' <TMP >dummy.out
grep -v foo <TMP \
| ${SED} -n -e 's/[a-zA-Z0-9_.$]*filebuf[a-zA-Z0-9_.$]*/<&>/p' \
>>dummy.out
vtab_name=`${SED} -n -e '/<filebuf>/d' \
-e '/\.data[$_.]<_vt\$7filebuf>/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
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
else
echo "gen-params: could not compile dummy.C with ${CXX}" 1>&2; exit 1;
fi
fi
cat >dummy.c <<!EOF!
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
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 ""
for hdr in wchar wctype; do
eval $hdr=0
cat >dummy.c <<EOF
EOF
if ${CPP} dummy.c >/dev/null 2>&1 ; then eval $hdr=1; fi
done
cat >dummy.c <<!EOF!
typedef size_t Xsize_t;
typedef __SIZE_TYPE__ Xsize_t;
typedef ptrdiff_t Xptrdiff_t;
typedef __PTRDIFF_TYPE__ Xptrdiff_t;
typedef wchar_t Xwchar_t;
typedef __WCHAR_TYPE__ Xwchar_t;
typedef va_list XXXva_list;
long XBUFSIZ=BUFSIZ;
long XFOPEN_MAX=FOPEN_MAX;
long XFILENAME_MAX=FILENAME_MAX;
long XSHRT_MAX=SHRT_MAX;
long XINT_MAX=INT_MAX;
long XLONG_MAX=LONG_MAX;
long XLONG_LONG_MAX=LONG_LONG_MAX;
!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
eval IMPORTED=\$$TYPE
if [ -n "${IMPORTED}" ] ; then
eval "$TYPE='$IMPORTED'"
else
t=$TYPE
VALUE=''
for iteration in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
sed_script="
s/unsigned long long int/_G_ullong/g
s/long long int/_G_llong/g
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;;
*)
VALUE=$t
case "$VALUE" in
*.* | */* | *\ * | *\** | *\[* | *\\*) break;;
esac;;
esac
done
case "$VALUE" in
?*) eval "$TYPE=\"$VALUE\""
esac
fi
done
for NAME in BUFSIZ FOPEN_MAX FILENAME_MAX NULL; do
eval IMPORTED=\$$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
if [ -s TMP ]; then
eval "$NAME='"`${SED} -e '2,$d' <TMP`"'"
fi
fi
done
for NAME in SHRT_MAX INT_MAX LONG_MAX LONG_LONG_MAX; do
eval IMPORTED=\$$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
if [ -s TMP ]; then
eval "$NAME='"`${SED} -e '2,$d' <TMP`"'"
fi
fi
done
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!
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;
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;
typedef long long ${macro_prefix}int64_t;
typedef unsigned long long ${macro_prefix}uint64_t;
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;
typedef __PTRDIFF_TYPE__ ${macro_prefix}ptrdiff_t;
typedef ${sigset_t-int /* default */} ${macro_prefix}sigset_t;
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;
!EOF!
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
tmp="`echo ${size_t} | ${SED} -e 's|unsigned||g' -e 's| | |g'`"
if [ -z "$tmp" ] ; then
tmp=int
else
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
if [ -z "${wint_t}" ] ; then
for TYPE in int 'unsigned int' 'long int' 'long unsigned int'; do
cat >dummy.C <<!EOF!
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;"
cat >dummy.C <<!EOF!
extern long foo(X_va_list ap); /* Check that X_va_list compiles on its own */
extern "C" {
}
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
echo "typedef ${va_list-char* /* default */} ${macro_prefix}va_list;"
else
echo "#define ${macro_prefix}NEED_STDARG_H"
cat >dummy.C <<!EOF!
long foo(__gnuc_va_list ap) { return va_arg(ap, long); }
!EOF!
if ${CXX} -c dummy.C >/dev/null 2>&1 ; then
echo "#define ${macro_prefix}va_list __gnuc_va_list"
else
echo "#define ${macro_prefix}va_list va_list"
fi
fi
cat >dummy.c <<!EOF!
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
cat >dummy.c <<!EOF!
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!
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
if test -n "${HAVE_SYS_RESOURCE}" ; then
echo "#define ${macro_prefix}HAVE_SYS_RESOURCE ${HAVE_SYS_RESOURCE}"
else
cat >dummy.c <<!EOF!
int main()
{
struct rusage res;
getrusage(RUSAGE_SELF, &res);
return (int)(res.ru_utime.tv_sec + (res.ru_utime.tv_usec / 1000000.0));
}
!EOF!
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
if test -n "${HAVE_SYS_TIMES}" ; then
echo "#define ${macro_prefix}HAVE_SYS_TIMES ${HAVE_SYS_TIMES}"
else
cat >dummy.c <<!EOF!
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
if test -n "${HAVE_SYS_SOCKET}" ; then
echo "#define ${macro_prefix}HAVE_SYS_SOCKET ${HAVE_SYS_SOCKET}"
else
echo ' echo ' 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
if test -n "${HAVE_SYS_CDEFS}" ; then
echo "#define ${macro_prefix}HAVE_SYS_CDEFS ${HAVE_SYS_CDEFS}"
else
echo ' 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
if test -n "${HAVE_SYS_WAIT}" ; then
echo "#define ${macro_prefix}HAVE_SYS_WAIT ${HAVE_SYS_WAIT}"
else
cat >dummy.c <<!EOF!
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 ' 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 ' 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 ' 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
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
cat >dummy.c <<EOF
int main()
{
return __printf_fp ();
}
EOF
if ${CC} dummy.c >/dev/null 2>&1 ; then
echo "#define ${macro_prefix}HAVE_PRINTF_FP 1"
echo "#define ${macro_prefix}HAVE_LONG_DOUBLE_IO 1"
else
echo "#define ${macro_prefix}HAVE_PRINTF_FP 0"
echo "#define ${macro_prefix}HAVE_LONG_DOUBLE_IO 0"
fi
cat <<EOF
EOF
rm -f dummy.C dummy.o dummy.c dummy.out TMP core a.out
echo "#endif /* !${macro_prefix}config_h */"