Blame


1 dbd7b9a9 2003-11-23 devnull #!/bin/sh
2 ffdca8f7 2022-08-18 crossd
3 ffdca8f7 2022-08-18 crossd [ "$1" = "" ] && exit 1
4 dbd7b9a9 2003-11-23 devnull
5 eea5f6ad 2005-01-17 devnull test -f $PLAN9/config && . $PLAN9/config
6 ead3e311 2005-01-04 devnull libsl=""
7 fc165dcb 2005-10-19 devnull frameworks=""
8 3d637e16 2005-01-07 devnull doautolib=true
9 fc165dcb 2005-10-19 devnull doautoframework=true
10 3d637e16 2005-01-07 devnull verbose=false
11 ead3e311 2005-01-04 devnull
12 a4980b39 2009-07-15 BHuntsman nmflags=""
13 a4980b39 2009-07-15 BHuntsman extralibs="-lm"
14 99dee78c 2020-12-30 rsc tag="${SYSNAME:-`uname`}"
15 a4980b39 2009-07-15 BHuntsman case "$tag" in
16 20035ed4 2014-02-28 minux.ma *DragonFly*|*BSD*)
17 9444b8e4 2020-05-18 rsc ld="${CC9:-gcc} $CC9FLAGS"
18 a4980b39 2009-07-15 BHuntsman userpath=true
19 a4980b39 2009-07-15 BHuntsman extralibs="$extralibs -lutil"
20 a4980b39 2009-07-15 BHuntsman ;;
21 a4980b39 2009-07-15 BHuntsman *OSF1*)
22 9444b8e4 2020-05-18 rsc ld="${CC9:-cc} $CC9FLAGS"
23 a4980b39 2009-07-15 BHuntsman userpath=true
24 a4980b39 2009-07-15 BHuntsman extralibs="$extralibs -lutil"
25 a4980b39 2009-07-15 BHuntsman nmflags="-B"
26 a4980b39 2009-07-15 BHuntsman ;;
27 a4980b39 2009-07-15 BHuntsman *Linux*)
28 9444b8e4 2020-05-18 rsc ld="${CC9:-gcc} $CC9FLAGS"
29 a4980b39 2009-07-15 BHuntsman userpath=true
30 cb8f7357 2020-01-20 rsc extralibs="$extralibs -lutil -lresolv -lpthread"
31 a4980b39 2009-07-15 BHuntsman ;;
32 99dee78c 2020-12-30 rsc *Darwin*)
33 291f7411 2020-09-27 crossd ld="${CC9:-gcc} -m64 $CC9FLAGS"
34 291f7411 2020-09-27 crossd ;;
35 a4980b39 2009-07-15 BHuntsman *SunOS*)
36 9444b8e4 2020-05-18 rsc ld="${CC9:-cc} -g $CC9FLAGS"
37 a4980b39 2009-07-15 BHuntsman extralibs="$extralibs -lrt -lpthread -lsocket -lnsl"
38 cb8f7357 2020-01-20 rsc # Record paths to shared libraries to avoid needing LD_LIBRARY_PATH
39 a4980b39 2009-07-15 BHuntsman for i in "$libsl $@"
40 a4980b39 2009-07-15 BHuntsman do
41 a4980b39 2009-07-15 BHuntsman case "$i" in
42 a4980b39 2009-07-15 BHuntsman -L*)
43 a4980b39 2009-07-15 BHuntsman s=`echo $i | sed 's/-L/-R/'`
44 a4980b39 2009-07-15 BHuntsman extralibs="$extralibs $s"
45 a4980b39 2009-07-15 BHuntsman ;;
46 a4980b39 2009-07-15 BHuntsman esac
47 a4980b39 2009-07-15 BHuntsman done
48 a4980b39 2009-07-15 BHuntsman case "${SYSVERSION:-`uname -r`}" in
49 a4980b39 2009-07-15 BHuntsman 5.[67])
50 a4980b39 2009-07-15 BHuntsman echo do not know how to link right thread library on "$tag" 1>&2
51 a4980b39 2009-07-15 BHuntsman ;;
52 a4980b39 2009-07-15 BHuntsman 5.8)
53 a4980b39 2009-07-15 BHuntsman # Some trickery is needed to force use of
54 a4980b39 2009-07-15 BHuntsman # alternate thread lib from /usr/lib/lwp
55 a4980b39 2009-07-15 BHuntsman # Likely, this only works with sun cc,
56 a4980b39 2009-07-15 BHuntsman # for other compiler/loader we would need other flags.
57 a4980b39 2009-07-15 BHuntsman ld="$ld -i"
58 a4980b39 2009-07-15 BHuntsman extralibs="$extralibs /usr/lib/lwp/libthread.so -R/usr/lib/lwp:/usr/lib"
59 a4980b39 2009-07-15 BHuntsman ;;
60 a4980b39 2009-07-15 BHuntsman esac
61 a4980b39 2009-07-15 BHuntsman ;;
62 a4980b39 2009-07-15 BHuntsman *AIX*)
63 6c4260fc 2021-08-30 crossd ld="${CC9:-xlc_r} $CC9FLAGS"
64 4982d4eb 2020-05-08 rsc nmflags="-A -B"
65 a4980b39 2009-07-15 BHuntsman ;;
66 a4980b39 2009-07-15 BHuntsman *)
67 a4980b39 2009-07-15 BHuntsman echo do not know how to link on "$tag" 1>&2
68 a4980b39 2009-07-15 BHuntsman exit 1
69 a4980b39 2009-07-15 BHuntsman esac
70 a4980b39 2009-07-15 BHuntsman
71 ead3e311 2005-01-04 devnull if [ "x$1" = "x-l" ]
72 ead3e311 2005-01-04 devnull then
73 ead3e311 2005-01-04 devnull shift
74 3d637e16 2005-01-07 devnull doautolib=false
75 fc165dcb 2005-10-19 devnull doautoframework=false
76 ead3e311 2005-01-04 devnull elif [ "x$1" = "x-v" ]
77 ead3e311 2005-01-04 devnull then
78 ead3e311 2005-01-04 devnull shift
79 3d637e16 2005-01-07 devnull verbose=true
80 ead3e311 2005-01-04 devnull fi
81 ead3e311 2005-01-04 devnull
82 724b43e6 2005-01-07 devnull target=a.out
83 724b43e6 2005-01-07 devnull if [ "x$1" = "x-o" ]
84 724b43e6 2005-01-07 devnull then
85 724b43e6 2005-01-07 devnull target=$2
86 724b43e6 2005-01-07 devnull fi
87 724b43e6 2005-01-07 devnull
88 3d637e16 2005-01-07 devnull if $doautolib
89 ead3e311 2005-01-04 devnull then
90 ead3e311 2005-01-04 devnull ofiles=""
91 d210f09d 2008-12-03 jas lpaths="$PLAN9/lib"
92 ead3e311 2005-01-04 devnull for i
93 ead3e311 2005-01-04 devnull do
94 ead3e311 2005-01-04 devnull case "$i" in
95 359c1e01 2005-01-14 devnull *.[ao])
96 ead3e311 2005-01-04 devnull ofiles="$ofiles $i"
97 ead3e311 2005-01-04 devnull ;;
98 d210f09d 2008-12-03 jas -L*)
99 d210f09d 2008-12-03 jas l=`echo $i | sed 's/-L//'`
100 d210f09d 2008-12-03 jas lpaths="$lpaths $l"
101 ead3e311 2005-01-04 devnull esac
102 ead3e311 2005-01-04 devnull done
103 cb8f7357 2020-01-20 rsc
104 d210f09d 2008-12-03 jas if $verbose
105 d210f09d 2008-12-03 jas then
106 d210f09d 2008-12-03 jas echo "ofiles $ofiles"
107 d210f09d 2008-12-03 jas echo "lpaths $lpaths"
108 d210f09d 2008-12-03 jas fi
109 d210f09d 2008-12-03 jas
110 ead3e311 2005-01-04 devnull autolibs=""
111 ead3e311 2005-01-04 devnull if [ "x$ofiles" != "x" ]
112 ead3e311 2005-01-04 devnull then
113 3d637e16 2005-01-07 devnull a=`
114 a4980b39 2009-07-15 BHuntsman nm $nmflags $ofiles |
115 4982d4eb 2020-05-08 rsc grep '__p9l_autolib_[a-zA-Z0-9+-]*' |
116 4982d4eb 2020-05-08 rsc sed 's/.*__p9l_autolib_//; s/:.*//' |
117 ead3e311 2005-01-04 devnull sort -u
118 ead3e311 2005-01-04 devnull `
119 3d637e16 2005-01-07 devnull for i in $a
120 3d637e16 2005-01-07 devnull do
121 3d637e16 2005-01-07 devnull autolibs="$autolibs $i"
122 3d637e16 2005-01-07 devnull eval "need$i=true"
123 3d637e16 2005-01-07 devnull done
124 ead3e311 2005-01-04 devnull fi
125 f6bb3013 2006-06-25 devnull if $verbose
126 f6bb3013 2006-06-25 devnull then
127 f6bb3013 2006-06-25 devnull echo "autolibs1 $autolibs"
128 f6bb3013 2006-06-25 devnull fi
129 3d637e16 2005-01-07 devnull
130 3d637e16 2005-01-07 devnull # fetch dependencies out of libraries
131 3d637e16 2005-01-07 devnull workq="$autolibs"
132 3d637e16 2005-01-07 devnull while [ "x$workq" != "x" ]
133 ead3e311 2005-01-04 devnull do
134 3d637e16 2005-01-07 devnull w="$workq"
135 3d637e16 2005-01-07 devnull workq=""
136 3d637e16 2005-01-07 devnull for i in $w
137 3d637e16 2005-01-07 devnull do
138 359c1e01 2005-01-14 devnull # can't trust the libraries about using
139 866a7d1f 2006-02-14 devnull # libthread or libdraw - we might not be linking with
140 359c1e01 2005-01-14 devnull # those object files.
141 d210f09d 2008-12-03 jas a=""
142 d210f09d 2008-12-03 jas for lpath in $lpaths
143 d210f09d 2008-12-03 jas do
144 d210f09d 2008-12-03 jas b=`
145 d210f09d 2008-12-03 jas nm $lpath/lib$i.a 2>/dev/null |
146 4982d4eb 2020-05-08 rsc grep '__p9l_autolib_[a-zA-Z0-9+-]*' |
147 4982d4eb 2020-05-08 rsc sed 's/.*__p9l_autolib_//; s/:.*//' |
148 d210f09d 2008-12-03 jas sort -u |
149 d210f09d 2008-12-03 jas egrep -v '^(thread|draw)$'
150 d210f09d 2008-12-03 jas `
151 d210f09d 2008-12-03 jas a="$a $b"
152 d210f09d 2008-12-03 jas done
153 f6bb3013 2006-06-25 devnull # fix up libraries that really need draw
154 f6bb3013 2006-06-25 devnull if [ "x$i" = "xmemdraw" -o "x$i" = "xmemlayer" -o "x$i" = "xframe" ]
155 f6bb3013 2006-06-25 devnull then
156 f6bb3013 2006-06-25 devnull a="$a draw"
157 f6bb3013 2006-06-25 devnull fi
158 3d637e16 2005-01-07 devnull okayfn="true"
159 3d637e16 2005-01-07 devnull for j in $a
160 3d637e16 2005-01-07 devnull do
161 3d637e16 2005-01-07 devnull if eval "[ x\$need$j = x ]"
162 3d637e16 2005-01-07 devnull then
163 3d637e16 2005-01-07 devnull autolibs="$autolibs $j"
164 3d637e16 2005-01-07 devnull workq="$workq $j"
165 3d637e16 2005-01-07 devnull eval "need$j=true"
166 3d637e16 2005-01-07 devnull fi
167 3d637e16 2005-01-07 devnull if [ $j != $i ]
168 3d637e16 2005-01-07 devnull then
169 3d637e16 2005-01-07 devnull okayfn="$okayfn && have$j"
170 3d637e16 2005-01-07 devnull fi
171 3d637e16 2005-01-07 devnull done
172 f6bb3013 2006-06-25 devnull if $verbose
173 f6bb3013 2006-06-25 devnull then
174 f6bb3013 2006-06-25 devnull echo "can$i: $okayfn"
175 f6bb3013 2006-06-25 devnull fi
176 3d637e16 2005-01-07 devnull eval "can$i() { $okayfn; }"
177 3d637e16 2005-01-07 devnull done
178 ead3e311 2005-01-04 devnull done
179 3d637e16 2005-01-07 devnull if $verbose
180 3d637e16 2005-01-07 devnull then
181 3d637e16 2005-01-07 devnull echo "autolibs $autolibs"
182 3d637e16 2005-01-07 devnull fi
183 3d637e16 2005-01-07 devnull
184 ead3e311 2005-01-04 devnull for i in $autolibs
185 ead3e311 2005-01-04 devnull do
186 3d637e16 2005-01-07 devnull eval "have$i() { false; }"
187 ead3e311 2005-01-04 devnull done
188 c8b6342d 2005-01-13 devnull havethread() { false; }
189 0d85a1cf 2005-02-11 devnull havesec() { false; }
190 f6bb3013 2006-06-25 devnull canmemlayer() { havedraw; }
191 3d637e16 2005-01-07 devnull
192 3d637e16 2005-01-07 devnull # now find correct order
193 3d637e16 2005-01-07 devnull libsl=""
194 3d637e16 2005-01-07 devnull while [ "x$autolibs" != x ]
195 ead3e311 2005-01-04 devnull do
196 3d637e16 2005-01-07 devnull stillneed=""
197 3d637e16 2005-01-07 devnull didnothing=true
198 3d637e16 2005-01-07 devnull for i in $autolibs
199 3d637e16 2005-01-07 devnull do
200 3d637e16 2005-01-07 devnull if eval "can$i"
201 3d637e16 2005-01-07 devnull then
202 3d637e16 2005-01-07 devnull libsl="-l$i $libsl"
203 3d637e16 2005-01-07 devnull eval "have$i() { true; }"
204 3d637e16 2005-01-07 devnull didnothing=false
205 3d637e16 2005-01-07 devnull else
206 3d637e16 2005-01-07 devnull stillneed="$stillneed $i"
207 3d637e16 2005-01-07 devnull fi
208 3d637e16 2005-01-07 devnull done
209 3d637e16 2005-01-07 devnull # break cycle by setting the last library on the list
210 3d637e16 2005-01-07 devnull # to have no dependencies
211 3d637e16 2005-01-07 devnull if $didnothing
212 ead3e311 2005-01-04 devnull then
213 3d637e16 2005-01-07 devnull j="xxx"
214 3d637e16 2005-01-07 devnull for i in $autolibs
215 3d637e16 2005-01-07 devnull do
216 3d637e16 2005-01-07 devnull j=$i
217 3d637e16 2005-01-07 devnull done
218 3d637e16 2005-01-07 devnull echo "dependency cycle: $autolibs; breaking with $j"
219 3d637e16 2005-01-07 devnull eval "can$j() { true; }"
220 ead3e311 2005-01-04 devnull fi
221 3d637e16 2005-01-07 devnull autolibs="$stillneed"
222 ead3e311 2005-01-04 devnull done
223 3d637e16 2005-01-07 devnull if $verbose
224 3d637e16 2005-01-07 devnull then
225 3d637e16 2005-01-07 devnull echo "liborder $libsl"
226 3d637e16 2005-01-07 devnull fi
227 ead3e311 2005-01-04 devnull libsl="$libsl -l9"
228 3d637e16 2005-01-07 devnull
229 c8b6342d 2005-01-13 devnull # cycle: lib9 expects p9main, which is defined in libthread. oops.
230 359c1e01 2005-01-14 devnull if havethread
231 c8b6342d 2005-01-13 devnull then
232 359c1e01 2005-01-14 devnull libsl="$libsl -lthread -l9"
233 c8b6342d 2005-01-13 devnull fi
234 c8b6342d 2005-01-13 devnull
235 0d85a1cf 2005-02-11 devnull # cycle: lib9 netcrypt uses libsec
236 0d85a1cf 2005-02-11 devnull if havesec
237 0d85a1cf 2005-02-11 devnull then
238 0d85a1cf 2005-02-11 devnull libsl="$libsl -lsec -l9"
239 866a7d1f 2006-02-14 devnull fi
240 866a7d1f 2006-02-14 devnull
241 89eaced6 2006-04-04 devnull if [ "x$needndb" = xtrue -a '(' -f /usr/lib/libresolv.a -o -f /usr/lib/libresolv.dylib ')' ]
242 866a7d1f 2006-02-14 devnull then
243 866a7d1f 2006-02-14 devnull libsl="$libsl -lresolv"
244 0d85a1cf 2005-02-11 devnull fi
245 0d85a1cf 2005-02-11 devnull
246 a7415518 2007-02-22 devnull if [ "x$needX11" = xtrue -a "x$WSYSTYPE" != xnowsys ]
247 ead3e311 2005-01-04 devnull then
248 ead3e311 2005-01-04 devnull if [ "x$X11" = "x" ]
249 ead3e311 2005-01-04 devnull then
250 ead3e311 2005-01-04 devnull X11=/usr/X11R6
251 ead3e311 2005-01-04 devnull fi
252 5d03af65 2012-05-29 rsc # Don't say -L with a non-existent directory: Xcode complains.
253 c968e519 2005-01-18 devnull # x86_64 seems to put its 64-bit libraries in lib64.
254 99dee78c 2020-12-30 rsc if [ "`uname -m`" = "x86_64" -a -d "$X11/lib64" ]
255 c968e519 2005-01-18 devnull then
256 c968e519 2005-01-18 devnull libsl="$libsl -L$X11/lib64"
257 c968e519 2005-01-18 devnull fi
258 5d03af65 2012-05-29 rsc if [ -d "$X11/lib" ]
259 5d03af65 2012-05-29 rsc then
260 5d03af65 2012-05-29 rsc libsl="$libsl -L$X11/lib"
261 5d03af65 2012-05-29 rsc fi
262 5d03af65 2012-05-29 rsc libsl="$libsl -lX11"
263 ead3e311 2005-01-04 devnull fi
264 ead3e311 2005-01-04 devnull fi
265 fc165dcb 2005-10-19 devnull if $doautoframework
266 fc165dcb 2005-10-19 devnull then
267 fc165dcb 2005-10-19 devnull ofiles=""
268 fc165dcb 2005-10-19 devnull for i
269 fc165dcb 2005-10-19 devnull do
270 fc165dcb 2005-10-19 devnull case "$i" in
271 fc165dcb 2005-10-19 devnull *.[ao])
272 fc165dcb 2005-10-19 devnull ofiles="$ofiles $i"
273 fc165dcb 2005-10-19 devnull ;;
274 fc165dcb 2005-10-19 devnull esac
275 fc165dcb 2005-10-19 devnull done
276 ead3e311 2005-01-04 devnull
277 fc165dcb 2005-10-19 devnull # echo "ofiles $ofiles"
278 fc165dcb 2005-10-19 devnull autoframeworks=""
279 fc165dcb 2005-10-19 devnull if [ "x$ofiles" != "x" ]
280 fc165dcb 2005-10-19 devnull then
281 fc165dcb 2005-10-19 devnull a=`
282 fc165dcb 2005-10-19 devnull nm $ofiles |
283 fc165dcb 2005-10-19 devnull grep '__p9l_autoframework_[a-zA-Z0-9+-]*$' |
284 fc165dcb 2005-10-19 devnull sed 's/.*__p9l_autoframework_//' |
285 fc165dcb 2005-10-19 devnull sort -u
286 fc165dcb 2005-10-19 devnull `
287 fc165dcb 2005-10-19 devnull for i in $a
288 fc165dcb 2005-10-19 devnull do
289 fc165dcb 2005-10-19 devnull autoframeworks="$autoframeworks $i"
290 fc165dcb 2005-10-19 devnull eval "need$i=true"
291 fc165dcb 2005-10-19 devnull done
292 fc165dcb 2005-10-19 devnull fi
293 fc165dcb 2005-10-19 devnull
294 fc165dcb 2005-10-19 devnull if $verbose
295 fc165dcb 2005-10-19 devnull then
296 fc165dcb 2005-10-19 devnull echo "autoframeworks $autoframeworks"
297 fc165dcb 2005-10-19 devnull fi
298 fc165dcb 2005-10-19 devnull
299 fc165dcb 2005-10-19 devnull for i in $autoframeworks
300 fc165dcb 2005-10-19 devnull do
301 fc165dcb 2005-10-19 devnull eval "have$i() { false; }"
302 fc165dcb 2005-10-19 devnull done
303 fc165dcb 2005-10-19 devnull
304 fc165dcb 2005-10-19 devnull frameworks=""
305 fc165dcb 2005-10-19 devnull for i in $autoframeworks
306 cb8f7357 2020-01-20 rsc do
307 fc165dcb 2005-10-19 devnull frameworks="-framework $i $frameworks"
308 fc165dcb 2005-10-19 devnull done
309 fc165dcb 2005-10-19 devnull fi
310 dbd7b9a9 2003-11-23 devnull
311 108559b2 2005-01-19 devnull case "$userpath" in
312 108559b2 2005-01-19 devnull true)
313 54bcb7e9 2005-01-16 devnull for i in "$libsl $@"
314 54bcb7e9 2005-01-16 devnull do
315 54bcb7e9 2005-01-16 devnull case "$i" in
316 54bcb7e9 2005-01-16 devnull -L*)
317 54bcb7e9 2005-01-16 devnull s=`echo $i | sed 's/-L/-Wl,-rpath,/'`
318 54bcb7e9 2005-01-16 devnull extralibs="$extralibs $s"
319 54bcb7e9 2005-01-16 devnull ;;
320 54bcb7e9 2005-01-16 devnull esac
321 54bcb7e9 2005-01-16 devnull done
322 54bcb7e9 2005-01-16 devnull ;;
323 54bcb7e9 2005-01-16 devnull esac
324 54bcb7e9 2005-01-16 devnull
325 3d637e16 2005-01-07 devnull if $verbose
326 ead3e311 2005-01-04 devnull then
327 fc165dcb 2005-10-19 devnull echo $ld -L$PLAN9/lib "$@" $libsl $extralibs $frameworks
328 ead3e311 2005-01-04 devnull fi
329 237c3090 2005-03-18 devnull
330 436ff26c 2019-11-11 crossd xtmp="${TMPDIR-/tmp}/9l.$$.$USER.out"
331 237c3090 2005-03-18 devnull xxout() {
332 cb8f7357 2020-01-20 rsc sed 's/.*: In function `[^:]*: *//' $xtmp | egrep . |
333 cb8f7357 2020-01-20 rsc egrep -v 'is (often|almost always) misused|is dangerous, better use|text-based stub'
334 237c3090 2005-03-18 devnull rm -f $xtmp
335 237c3090 2005-03-18 devnull }
336 237c3090 2005-03-18 devnull
337 fc165dcb 2005-10-19 devnull if $ld -L$PLAN9/lib "$@" $libsl $extralibs $frameworks >$xtmp 2>&1
338 8953da37 2005-01-07 devnull then
339 237c3090 2005-03-18 devnull xxout
340 c8b6342d 2005-01-13 devnull exit 0
341 c8b6342d 2005-01-13 devnull else
342 237c3090 2005-03-18 devnull xxout
343 724b43e6 2005-01-07 devnull rm -f $target
344 724b43e6 2005-01-07 devnull exit 1
345 8953da37 2005-01-07 devnull fi
346 c8b6342d 2005-01-13 devnull