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