1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
#!@SH@
LIBKVER='@PREFIX@/lib/libkver.so'
EX_USAGE=64
nl='
'
tab=' '
usage()
{
cat <<ENDUSAGE;
usage: $0 [-s ostype] [-r osrelease] [-m machine] [-p arch] command [args]
ENDUSAGE
}
bomb()
{
echo >&2 "$0: $*"
exit $EX_USAGE
}
# begin code copied from build.sh {{{
# valid_MACHINE_ARCH -- A multi-line string, listing all valid
# MACHINE/MACHINE_ARCH pairs.
#
# Each line contains a MACHINE and MACHINE_ARCH value, an optional ALIAS
# which may be used to refer to the MACHINE/MACHINE_ARCH pair, and an
# optional DEFAULT or NO_DEFAULT keyword.
#
# When a MACHINE corresponds to multiple possible values of
# MACHINE_ARCH, then this table should list all allowed combinations.
# If the MACHINE is associated with a default MACHINE_ARCH (to be
# used when the user specifies the MACHINE but fails to specify the
# MACHINE_ARCH), then one of the lines should have the "DEFAULT"
# keyword. If there is no default MACHINE_ARCH for a particular
# MACHINE, then there should be a line with the "NO_DEFAULT" keyword,
# and with a blank MACHINE_ARCH.
#
valid_MACHINE_ARCH='
MACHINE=acorn26 MACHINE_ARCH=arm
MACHINE=acorn32 MACHINE_ARCH=arm
MACHINE=algor MACHINE_ARCH=mips64el ALIAS=algor64
MACHINE=algor MACHINE_ARCH=mipsel DEFAULT
MACHINE=alpha MACHINE_ARCH=alpha
MACHINE=amd64 MACHINE_ARCH=x86_64
MACHINE=amiga MACHINE_ARCH=m68k
MACHINE=amigappc MACHINE_ARCH=powerpc
MACHINE=arc MACHINE_ARCH=mips64el ALIAS=arc64
MACHINE=arc MACHINE_ARCH=mipsel DEFAULT
MACHINE=atari MACHINE_ARCH=m68k
MACHINE=bebox MACHINE_ARCH=powerpc
MACHINE=cats MACHINE_ARCH=arm DEFAULT
MACHINE=cats MACHINE_ARCH=earm
MACHINE=cesfic MACHINE_ARCH=m68k
MACHINE=cobalt MACHINE_ARCH=mips64el ALIAS=cobalt64
MACHINE=cobalt MACHINE_ARCH=mipsel DEFAULT
MACHINE=dreamcast MACHINE_ARCH=sh3el
MACHINE=emips MACHINE_ARCH=mipseb
MACHINE=evbarm MACHINE_ARCH=arm ALIAS=evbarm-el DEFAULT
MACHINE=evbarm MACHINE_ARCH=armeb ALIAS=evbarm-eb
MACHINE=evbarm MACHINE_ARCH=earm ALIAS=evbearm-el
MACHINE=evbarm MACHINE_ARCH=earmeb ALIAS=evbearm-eb
MACHINE=evbmips MACHINE_ARCH= NO_DEFAULT
MACHINE=evbmips MACHINE_ARCH=mips64eb ALIAS=evbmips64-eb
MACHINE=evbmips MACHINE_ARCH=mips64el ALIAS=evbmips64-el
MACHINE=evbmips MACHINE_ARCH=mipseb ALIAS=evbmips-eb
MACHINE=evbmips MACHINE_ARCH=mipsel ALIAS=evbmips-el
MACHINE=evbppc MACHINE_ARCH=powerpc DEFAULT
MACHINE=evbppc MACHINE_ARCH=powerpc64 ALIAS=evbppc64
MACHINE=evbsh3 MACHINE_ARCH= NO_DEFAULT
MACHINE=evbsh3 MACHINE_ARCH=sh3eb ALIAS=evbsh3-eb
MACHINE=evbsh3 MACHINE_ARCH=sh3el ALIAS=evbsh3-el
MACHINE=ews4800mips MACHINE_ARCH=mipseb
MACHINE=hp300 MACHINE_ARCH=m68k
MACHINE=hp700 MACHINE_ARCH=hppa
MACHINE=hpcarm MACHINE_ARCH=arm
MACHINE=hpcmips MACHINE_ARCH=mipsel
MACHINE=hpcsh MACHINE_ARCH=sh3el
MACHINE=i386 MACHINE_ARCH=i386
MACHINE=ia64 MACHINE_ARCH=ia64
MACHINE=ibmnws MACHINE_ARCH=powerpc
MACHINE=iyonix MACHINE_ARCH=arm DEFAULT
MACHINE=iyonix MACHINE_ARCH=earm
MACHINE=landisk MACHINE_ARCH=sh3el
MACHINE=luna68k MACHINE_ARCH=m68k
MACHINE=mac68k MACHINE_ARCH=m68k
MACHINE=macppc MACHINE_ARCH=powerpc DEFAULT
MACHINE=macppc MACHINE_ARCH=powerpc64 ALIAS=macppc64
MACHINE=mipsco MACHINE_ARCH=mipseb
MACHINE=mmeye MACHINE_ARCH=sh3eb
MACHINE=mvme68k MACHINE_ARCH=m68k
MACHINE=mvmeppc MACHINE_ARCH=powerpc
MACHINE=netwinder MACHINE_ARCH=arm DEFAULT
MACHINE=netwinder MACHINE_ARCH=earm
MACHINE=news68k MACHINE_ARCH=m68k
MACHINE=newsmips MACHINE_ARCH=mipseb
MACHINE=next68k MACHINE_ARCH=m68k
MACHINE=ofppc MACHINE_ARCH=powerpc DEFAULT
MACHINE=ofppc MACHINE_ARCH=powerpc64 ALIAS=ofppc64
MACHINE=pmax MACHINE_ARCH=mips64el ALIAS=pmax64
MACHINE=pmax MACHINE_ARCH=mipsel DEFAULT
MACHINE=prep MACHINE_ARCH=powerpc
MACHINE=rs6000 MACHINE_ARCH=powerpc
MACHINE=sandpoint MACHINE_ARCH=powerpc
MACHINE=sbmips MACHINE_ARCH= NO_DEFAULT
MACHINE=sbmips MACHINE_ARCH=mips64eb ALIAS=sbmips64-eb
MACHINE=sbmips MACHINE_ARCH=mips64el ALIAS=sbmips64-el
MACHINE=sbmips MACHINE_ARCH=mipseb ALIAS=sbmips-eb
MACHINE=sbmips MACHINE_ARCH=mipsel ALIAS=sbmips-el
MACHINE=sgimips MACHINE_ARCH=mips64eb ALIAS=sgimips64
MACHINE=sgimips MACHINE_ARCH=mipseb DEFAULT
MACHINE=shark MACHINE_ARCH=arm DEFAULT
MACHINE=shark MACHINE_ARCH=earm
MACHINE=sparc MACHINE_ARCH=sparc
MACHINE=sparc64 MACHINE_ARCH=sparc64
MACHINE=sun2 MACHINE_ARCH=m68000
MACHINE=sun3 MACHINE_ARCH=m68k
MACHINE=vax MACHINE_ARCH=vax
MACHINE=x68k MACHINE_ARCH=m68k
MACHINE=zaurus MACHINE_ARCH=arm DEFAULT
MACHINE=zaurus MACHINE_ARCH=earm
'
# getarch -- find the default MACHINE_ARCH for a MACHINE,
# or convert an alias to a MACHINE/MACHINE_ARCH pair.
#
# Saves MACHINE in makewrappermachine before possibly modifying MACHINE.
#
# Sets MACHINE and MACHINE_ARCH if the input MACHINE value is
# recognised as an alias, or recognised as a machine that has a default
# MACHINE_ARCH (or that has only one possible MACHINE_ARCH).
#
# Leaves MACHINE and MACHINE_ARCH unchanged if MACHINE is recognised
# as being associated with multiple MACHINE_ARCH values with no default.
#
# Bombs if MACHINE is not recognised.
#
getarch()
{
local IFS
local found=""
local line
IFS="${nl}"
makewrappermachine="${MACHINE}"
for line in ${valid_MACHINE_ARCH}; do
line="${line%%#*}" # ignore comments
line="$( IFS=" ${tab}" ; echo $line )" # normalise white space
case "${line} " in
"")
# skip blank lines or comment lines
continue
;;
*" ALIAS=${MACHINE} "*)
# Found a line with a matching ALIAS=<alias>.
found="$line"
break
;;
"MACHINE=${MACHINE} "*" NO_DEFAULT"*)
# Found an explicit "NO_DEFAULT" for this MACHINE.
found="$line"
break
;;
"MACHINE=${MACHINE} "*" DEFAULT"*)
# Found an explicit "DEFAULT" for this MACHINE.
found="$line"
break
;;
"MACHINE=${MACHINE} "*)
# Found a line for this MACHINE. If it's the
# first such line, then tentatively accept it.
# If it's not the first matching line, then
# remember that there was more than one match.
case "$found" in
'') found="$line" ;;
*) found="MULTIPLE_MATCHES" ; break ;;
esac
;;
esac
done
case "$found" in
*NO_DEFAULT*|*MULTIPLE_MATCHES*)
# MACHINE is OK, but MACHINE_ARCH is still unknown
return
;;
"MACHINE="*" MACHINE_ARCH="*)
# Obey the MACHINE= and MACHINE_ARCH= parts of the line.
IFS=" "
for frag in ${found}; do
case "$frag" in
MACHINE=*|MACHINE_ARCH=*)
eval "$frag"
;;
esac
done
;;
*)
bomb "Unknown target MACHINE: ${MACHINE}"
;;
esac
}
# end code copied from build.sh }}}
# MAIN PROGRAM
opt_s=""
opt_r=""
opt_m=""
opt_p=""
while getopts "s:r:m:p:" opt
do
case "$opt" in
s) opt_s="$OPTARG"; export LIBKVER_OSTYPE="$OPTARG" ;;
r) opt_r="$OPTARG"; export LIBKVER_OSRELEASE="$OPTARG" ;;
m) opt_m="$OPTARG"; export LIBKVER_MACHINE="$OPTARG" ;;
p) opt_p="$OPTARG"; export LIBKVER_MACHINE_ARCH="$OPTARG" ;;
*) usage ; exit $EX_USAGE ;;
esac
done
shift $(($OPTIND - 1))
if [ $# -eq 0 ]; then
usage
exit $EX_USAGE
fi
# If MACHINE was specified and MACHINE_ARCH was not specified,
# then try to guess MACHINE_ARCH.
if [ -n "$opt_m" ] && [ -z "$opt_p" ]; then
MACHINE="$opt_m"
getarch
if [ -n "$MACHINE_ARCH" ]; then
# in addition to setting MACHINE_ARCH,
# getarch might have modified MACHINE.
export LIBKVER_MACHINE="$MACHINE"
export LIBKVER_MACHINE_ARCH="$MACHINE_ARCH"
else
bomb "'-m ${MACHINE}' needs '-p <machine_arch>'"
fi
fi
export LD_PRELOAD="${LIBKVER}${LD_PRELOAD:+:}${LD_PRELOAD}"
exec "$@"
|