Blob


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