06d33beeb9ec16f744be87a20b99264bed69ec43
[43bsd.git] / xify / ld.sh
1 #!/bin/sh
2
3 BIN="$0"
4 if ! echo $BIN |grep -q /
5 then
6   BIN=`which $BIN`
7 fi
8 BIN=`dirname $BIN`
9
10 hostcc=gcc
11 hostld=ld
12 mkdir=mkdir
13 ln=ln
14 rm=rm
15
16 export PATH=/bin:/usr/bin
17
18 outfile=
19 dirs=
20 files=
21 Mflag=
22 xflag=
23 Xflag=
24 Sflag=
25 rflag=
26 arflag=
27 sflag=
28 nflag=
29 Nflag=
30 zflag=
31 dflag=
32 trace=
33 ytab=
34 objs=
35
36 while test $# -ge 1
37 do
38   case "$1" in
39   -o)
40     if test -z "$2"
41     then
42       echo "$0: error: -o where?" >&2
43       exit 1
44     fi
45     outfile=$2
46     shift
47     ;;
48   -M)
49     Mflag=1
50     ;;
51   -x)
52     xflag=1
53     ;;
54   -X)
55     Xflag=1
56     ;;
57   -S)
58     Sflag=1
59     ;;
60   -r)
61     rflag=1
62     arflag=1
63     ;;
64   -s)
65     sflag=1
66     xflag=1
67     ;;
68   -n)
69     nflag=1
70     Nflag=
71     zflag=
72     ;;
73   -N)
74     Nflag=1
75     nflag=
76     zflag=
77     ;;
78   -d)
79     dflag=1
80     ;;
81   -i)
82     echo "$0: warning: -i ignored" >&2
83     ;;
84   -t)
85     trace=1
86     ;;
87   -y*)
88     if test "$1" = "-y"
89     then
90       echo "$0: warning: -y: symbol name missing"
91     else
92       ytab="$ytab `echo $1 |sed -e 's/^-y//'`"
93     fi
94     ;;
95   -z)
96     zflag=1
97     Nflag=
98     nflag=
99     ;;
100   -L*)
101     if test "$1" = "-L"
102     then
103       echo "$0: warning: -L: pathname missing"
104     else
105       dirs="$dirs `echo $1 |sed -e 's/^-L//'`"
106     fi
107     ;;
108   -l*)
109     if test "$1" = "-l"
110     then
111       echo "$0: warning: -l: library name missing"
112     else
113       files="$files $1"
114     fi
115     ;;
116   -*)
117     echo "$0: error: bad flag $1" >&2
118     exit 1
119     ;;
120   *)
121     files="$files $1"
122     ;;
123   esac
124   shift
125 done
126
127 dirs="$dirs $BIN/../lib $BIN/../usr/lib $BIN/../usr/local/lib"
128
129 if test -z "$rflag" -a -z "$Nflag" -a -z "$nflag"
130 then
131   zflag=1
132 fi
133
134 #echo "outfile=$outfile"
135 #echo "Mflag=$Mflag"
136 #echo "xflag=$xflag"
137 #echo "Xflag=$Xflag"
138 #echo "Sflag=$Sflag"
139 #echo "rflag=$rflag"
140 #echo "arflag=$arflag"
141 #echo "sflag=$sflag"
142 #echo "nflag=$nflag"
143 #echo "Nflag=$Nflag"
144 #echo "zflag=$zflag"
145 #echo "dflag=$dflag"
146 #echo "trace=$trace"
147 #echo "ytab=$ytab"
148 #echo "dirs=$dirs"
149 #echo "files=$files"
150
151 if test -n "$rflag"
152 then
153   cmd="$hostld"
154 else
155   cmd="$hostcc"
156 fi
157 if test -n "$outfile"
158 then
159   cmd="$cmd -o $outfile"
160 fi
161 for i in $dirs
162 do
163   cmd="$cmd -L$i/.xify"
164 done
165 if test -n "$rflag"
166 then
167   cmd="$cmd -r"
168 fi
169 for i in $files
170 do
171   case "$i" in
172   -lnox_*)
173     cmd="$cmd `echo $i |sed -e 's/^-lnox_/-l/'`"
174     ;;
175   -l*)
176     j=`echo $i |sed -e 's/^-l//'`
177     for k in $dirs
178     do
179       if test -f $k/lib$j.a
180       then
181         if ! test -f $k/.xify/libx_$j.a
182         then
183           if test -n "$trace"
184           then
185             echo $mkdir -p $k/.xify
186           fi
187           $mkdir -p $k/.xify
188           if test -n "$trace"
189           then
190             echo $ln -s ../lib$j.a $k/.xify/libx_$j.a
191           fi
192           $ln -s ../lib$j.a $k/.xify/libx_$j.a
193         fi
194         break
195       fi
196       if test -n "$trace"
197       then
198         echo $rm -f $k/.xify/libx_$j.a
199       fi
200       $rm -f $k/.xify/libx_$j.a
201     done
202     cmd="$cmd -lx_$j"
203     ;;
204   *)
205     cmd="$cmd $i"
206     ;;
207   esac
208 done
209 if test -n "$trace"
210 then
211   echo $cmd
212 fi
213 $cmd
214 exit $?