OSDN Git Service

* configure.in (enable-shared): New.
[pf3gnuchains/gcc-fork.git] / gcc / mklibgcc.in
1 #!/bin/sh
2 # Construct makefile for libgcc.
3 #   Copyright (C) 2000 Free Software Foundation, Inc.
4 #
5 # This file is part of GNU CC.
6
7 # Arguments, taken from the environment, since there are a lot
8 # of them, and positional args becomes quite ugly.
9 #
10 # objext
11 # OLDCC
12 # LIBGCC1
13 # LIB1FUNCS
14 # LIB1ASMFUNCS
15 # LIB1FUNCS_EXTRA
16 # LIB2FUNCS
17 # LIB2FUNCS_EH
18 # LIB2ADD
19 # FPBIT
20 # FPBIT_FUNCS
21 # DPBIT
22 # DPBIT_FUNCS
23 # LIBGCC
24 # MULTILIBS
25 # EXTRA_MULTILIB_PARTS
26 # SHLIB_LINK
27 # SHLIB_LIBS
28 # SHLIB_MULTILIB
29
30 # Make needs VPATH to be literal.
31 echo 'srcdir = @srcdir@'
32 echo 'VPATH = @srcdir@'
33 echo 'EQ = ='
34 echo
35 echo 'force:'
36 echo
37
38 # Detect gcc as OLDCC.  This indicates a target for which LIB1FUNCS
39 # is not needed.  This is not quite the same as libgcc1.null, even
40 # on a target not using libgcc1-asm.a.
41
42 if [ "@build_canonical@" = "@target@" ]; then
43   tmp="tmp-$$.c"
44   cat > $tmp <<EOF
45 #ifdef __GNUC__
46   yes;
47 #endif
48 EOF
49   if $OLDCC -E $tmp | grep yes > /dev/null 2>&1; then
50     LIB1FUNCS=""
51   fi
52   rm -f $tmp
53 fi
54
55 # Disable SHLIB_LINK if shared libgcc not enabled.
56 if [ "@enable_shared@" = "no" ]; then
57   SHLIB_LINK=""
58 fi
59
60 # Build lines.
61
62 gcc_compile='$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES)'
63 oldcc_compile='$(OLDCC) -DIN_LIBGCC1 $(CCLIBFLAGS) $(INCLUDES)'
64 make_compile='$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
65           AR_FOR_TARGET="$(AR_FOR_TARGET)" \
66           AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
67           AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
68           AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
69           CC="$(CC)" CFLAGS="$(CFLAGS)" \
70           HOST_PREFIX="$(HOST_PREFIX)" \
71           HOST_PREFIX_1="$(HOST_PREFIX_1)" \
72           LANGUAGES="$(LANGUAGES)"'
73
74 # Dependancies for libgcc1.c
75 libgcc1_c_dep='stmp-dirs $(srcdir)/libgcc1.c $(CONFIG_H)'
76
77 # Dependancies for libgcc2.c
78 libgcc2_c_dep='stmp-dirs $(srcdir)/libgcc2.c $(CONFIG_H) $(MACHMODE_H) longlong.h frame.h gbl-ctors.h config.status stmp-int-hdrs tsystem.h'
79
80 # Dependancies for fp-bit.c
81 fpbit_c_dep='stmp-dirs config.status tsystem.h'
82
83 #
84 # Build libgcc1 components.
85 #
86
87 libgcc1_objs=""
88
89 case X"$LIBGCC1" in
90   Xlibgcc1.null | X)
91     ;;
92
93   Xlibgcc1.cross)
94     echo "You must find a way to make libgcc1 components yourself" 1>&2
95     ;;
96
97   Xlibgcc1-asm.a)
98     for name in $LIB1ASMFUNCS; do
99       for ml in $MULTILIBS; do
100         dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
101         flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
102         out="libgcc/${dir}/${name}${objext}"
103
104         echo ${out}: stmp-dirs '$(srcdir)/config/$(LIB1ASMSRC)'
105         echo "  $gcc_compile" $flags -DL$name -xassembler-with-cpp \
106           -c '$(srcdir)/config/$(LIB1ASMSRC)' -o $out
107
108         # Remove any objects from LIB2FUNCS that are defined as optimized
109         # assembly code in LIB1ASMFUNCS.
110         LIB2FUNCS=`echo $LIB2FUNCS | sed -e 's/^'$name' //' \
111                                          -e 's/ '$name' / /' \
112                                          -e 's/ '$name'$//'`
113       done
114       libgcc1_objs="$libgcc1_objs ${name}${objext}"
115     done
116     ;;
117
118   Xlibgcc1.a)
119     for name in $LIB1FUNCS; do
120       out="libgcc/${name}${objext}"
121
122       echo $out: $libgcc1_c_dep
123       if [ -z "@NO_MINUS_C_MINUS_O@" ]; then
124         echo "  $oldcc_compile" -DL$name $flags -c '$(srcdir)/libgcc1.c' -o $out
125       else
126         echo "  $oldcc_compile" -DL$name $flags -c '$(srcdir)/libgcc1.c'
127         echo "  mv libgcc1${objext} $out"
128       fi
129
130       libgcc1_objs="$libgcc1_objs ${name}${objext}"
131     done
132
133     for file in $LIB1FUNCS_EXTRA; do
134       name=`echo $file | sed -e 's/[.][cS]$//' -e 's/[.]asm$//'`
135       out="libgcc/${name}${objext}"
136
137       echo $out: $file
138       if [ ${name}.asm = $file ]; then
139         echo "  cp $file ${name}.s"
140         file=${name}.s
141       fi
142
143       if [ -z "@NO_MINUS_C_MINUS_O@" ]; then
144         echo "  $oldcc_compile" -c $file -o $out
145       else
146         echo "  $oldcc_compile" -c $file
147         tmp=`echo $file | sed -e 's/[.][cs]$/'${objext}/ -e 's,.*/,,'`
148         echo "  mv $tmp $out"
149       fi
150
151       libgcc1_objs="$libgcc1_objs ${name}${objext}"
152     done
153     ;;
154   *)
155     echo "I'm confused about libgcc1." 1>&2
156     exit 1
157     ;;
158 esac
159
160 #
161 # Build libgcc2 components.
162 #
163
164 libgcc2_objs=""
165
166 for name in $LIB2FUNCS; do
167   for ml in $MULTILIBS; do
168     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
169     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
170     out="libgcc/${dir}/${name}${objext}"
171
172     echo $out: $libgcc2_c_dep
173     echo "      $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
174       -c '$(srcdir)/libgcc2.c' -o $out
175   done
176   libgcc2_objs="$libgcc2_objs ${name}${objext}"
177 done
178
179 for name in $LIB2FUNCS_EH; do
180   for ml in $MULTILIBS; do
181     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
182     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
183     out="libgcc/${dir}/${name}${objext}"
184
185     echo $out: $libgcc2_c_dep
186     echo "      $gcc_compile" '$(MAYBE_USE_COLLECT2)' -fexceptions \
187       $flags -DL$name -c '$(srcdir)/libgcc2.c' -o $out
188   done
189   libgcc2_objs="$libgcc2_objs ${name}${objext}"
190 done
191
192 if [ "$FPBIT" ]; then
193   for name in $FPBIT_FUNCS; do
194     for ml in $MULTILIBS; do
195       dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
196       flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
197       out="libgcc/${dir}/${name}${objext}"
198
199       echo $out: $FPBIT $fpbit_c_dep
200       echo "    $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
201         -c $FPBIT -o $out
202     done
203     libgcc2_objs="$libgcc2_objs ${name}${objext}"
204   done
205 fi
206
207 if [ "$DPBIT" ]; then
208   for name in $DPBIT_FUNCS; do
209     for ml in $MULTILIBS; do
210       dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
211       flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
212       out="libgcc/${dir}/${name}${objext}"
213
214       echo $out: $DPBIT $fpbit_c_dep
215       echo "    $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
216         -c $DPBIT -o $out
217     done
218     libgcc2_objs="$libgcc2_objs ${name}${objext}"
219   done
220 fi
221
222 for file in $LIB2ADD; do
223   name=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
224   oname=`echo $name | sed -e 's,.*/,,'`
225
226   if [ ${name}.txt = ${file} ]; then
227     fprime=`cat $file`
228     for f in $fprime; do
229
230       lastout="stmp-dirs $file"
231       for ml in $MULTILIBS; do
232         dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
233         flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
234         out="libgcc/${dir}/${f}"
235
236         # Depend on previous out to serialize all sub-makes of this
237         # target file.  This because ./$f is used as a temporary in
238         # each case before being moved to libgcc/$dir/.
239         echo $out: $lastout
240         echo "  $make_compile" \\
241         echo '    LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
242         echo '    MULTILIB_CFLAGS="'$flags'"' $f
243         echo "  mv $f $out"
244
245         lastout="$out"
246       done
247
248       libgcc2_objs="$libgcc2_objs $f"
249     done
250   else
251     for ml in $MULTILIBS; do
252       dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
253       flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
254       out="libgcc/${dir}/${oname}${objext}"
255       if [ ${name}.asm = ${file} ]; then
256         flags="$flags -xassembler-with-cpp"
257       fi
258
259       echo $out: stmp-dirs $file
260       echo "    $gcc_compile" $flags -c $file -o $out
261     done
262     libgcc2_objs="$libgcc2_objs ${oname}${objext}"
263   fi
264 done
265
266 for ml in $MULTILIBS; do
267   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
268   flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
269
270   libgcc_objs=""
271   for o in $libgcc1_objs; do
272     if [ "$LIBGCC1" = libgcc1-asm.a ]; then
273       libgcc_objs="$libgcc_objs libgcc/${dir}/$o"
274     else
275       libgcc_objs="$libgcc_objs libgcc/$o"
276     fi
277   done
278   for o in $libgcc2_objs; do
279     libgcc_objs="$libgcc_objs libgcc/${dir}/$o"
280   done
281
282   echo ""
283   echo "${dir}/libgcc.a: $libgcc_objs"
284   echo "        -rm -rf ${dir}/libgcc.a"
285   echo '        $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a $libgcc_objs
286   echo '        if $(RANLIB_TEST_FOR_TARGET) ; then' \\
287   echo '          $(RANLIB_FOR_TARGET)' ${dir}/libgcc.a ';' \\
288   echo '        else true; fi;'
289
290   if [ "$SHLIB_LINK" ]; then
291     if [ -z "$SHLIB_MULTILIB" ]; then
292       if [ "$dir" = "." ]; then
293         shlib_base_name="libgcc_s";
294       else
295         shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
296       fi
297       echo ""
298       echo "${dir}/${shlib_base_name}.so: $libgcc_objs"
299       echo "    $SHLIB_LINK $flags -o ${shlib_base_name}.so $libgcc_objs $SHLIB_LIBS" | sed "s/@shlib_base_name@/$shlib_base_name/g"
300     elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
301       shlib_base_name="libgcc_s";
302       echo ""
303       echo "${shlib_base_name}.so: $libgcc_objs"
304       echo "    $SHLIB_LINK $flags -o ${shlib_base_name}.so $libgcc_objs $SHLIB_LIBS" | sed "s/@shlib_base_name@/$shlib_base_name/g"
305     fi
306   fi
307 done
308
309 dirs=libgcc
310 for ml in $MULTILIBS; do
311   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
312   if [ $dir != . ]; then
313     dirs="$dirs libgcc/${dir}"
314   fi
315 done
316 echo ''
317 echo 'libgcc-stage-start:'
318 echo '  for dir in '"${dirs}"'; do \'
319 echo '    if [ -d $(stage)/$$dir ]; then true; else mkdir $(stage)/$$dir; fi; \'
320 echo '  done'
321 echo '  -for dir in '"${dirs}"'; do \'
322 echo '    mv $$dir/*'"${objext}"' $(stage)/$$dir; \'
323 echo '  done'
324
325 echo ""
326 all=stmp-dirs
327 dirs=libgcc
328
329 for ml in $MULTILIBS; do
330   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
331   if [ $dir != . ]; then
332     dirs="$dirs ${dir} libgcc/${dir}"
333   fi
334   all="$all ${dir}/libgcc.a"
335   if [ "$SHLIB_LINK" ]; then
336     if [ -z "$SHLIB_MULTILIB" ]; then
337       if [ "$dir" = "." ]; then
338         suff="";
339       else
340         suff=_`echo $dir | sed s,/,_,g`
341       fi
342       all="$all ${dir}/libgcc_s${suff}.so"
343     elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
344       all="$all libgcc_s.so"
345     fi
346       if [ "$dir" = "." ]; then
347         suff="";
348       else
349         suff=_`echo $dir | sed s,/,_,g`
350       fi
351   fi
352 done
353
354 echo 'stmp-dirs: force'
355 echo '  for d in '"$dirs"'; do \'
356 echo '    if [ -d $$d ]; then true; else mkdir $$d; fi \'
357 echo '  done'
358 echo '  if [ -f stmp-dirs ]; then true; else touch stmp-dirs; fi'
359
360 for f in $EXTRA_MULTILIB_PARTS; do
361   lastout="stmp-dirs force"
362   for ml in $MULTILIBS; do
363     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
364     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
365     out="$dir/$f"
366
367     # Depend on previous out to serialize all sub-makes of this
368     # target file.  This because ./$f is used as a temporary in
369     # each case before being moved to libgcc/$dir/.
370     echo $out: $lastout
371     echo "      $make_compile" \\
372     echo '        LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
373     echo '        MULTILIB_CFLAGS="'$flags'"' T=t t$f
374     echo "      mv t$f $out"
375
376     all="$all $out"
377     lastout="$out"
378   done
379 done
380
381 echo ""
382 echo "all: $all"