Blob


1 #!/bin/sh
3 test -f $PLAN9/config && . $PLAN9/config
4 libsl=""
6 doautolib=true
7 verbose=false
9 if [ "x$1" = "x-l" ]
10 then
11 shift
12 doautolib=false
13 elif [ "x$1" = "x-v" ]
14 then
15 shift
16 verbose=true
17 fi
19 target=a.out
20 if [ "x$1" = "x-o" ]
21 then
22 target=$2
23 fi
25 if $doautolib
26 then
27 ofiles=""
28 for i
29 do
30 case "$i" in
31 *.[ao])
32 ofiles="$ofiles $i"
33 ;;
34 esac
35 done
37 # echo "ofiles $ofiles"
38 autolibs=""
39 if [ "x$ofiles" != "x" ]
40 then
41 a=`
42 nm $ofiles |
43 grep '__p9l_autolib_[a-zA-Z0-9+-]*$' |
44 sed 's/.*__p9l_autolib_//' |
45 sort -u
46 `
47 for i in $a
48 do
49 autolibs="$autolibs $i"
50 eval "need$i=true"
51 done
52 fi
54 # fetch dependencies out of libraries
55 workq="$autolibs"
56 while [ "x$workq" != "x" ]
57 do
58 w="$workq"
59 workq=""
60 for i in $w
61 do
62 # can't trust the libraries about using
63 # libthread - we might not be linking with
64 # those object files.
65 a=`
66 nm $PLAN9/lib/lib$i.a |
67 grep '__p9l_autolib_[a-zA-Z0-9+-]*$' |
68 sed 's/.*__p9l_autolib_//' |
69 sort -u |
70 grep -v thread
71 `
72 okayfn="true"
73 for j in $a
74 do
75 if eval "[ x\$need$j = x ]"
76 then
77 autolibs="$autolibs $j"
78 workq="$workq $j"
79 eval "need$j=true"
80 fi
81 if [ $j != $i ]
82 then
83 okayfn="$okayfn && have$j"
84 fi
85 done
86 # echo "can$i: $okayfn"
87 eval "can$i() { $okayfn; }"
88 done
89 done
90 if $verbose
91 then
92 echo "autolibs $autolibs"
93 fi
95 for i in $autolibs
96 do
97 eval "have$i() { false; }"
98 done
99 havethread() { false; }
101 # now find correct order
102 libsl=""
103 while [ "x$autolibs" != x ]
104 do
105 stillneed=""
106 didnothing=true
107 for i in $autolibs
108 do
109 if eval "can$i"
110 then
111 libsl="-l$i $libsl"
112 eval "have$i() { true; }"
113 didnothing=false
114 else
115 stillneed="$stillneed $i"
116 fi
117 done
118 # break cycle by setting the last library on the list
119 # to have no dependencies
120 if $didnothing
121 then
122 j="xxx"
123 for i in $autolibs
124 do
125 j=$i
126 done
127 echo "dependency cycle: $autolibs; breaking with $j"
128 eval "can$j() { true; }"
129 fi
130 autolibs="$stillneed"
131 done
132 if $verbose
133 then
134 echo "liborder $libsl"
135 fi
136 libsl="$libsl -l9"
138 # cycle: lib9 expects p9main, which is defined in libthread. oops.
139 if havethread
140 then
141 libsl="$libsl -lthread -l9"
142 fi
144 if [ "x$needdraw" = xtrue ]
145 then
146 if [ "x$X11" = "x" ]
147 then
148 X11=/usr/X11R6
149 fi
150 libsl="$libsl -L$X11/lib -lX11"
151 fi
152 fi
154 extralibs="-lm"
155 tag="${SYSNAME:-`uname`}-${OBJTYPE:-`uname -m`}"
156 case "$tag" in
157 *OpenBSD*)
158 ld=gcc
159 extralibs="$extralibs -lutil -lpthread"
160 ;;
161 *FreeBSD*)
162 ld=gcc
163 extralibs="$extralibs -lutil"
164 case "`uname -r`" in
165 [5-9].*)
166 extralibs="$extralibs -lpthread"
167 ;;
168 esac
169 ;;
170 *BSD*)
171 ld=gcc
172 extralibs="$extralibs -lutil"
173 ;;
174 *Linux*)
175 ld=gcc
176 extralibs="$extralibs -lutil"
177 case "${SYSVERSION:-`uname -r`}" in
178 2.6.*)
179 extralibs="$extralibs -lpthread"
180 ;;
181 esac
182 ;;
183 *Darwin*)
184 ld=gcc
185 ;;
186 *SunOS*)
187 ld="${CC9:-cc} -g"
188 extralibs="$extralibs -lrt -lpthread -lsocket -lnsl"
189 # Record paths to shared libraries to avoid needing LD_LIBRARY_PATH
190 for i in "$libsl $@"
191 do
192 case "$i" in
193 -L*)
194 s=`echo $i | sed 's/-L/-R/'`
195 extralibs="$extralibs $s"
196 ;;
197 esac
198 done
199 ;;
200 *)
201 echo do not know how to link on "$tag" 1>&2
202 exit 1
203 esac
205 case "$ld" in
206 gcc)
207 for i in "$libsl $@"
208 do
209 case "$i" in
210 -L*)
211 s=`echo $i | sed 's/-L/-Wl,-rpath,/'`
212 extralibs="$extralibs $s"
213 ;;
214 esac
215 done
216 ;;
217 esac
219 if $verbose
220 then
221 echo $ld -L$PLAN9/lib "$@" $libsl $extralibs
222 fi
223 if $ld -L$PLAN9/lib "$@" $libsl $extralibs
224 then
225 exit 0
226 else
227 rm -f $target
228 exit 1
229 fi