#! /bin/sh ## ## Find stupid system include dependencies and account for them. Squirts ## a sample .h file to stdout containing [too many of] the right things. ## If you hose the output into "stupid.h", you will get MORE information. ## This takes a while to run, because it checks so many things. ## ## IF YOU HAVE a system/arch/compiler/whatever that is NOT one of: ## msdos-msc6.x ultrix-vax ultrix-mips sunos4.1.x-sparc solaris2.x-sparc ## aix-rs6k linux1.[01].x-x86 freebsd-x86 netbsd-x86 hpux ## [... hopefully this list will grow very large] ## or even if you aren't sure, you would be doing me and the net in general ## a wonderful service by running this and MAILING me the "full" output, e.g. ## ## chmod +x stupidh ## ./stupidh > stupid.h ## mail hobbit@avian.org < stupid.h ## ## WARNING: You may have to change "cc" to "gcc" below if you don't have ## "cc" [e.g. solaris, thank you very fucking much, Sun]. ## Please note any errors this generates, too... ## ## *Hobbit*, 941122 and previous. VERSION: 1.3 951107 ## ## edits: Use a consistent naming scheme, for easier identification and cleanup. ## accomodate gcc's BOGUS assumptions based on input filename. ## added a few more include-names and try-predefines; some swiped from autoconf. ## added a couple of things commonly done as #defines so we can SEE 'em ## Here is where to change "cc" to "gcc" if needed: CC=cc if test -z "${INCLUDE}" ; then INCLUDE=/usr/include fi echo '/* STUPIDH run:' uname -a echo '*/' echo '' echo "/* Includes, from ${INCLUDE} */" for xx in \ assert ctype cdefs errno file fcntl ioctl malloc stdio stdlib stdarg iostdio \ stddef dirent direct dir ndir utmp wtmp utmpx wtmpx lastlog login paths \ getopt string strings signal setjmp io param stat types time timeb utime \ dos msdos unistd socket netdb varargs sysinfo systeminfo resource ulimit \ stream stropts pstat sysmacros termio termios sgtty tty ttyent lstat select \ sockio wait vfork bsdtypes mkdev utsname sysexits \ ; do XX='' if test -f ${INCLUDE}/${xx}.h ; then echo "#include <${xx}.h>" XX=`echo $xx | tr '[a-z]' '[A-Z]'` fi if test -f ${INCLUDE}/sys/${xx}.h ; then echo "#include " XX=`echo $xx | tr '[a-z]' '[A-Z]'` fi # everyone seems to have their own conventions; this may not be complete. # thats why this is so STUPID. # HAS_xx and USE_xx might indicate functions and available library calls, # not includes. Deal... if test "${XX}" ; then echo "#define USE_${XX}_H" echo "#define HAS_${XX}_H" echo "#define HAS_${XX}" echo "#define HAS${XX}" echo "#define HAVE_${XX}_H" echo "#define HAVE_${XX}" echo "#define HAVE${XX}H" echo "#define ${XX}H" echo '' fi # Stupid hack: "dir" and "dirent" might mutually exclusive, a la GNU # includes. This is to prevent it from biting us. if test "${xx}" = "dirent" ; then echo "#ifdef _SYS_DIRENT_H" echo "#undef _SYS_DIRENT_H" echo "#endif" fi ### To make a DOS batchfile instead, do this [on a unix box!], xfer results, ### and have "xxx.bat" that types out all the cruft for %INCLUDE%\%1. ### WARNING: I might not have gotten the superquoting exactly right here... # echo "if exist %INCLUDE%\\${xx}.h call xxx ${xx}" # echo "if exist %INCLUDE%\\sys\\${xx}.h call xxx sys/${xx}" ### You also need to save and manually run the CPP input file, below. ### I've done this for msc6 and would appreciate results for other compilers. done sync sleep 1 ### Note: if all the previous output went to "stupid.h", it will be ### reincluded in the second part of this. sed -e '/^#/d' -e '/^[ ]*$/d' > st00pid.in << 'EOF' ### More recently, some of this was swiped from the "gcc" doc. Autoconf is ### worth a harder look for more ideas; havent gotten around to it yet. # architectures alpha dec ibm i370 i960 i860 ibm032 a29k indigo iris mips mipsel sparc sparclite ncr sh harris apple vax x86 ix86 i286 i386 i486 i586 pentium intel smp mpu mpu8080 mpu8086 amiga hp hppa hp400 hp9000 snake decmips mc68000 mc68010 mc68020 mc68030 m68000 m68010 m68020 m68030 m68k m88k u3b15 u3b u3b2 u3b5 u3b15 u3b20d we32k ppc powerpc arm aviion ns32000 iapx286 # minor exception to lc-vs-uc thing? iAPX286 rs6000 rs6k risc sun sun3 sun4 sun4c sun4m sequent apollo solbourne pyr pyramid interdata intertec pdp11 u370 next mac macintosh # for completeness; ya never know ... yes, found it!! -- solaris inet/common.h big_endian little_endian lsbfirst msbfirst # vendors/OSes unix munix m_unix gcos os gssc tss isc # *This* pair of imbeciles does *caseified defines*. Pinheads. One of # these might trigger before the "tr" step. NetBSD netbsd freebsd FreeBSD # cant do 386bsd, I dont think, but ... _386bsd bsd386 bsdunix bsd_2 bsd_20 bsd bsdi bsd4 bsd42 bsd43 bsd44 bsd4_2 bsd4_3 bsd4_4 linux minix ultrix ult3 ult4 bull convex convex_source res rt esix dg dgux encore osf osf1 osf2 # oops: # osf/1 mach mach386 mach_386 nextstep tahoe reno sunos sunos3 sunos4 sunos5 solaris sun_src_compat svr3 svr4 svr3_style svr4_style sysv hpux hp_ux irix sgi sony news newsos news_os luna lynxos riscos microport ewsux ews_ux mport dynix genix unicos unixware msdos dos os2 novell univel plan9 att att_unix sco odt aix aux a_ux rsx vms # compiler cruft?? ansi ansi_source ansic stdc lint sccs libc_sccs ms msc microsoft gcc gnu gnuc gnucc gnu_source sabre saber cygnus source all_source gprof prof posix posix_source posix_sources posix_c_source xopen_source args p proto no_proto prototype prototypes reentrant kernel str trace asm libcpp athena athena_compat # some preprocessors cant deal with this # c++ cxx cplusplus borland turbo turboc lattice highc # various defines that pop out of other .h files that we need to know about index strchr rindex strrchr bcopy memcpy bzero memset path_login path_lastlog path_utmp path_utmpx EOF # FL must be named something.c, so STUPID gcc recognized it as a non-object!! ( FL=st00pid.c if test -f stupid.h ; then cp stupid.h $FL sync echo '/* Re-including stupid.h */' sleep 1 else echo '/* Skipping stupid.h */' fi while read xx ; do XX=`echo $xx | tr '[a-z]' '[A-Z]'` echo "#ifdef ${xx}" >> $FL echo "\"${xx}\" = ${xx}" >> $FL echo "#endif" >> $FL echo "#ifdef _${xx}" >> $FL echo "\"_${xx}\" = _${xx}" >> $FL echo "#endif" >> $FL echo "#ifdef _${xx}_" >> $FL echo "\"_${xx}_\" = _${xx}_" >> $FL echo "#endif" >> $FL echo "#ifdef __${xx}" >> $FL echo "\"__${xx}\" = __${xx}" >> $FL echo "#endif" >> $FL echo "#ifdef __${xx}__" >> $FL echo "\"__${xx}__\" = __${xx}__" >> $FL echo "#endif" >> $FL echo "#ifdef ${XX}" >> $FL echo "\"${XX}\" = ${XX}" >> $FL echo "#endif" >> $FL echo "#ifdef _${XX}" >> $FL echo "\"_${XX}\" = _${XX}" >> $FL echo "#endif" >> $FL echo "#ifdef _${XX}_" >> $FL echo "\"_${XX}_\" = _${XX}_" >> $FL echo "#endif" >> $FL echo "#ifdef __${XX}" >> $FL echo "\"__${XX}\" = __${XX}" >> $FL echo "#endif" >> $FL echo "#ifdef __${XX}__" >> $FL echo "\"__${XX}__\" = __${XX}__" >> $FL echo "#endif" >> $FL done # and pick up a few specials echo "#ifdef major" >> $FL echo "\"major\" = major (x)" >> $FL echo "\"minor\" = minor (x)" >> $FL echo "#endif" >> $FL echo "#ifdef FD_SETSIZE" >> $FL echo "\"FD_SETSIZE\" = FD_SETSIZE" >> $FL echo "#endif" >> $FL ) < st00pid.in sync echo '/* Compiler predefines:' ${CC} -E st00pid.c | sed -e '/^#/d' -e '/^[ ]*$/d' echo '*/' sync cat > st00pid.c << 'EOF' #include main() { union { char *bletch; int *i; } yow; static char orig[16]; strcpy (orig, "ABCDEFGHIJK"); yow.bletch = orig; printf ("endian thing: %s = 0x%lx, addrbyte = %x -- ", yow.bletch, *yow.i, *yow.i & 0xFF); printf (((*yow.i & 0xff) == 0x41) ? "LITTLE\n" : "BIG\n"); printf ("short %d; int %d; long %d\n", sizeof (short), sizeof (int), sizeof (long)); } EOF ${CC} -o st00pid.x st00pid.c echo '/* Architecture:' ./st00pid.x echo '*/' ### dont nuke if generating DOS batchfiles rm -f st00pid.* sync exit 0 ### stuff remaining to deal with: # maybe take out the slew of HAS_* and HAS* excess predefines, and only use # our "standardized" scheme [like we were going to generate a real includible # file outa this??] # various POSIX_ME_HARDERisms: # vfork # lockf/flock/fcntl/euuugh # signal stuff # termio/termios/sgtty hair # strdup and related # ifdef HAVE_STD_LIB and such nonsense # auto-sniff cc-vs-gcc somehow? maybe a straight OR with exit statii..