1
#! /bin/sh
2
##
3
## Find stupid system include dependencies and account for them.  Squirts
4
## a sample .h file to stdout containing [too many of] the right things.
5
## If you hose the output into "stupid.h", you will get MORE information.
6
## This takes a while to run, because it checks so many things.
7
##
8
## IF YOU HAVE a system/arch/compiler/whatever that is NOT one of:
9
##   msdos-msc6.x  ultrix-vax ultrix-mips  sunos4.1.x-sparc  solaris2.x-sparc
10
##   aix-rs6k  linux1.[01].x-x86  freebsd-x86  netbsd-x86 hpux
11
##   [... hopefully this list will grow very large]
12
## or even if you aren't sure, you would be doing me and the net in general
13
## a wonderful service by running this and MAILING me the "full" output, e.g.
14
##
15
##    chmod +x stupidh
16
##    ./stupidh > stupid.h
17
##    mail hobbit@avian.org < stupid.h
18
##
19
## WARNING: You may have to change "cc" to "gcc" below if you don't have
20
## "cc" [e.g. solaris, thank you very fucking much, Sun].
21
## Please note any errors this generates, too...
22
##
23
## *Hobbit*, 941122 and previous.  VERSION: 1.3 951107
24
##
25
## edits: Use a consistent naming scheme, for easier identification and cleanup.
26
## accomodate gcc's BOGUS assumptions based on input filename.
27
## added a few more include-names and try-predefines; some swiped from autoconf.
28
## added a couple of things commonly done as #defines so we can SEE 'em
29
30
## Here is where to change "cc" to "gcc" if needed:
31
CC=cc
32
33
if test -z "${INCLUDE}" ; then
34
  INCLUDE=/usr/include
35
fi
36
37
echo '/* STUPIDH run:'
38
uname -a
39
echo '*/'
40
echo ''
41
42
echo "/* Includes, from ${INCLUDE} */"
43
for xx in \
44
assert ctype cdefs errno file fcntl ioctl malloc stdio stdlib stdarg iostdio \
45
stddef dirent direct dir ndir utmp wtmp utmpx wtmpx lastlog login paths \
46
getopt string strings signal setjmp io param stat types time timeb utime \
47
dos msdos unistd socket netdb varargs sysinfo systeminfo resource ulimit \
48
stream stropts pstat sysmacros termio termios sgtty tty ttyent lstat select \
49
sockio wait vfork bsdtypes mkdev utsname sysexits \
50
; do
51
52
  XX=''
53
  if test -f ${INCLUDE}/${xx}.h ; then
54
    echo "#include <${xx}.h>"
55
    XX=`echo $xx | tr '[a-z]' '[A-Z]'`
56
  fi
57
  if test -f ${INCLUDE}/sys/${xx}.h ; then
58
    echo "#include <sys/${xx}.h>"
59
    XX=`echo $xx | tr '[a-z]' '[A-Z]'`
60
  fi
61
62
# everyone seems to have their own conventions; this may not be complete.
63
# thats why this is so STUPID.
64
# HAS_xx and USE_xx might indicate functions and available library calls,
65
# not includes.  Deal...
66
67
  if test "${XX}" ; then
68
    echo "#define USE_${XX}_H"
69
    echo "#define HAS_${XX}_H"
70
    echo "#define HAS_${XX}"
71
    echo "#define HAS${XX}"
72
    echo "#define HAVE_${XX}_H"
73
    echo "#define HAVE_${XX}"
74
    echo "#define HAVE${XX}H"
75
    echo "#define ${XX}H"
76
    echo ''
77
  fi
78
# Stupid hack: "dir" and "dirent" might mutually exclusive, a la GNU
79
# includes.  This is to prevent it from biting us.
80
  if test "${xx}" =  "dirent" ; then
81
    echo "#ifdef _SYS_DIRENT_H"
82
    echo "#undef _SYS_DIRENT_H"
83
    echo "#endif"
84
  fi
