1# oper-:arch-:syst-:chip-:kern-
2# oper = operating system type; e.g., sunos-4.1.4
3# arch = machine language; e.g., sparc
4# syst = which binaries can run; e.g., sun4
5# chip = chip model; e.g., micro-2-80
6# kern = kernel version; e.g., sun4m
7# dependence: arch --- chip
8#                 \        \
9#          oper --- syst --- kern
10# so, for example, syst is interpreted in light of oper, but chip is not.
11# anyway, no slashes, no extra colons, no uppercase letters.
12# the point of the extra -'s is to ease parsing: can add hierarchies later.
13# e.g., *:i386-*:*:pentium-*:* would handle pentium-100 as well as pentium,
14# and i386-486 (486s do have more instructions, you know) as well as i386.
15# the idea here is to include ALL useful available information.
16
17exec 2>/dev/null
18
19sys="`uname -s | tr '/:[A-Z]' '..[a-z]'`"
20if [ x"$sys" != x ]
21then
22  unamer="`uname -r | tr /: ..`"
23  unamem="`uname -m | tr /: ..`"
24  unamev="`uname -v | tr /: ..`"
25
26  case "$sys" in
27  bsd.os|freebsd|netbsd|openbsd|dragonfly)
28    # in bsd 4.4, uname -v does not have useful info.
29    # in bsd 4.4, uname -m is arch, not chip.
30    oper="$sys-$unamer"
31    arch="$unamem"
32    syst=""
33    chip="`sysctl -n hw.model`" # hopefully
34    kern=""
35    ;;
36  linux)
37    # as in bsd 4.4, uname -v does not have useful info.
38    oper="$sys-$unamer"
39    syst=""
40    chip="$unamem"
41    kern=""
42    case "$chip" in
43    i386|i486|i586|i686)
44      arch="i386"
45      ;;
46    alpha)
47      arch="alpha"
48      ;;
49    esac
50    ;;
51  aix)
52    # naturally IBM has to get uname -r and uname -v backwards. dorks.
53    oper="$sys-$unamev-$unamer"
54    arch="`arch | tr /: ..`"
55    syst=""
56    chip="$unamem"
57    kern=""
58    ;;
59  sunos)
60    oper="$sys-$unamer-$unamev"
61    arch="`(uname -p || mach) | tr /: ..`"
62    syst="`arch | tr /: ..`"
63    chip="$unamem" # this is wrong; is there any way to get the real info?
64    kern="`arch -k | tr /: ..`"
65    ;;
66  unix_sv)
67    oper="$sys-$unamer-$unamev"
68    arch="`uname -m`"
69    syst=""
70    chip="$unamem"
71    kern=""
72    ;;
73  *)
74    oper="$sys-$unamer-$unamev"
75    arch="`arch | tr /: ..`"
76    syst=""
77    chip="$unamem"
78    kern=""
79    ;;
80  esac
81else
82  cc -c trycpp.c
83  cc -o trycpp trycpp.o
84  case `./trycpp` in
85  nextstep)
86    oper="nextstep-`hostinfo | sed -n 's/^[ 	]*NeXT Mach \([^:]*\):.*$/\1/p'`"
87    arch="`hostinfo | sed -n 's/^Processor type: \(.*\) (.*)$/\1/p' | tr /: ..`"
88    syst=""
89    chip="`hostinfo | sed -n 's/^Processor type: .* (\(.*\))$/\1/p' | tr ' /:' '...'`"
90    kern=""
91    ;;
92  *)
93    oper="unknown"
94    arch=""
95    syst=""
96    chip=""
97    kern=""
98    ;;
99  esac
100  rm -f trycpp.o trycpp
101fi
102
103case "$chip" in
10480486)
105  # let's try to be consistent here. (BSD/OS)
106  chip=i486
107  ;;
108i486DX)
109  # respect the hyphen hierarchy. (FreeBSD)
110  chip=i486-dx
111  ;;
112i486.DX2)
113  # respect the hyphen hierarchy. (FreeBSD)
114  chip=i486-dx2
115  ;;
116Intel.586)
117  # no, you nitwits, there is no such chip. (NeXTStep)
118  chip=pentium
119  ;;
120i586)
121  # no, you nitwits, there is no such chip. (Linux)
122  chip=pentium
123  ;;
124i686)
125  # STOP SAYING THAT! (Linux)
126  chip=ppro
127esac
128
129if cc -c x86cpuid.c
130then
131  if cc -o x86cpuid x86cpuid.o
132  then
133    x86cpuid="`./x86cpuid | tr /: ..`"
134    case "$x86cpuid" in
135      ?*)
136        chip="$x86cpuid"
137        ;;
138    esac
139  fi
140fi
141rm -f x86cpuid x86cpuid.o
142
143echo "$oper-:$arch-:$syst-:$chip-:$kern-" | tr ' [A-Z]' '.[a-z]'
144