| #! /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 <sys/${xx}.h>" |
| 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 <stdio.h> |
| 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.. |
| |