blob: 62e106e23cbc5881f700a0d3871369f1279289a1 (
plain)
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
|
#!/bin/sh
libsl=""
doautolib=true
verbose=false
if [ "x$1" = "x-l" ]
then
shift
doautolib=false
elif [ "x$1" = "x-v" ]
then
shift
verbose=true
fi
target=a.out
if [ "x$1" = "x-o" ]
then
target=$2
fi
if $doautolib
then
ofiles=""
for i
do
case "$i" in
*.[ao])
ofiles="$ofiles $i"
;;
esac
done
# echo "ofiles $ofiles"
autolibs=""
if [ "x$ofiles" != "x" ]
then
a=`
nm $ofiles |
grep '__p9l_autolib_[a-zA-Z0-9+-]*$' |
sed 's/.*__p9l_autolib_//' |
sort -u
`
for i in $a
do
autolibs="$autolibs $i"
eval "need$i=true"
done
fi
# fetch dependencies out of libraries
workq="$autolibs"
while [ "x$workq" != "x" ]
do
w="$workq"
workq=""
for i in $w
do
# can't trust the libraries about using
# libthread - we might not be linking with
# those object files.
a=`
nm $PLAN9/lib/lib$i.a |
grep '__p9l_autolib_[a-zA-Z0-9+-]*$' |
sed 's/.*__p9l_autolib_//' |
sort -u |
grep -v thread
`
okayfn="true"
for j in $a
do
if eval "[ x\$need$j = x ]"
then
autolibs="$autolibs $j"
workq="$workq $j"
eval "need$j=true"
fi
if [ $j != $i ]
then
okayfn="$okayfn && have$j"
fi
done
# echo "can$i: $okayfn"
eval "can$i() { $okayfn; }"
done
done
if $verbose
then
echo "autolibs $autolibs"
fi
for i in $autolibs
do
eval "have$i() { false; }"
done
havethread() { false; }
# now find correct order
libsl=""
while [ "x$autolibs" != x ]
do
stillneed=""
didnothing=true
for i in $autolibs
do
if eval "can$i"
then
libsl="-l$i $libsl"
eval "have$i() { true; }"
didnothing=false
else
stillneed="$stillneed $i"
fi
done
# break cycle by setting the last library on the list
# to have no dependencies
if $didnothing
then
j="xxx"
for i in $autolibs
do
j=$i
done
echo "dependency cycle: $autolibs; breaking with $j"
eval "can$j() { true; }"
fi
autolibs="$stillneed"
done
if $verbose
then
echo "liborder $libsl"
fi
libsl="$libsl -l9"
# cycle: lib9 expects p9main, which is defined in libthread. oops.
if havethread
then
libsl="$libsl -lthread -l9"
fi
if [ "x$needdraw" = xtrue ]
then
if [ "x$X11" = "x" ]
then
X11=/usr/X11R6
fi
libsl="$libsl -L$X11/lib -lX11"
fi
fi
extralibs="-lm"
tag="${SYSNAME:-`uname`}-${OBJTYPE:-`uname -m`}"
case "$tag" in
*OpenBSD*)
ld=gcc
extralibs="$extralibs -lutil -lpthread"
;;
*FreeBSD*)
ld=gcc
extralibs="$extralibs -lutil"
case "`uname -r`" in
[5-9].*)
extralibs="$extralibs -lpthread"
;;
esac
;;
*BSD*)
ld=gcc
extralibs="$extralibs -lutil"
;;
*Linux*)
ld=gcc
extralibs="$extralibs -lutil"
case "`uname -r`" in
2.6.*)
extralibs="$extralibs -lpthread"
;;
esac
;;
*Darwin*)
ld=gcc
;;
*SunOS*)
ld="${CC9:-cc} -g"
extralibs="$extralibs -lrt -lpthread -lsocket -lnsl"
# Record paths to shared libraries to avoid needing LD_LIBRARY_PATH
for i in "$@"
do
case "$i" in
-L*)
s=`echo $i | sed 's/-L/-R/'`
extralibs="$extralibs $s"
;;
esac
done
;;
*)
echo do not know how to link on "$tag" 1>&2
exit 1
esac
if $verbose
then
echo $ld -L$PLAN9/lib "$@" $libsl $extralibs
fi
if $ld -L$PLAN9/lib "$@" $libsl $extralibs
then
exit 0
else
rm -f $target
exit 1
fi
|