85
86
### To make a DOS batchfile instead, do this [on a unix box!], xfer results,
87
### and have "xxx.bat" that types out all the cruft for %INCLUDE%\%1.
88
### WARNING: I might not have gotten the superquoting exactly right here...
89
# echo "if exist %INCLUDE%\\${xx}.h call xxx ${xx}"
90
# echo "if exist %INCLUDE%\\sys\\${xx}.h call xxx sys/${xx}"
91
### You also need to save and manually run the CPP input file, below.
92
### I've done this for msc6 and would appreciate results for other compilers.
93
94
done
95
sync
96
sleep 1
97
98
### Note: if all the previous output went to "stupid.h", it will be
99
### reincluded in the second part of this.
100
101
sed -e '/^#/d' -e '/^[	 ]*$/d' > st00pid.in << 'EOF'
102
103
### More recently, some of this was swiped from the "gcc" doc.  Autoconf is
104
### worth a harder look for more ideas; havent gotten around to it yet.
105
# architectures
106
alpha
107
dec
108
ibm
109
i370
110
i960
111
i860
112
ibm032
113
a29k
114
indigo
115
iris
116
mips
117
mipsel
118
sparc
119
sparclite
120
ncr
121
sh
122
harris
123
apple
124
vax
125
x86
126
ix86
127
i286
128
i386
129
i486
130
i586
131
pentium
132
intel
133
smp
134
mpu
135
mpu8080
136
mpu8086
137
amiga
138
hp
139
hppa
140
hp400
141
hp9000
142
snake
143
decmips
144
mc68000
145
mc68010
146
mc68020
147
mc68030
148
m68000
149
m68010
150
m68020
151
m68030
152
m68k
153
m88k
154
u3b15
155
u3b
156
u3b2
157
u3b5
158
u3b15
159
u3b20d
160
we32k
161
ppc
162
powerpc
163
arm
164
aviion
165
ns32000
166
iapx286
167
# minor exception to lc-vs-uc thing?
168
iAPX286
169
rs6000
170
rs6k
171
risc
172
sun
173
sun3
174
sun4
175
sun4c
176
sun4m
177
sequent
178
apollo
179
solbourne
180
pyr
181
pyramid
182
interdata
183
intertec
184
pdp11
185
u370
186
next
187
mac
188
macintosh
189
190
# for completeness; ya never know ... yes, found it!! -- solaris inet/common.h
191
big_endian
192
little_endian
193
lsbfirst
194
msbfirst
195
196
# vendors/OSes
197
unix
198
munix
199
m_unix
200
gcos
201
os
202
gssc
203
tss
204
isc
205
# *This* pair of imbeciles does *caseified defines*.  Pinheads.  One of
206
# these might trigger before the "tr" step.
207
NetBSD
208
netbsd
209
freebsd
210
FreeBSD
211
# cant do 386bsd, I dont think, but ...
212
_386bsd
213
bsd386
214
bsdunix
215
bsd_2
216
bsd_20
217
bsd
218
bsdi
219
bsd4
220
bsd42
221
bsd43
222
bsd44
223
bsd4_2
224
bsd4_3
225
bsd4_4
226
linux
227
minix
228
ultrix
229
ult3
230
ult4
231
bull
232
convex
233
convex_source
234
res
235
rt
236
esix
237
dg
238
dgux
239
encore
240
osf
241
osf1
242
osf2
243
# oops:
244
# osf/1
245
mach
246
mach386
247
mach_386
248
nextstep
249
tahoe
250
reno
251
sunos
252
sunos3
253
sunos4
254
sunos5
255
solaris
256
sun_src_compat
257
svr3
258
svr4
259
svr3_style
260
svr4_style
261
sysv
262
hpux
263
hp_ux
264
irix
265
sgi
266
sony
267
news
268
newsos
269
news_os
270
luna
271
lynxos
272
riscos
273
microport
274
ewsux
275
ews_ux
276
mport
277
dynix
278
genix
279
unicos
280
unixware
281
msdos
282
dos
283
os2
284
novell
285
univel
286
plan9
287
att
288
att_unix
289
sco
290
odt
291
aix
292
aux
293
a_ux
294
rsx
295
vms
296
297
# compiler cruft??
298
ansi
299
ansi_source
300
ansic
301
stdc
302
lint
303
sccs
304
libc_sccs
305
ms
306
msc
307
microsoft
308
gcc
309
gnu
310
gnuc
311
gnucc
312
gnu_source
313
sabre
314
saber
315
cygnus
316
source
317
all_source
318
gprof
319
prof
320
posix
321
posix_source
322
posix_sources
323
posix_c_source
324
xopen_source
325
args
326
p
327
proto
328
no_proto
329
prototype
330
prototypes
331
reentrant
332
kernel
333
str
334
trace
335
asm
336
libcpp
337
athena
338
athena_compat
339
# some preprocessors cant deal with this
340
# c++
341
cxx
342
cplusplus
343
borland
344
turbo
345
turboc
346
lattice
347
highc
348
349
# various defines that pop out of other .h files that we need to know about
350
index
351
strchr
352
rindex
353
strrchr
354
bcopy
355
memcpy
356
bzero
357
memset
358
path_login
359
path_lastlog
360
path_utmp
361
path_utmpx
362
363
EOF
364
365
# FL must be named something.c, so STUPID gcc recognized it as a non-object!!
366
( FL=st00pid.c
367
  if test -f stupid.h ; then
368
    cp stupid.h $FL
369
    sync
370
    echo '/* Re-including stupid.h */'
371
    sleep 1
372
  else
373
    echo '/* Skipping stupid.h */'
374
  fi
375
  while read xx ; do
376
    XX=`echo $xx | tr '[a-z]' '[A-Z]'`
377
    echo "#ifdef ${xx}" >> $FL
378
    echo "\"${xx}\" = ${xx}" >> $FL
379
    echo "#endif" >> $FL
380
    echo "#ifdef _${xx}" >> $FL
381
    echo "\"_${xx}\" = _${xx}" >> $FL
382
    echo "#endif" >> $FL
383
    echo "#ifdef _${xx}_" >> $FL
384
    echo "\"_${xx}_\" = _${xx}_" >> $FL
385
    echo "#endif" >> $FL
386
    echo "#ifdef __${xx}" >> $FL
387
    echo "\"__${xx}\" = __${xx}" >> $FL
388
    echo "#endif" >> $FL
389
    echo "#ifdef __${xx}__" >> $FL
390
    echo "\"__${xx}__\" = __${xx}__" >> $FL
391
    echo "#endif" >> $FL
392
    echo "#ifdef ${XX}" >> $FL
393
    echo "\"${XX}\" = ${XX}" >> $FL
394
    echo "#endif" >> $FL
395
    echo "#ifdef _${XX}" >> $FL
396
    echo "\"_${XX}\" = _${XX}" >> $FL
397
    echo "#endif" >> $FL
398
    echo "#ifdef _${XX}_" >> $FL
399
    echo "\"_${XX}_\" = _${XX}_" >> $FL
400
    echo "#endif" >> $FL
401
    echo "#ifdef __${XX}" >> $FL
402
    echo "\"__${XX}\" = __${XX}" >> $FL
403
    echo "#endif" >> $FL
404
    echo "#ifdef __${XX}__" >> $FL
405
    echo "\"__${XX}__\" = __${XX}__" >> $FL
406
    echo "#endif" >> $FL
407
  done
408
# and pick up a few specials
409
  echo "#ifdef major" >> $FL
410
  echo "\"major\" = major (x)" >> $FL
411
  echo "\"minor\" = minor (x)" >> $FL
412
  echo "#endif" >> $FL
413
  echo "#ifdef FD_SETSIZE" >> $FL
414
  echo "\"FD_SETSIZE\" = FD_SETSIZE" >> $FL
415
  echo "#endif" >> $FL
416
) < st00pid.in
417
sync
418
419
echo '/* Compiler predefines:'
420
${CC} -E st00pid.c | sed -e '/^#/d' -e '/^[	 ]*$/d'
421
echo '*/'
422
sync
423
424
cat > st00pid.c << 'EOF'
425
#include <stdio.h>
426
main() {
427
union {
428
  char *bletch;
429
  int *i;
430
} yow;
431
static char orig[16];
432
  strcpy (orig, "ABCDEFGHIJK");
433
  yow.bletch = orig;
434
  printf ("endian thing: %s = 0x%lx, addrbyte = %x -- ",
435
    yow.bletch, *yow.i, *yow.i & 0xFF);
436
  printf (((*yow.i & 0xff) == 0x41) ? "LITTLE\n" : "BIG\n");
437
  printf ("short %d;  int %d;  long %d\n",
438
    sizeof (short), sizeof (int), sizeof (long));
439
}
440
EOF
441
442
${CC} -o st00pid.x st00pid.c
443
echo '/* Architecture:'
444
./st00pid.x
445
echo '*/'
446
447
### dont nuke if generating DOS batchfiles
448
rm -f st00pid.*
449
sync
450
exit 0
451
452
### stuff remaining to deal with:
453
# maybe take out the slew of HAS_* and HAS* excess predefines, and only use
454
#   our "standardized" scheme [like we were going to generate a real includible
455
#   file outa this??]
456
# various POSIX_ME_HARDERisms:
457
#   vfork
458
#   lockf/flock/fcntl/euuugh
459
#   signal stuff
460
#   termio/termios/sgtty hair
461
# strdup and related
462
# ifdef HAVE_STD_LIB and such nonsense
463
# auto-sniff cc-vs-gcc somehow?  maybe a straight OR with exit statii..