OSDN Git Service

* gcc.c (init_gcc_specs): New function. Make -shared-libgcc
[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_EXT
27 # SHLIB_LINK
28 # SHLIB_MULTILIB
29 # SHLIB_MKMAP
30 # SHLIB_MAPFILES
31 # SHLIB_NM_FLAGS
32 # SHLIB_INSTALL
33
34 # Make needs VPATH to be literal.
35 echo 'srcdir = @srcdir@'
36 echo 'VPATH = @srcdir@'
37 echo 'EQ = ='
38 echo
39 echo 'force:'
40 echo
41
42 # Detect gcc as OLDCC.  This indicates a target for which LIB1FUNCS
43 # is not needed.  This is not quite the same as libgcc1.null, even
44 # on a target not using libgcc1-asm.a.
45
46 if [ "@build_canonical@" = "@target@" ]; then
47   tmp="tmp-$$.c"
48   cat > $tmp <<EOF
49 #ifdef __GNUC__
50   yes;
51 #endif
52 EOF
53   if $OLDCC -E $tmp | grep yes > /dev/null 2>&1; then
54     LIB1FUNCS=""
55   fi
56   rm -f $tmp
57 fi
58
59 # Disable SHLIB_LINK if shared libgcc not enabled.
60 if [ "@enable_shared@" = "no" ]; then
61   SHLIB_LINK=""
62 fi
63
64 # Build lines.
65
66 gcc_compile='$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES)'
67 oldcc_compile='$(OLDCC) -DIN_LIBGCC1 $(CCLIBFLAGS) $(INCLUDES)'
68 make_compile='$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
69           AR_FOR_TARGET="$(AR_FOR_TARGET)" \
70           AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
71           AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
72           AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
73           CC="$(CC)" CFLAGS="$(CFLAGS)" \
74           HOST_PREFIX="$(HOST_PREFIX)" \
75           HOST_PREFIX_1="$(HOST_PREFIX_1)" \
76           LANGUAGES="$(LANGUAGES)"'
77
78 # Dependancies for libgcc1.c
79 libgcc1_c_dep='stmp-dirs $(srcdir)/libgcc1.c $(CONFIG_H)'
80
81 # Dependancies for libgcc2.c
82 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'
83
84 # Dependancies for fp-bit.c
85 fpbit_c_dep='stmp-dirs config.status tsystem.h'
86
87 #
88 # Build libgcc1 components.
89 #
90
91 libgcc1_objs=""
92
93 case X"$LIBGCC1" in
94   Xlibgcc1.null | X)
95     ;;
96
97   Xlibgcc1.cross)
98     echo "You must find a way to make libgcc1 components yourself" 1>&2
99     ;;
100
101   Xlibgcc1-asm.a)
102     for name in $LIB1ASMFUNCS; do
103       for ml in $MULTILIBS; do
104         dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
105         flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
106         out="libgcc/${dir}/${name}${objext}"
107
108         echo ${out}: stmp-dirs '$(srcdir)/config/$(LIB1ASMSRC)'
109         echo "  $gcc_compile" $flags -DL$name -xassembler-with-cpp \
110           -c '$(srcdir)/config/$(LIB1ASMSRC)' -o $out
111
112         # Remove any objects from LIB2FUNCS that are defined as optimized
113         # assembly code in LIB1ASMFUNCS.
114         LIB2FUNCS=`echo $LIB2FUNCS | sed -e 's/^'$name' //' \
115                                          -e 's/ '$name' / /' \
116                                          -e 's/ '$name'$//'`
117       done
118       libgcc1_objs="$libgcc1_objs ${name}${objext}"
119     done
120     ;;
121
122   Xlibgcc1.a)
123     for name in $LIB1FUNCS; do
124       out="libgcc/${name}${objext}"
125
126       echo $out: $libgcc1_c_dep
127       if [ -z "@NO_MINUS_C_MINUS_O@" ]; then
128         echo "  $oldcc_compile" -DL$name $flags -c '$(srcdir)/libgcc1.c' -o $out
129       else
130         echo "  $oldcc_compile" -DL$name $flags -c '$(srcdir)/libgcc1.c'
131         echo "  mv libgcc1${objext} $out"
132       fi
133
134       libgcc1_objs="$libgcc1_objs ${name}${objext}"
135     done
136
137     for file in $LIB1FUNCS_EXTRA; do
138       name=`echo $file | sed -e 's/[.][cS]$//' -e 's/[.]asm$//'`
139       out="libgcc/${name}${objext}"
140
141       echo $out: $file
142       if [ ${name}.asm = $file ]; then
143         echo "  cp $file ${name}.s"
144         file=${name}.s
145       fi
146
147       if [ -z "@NO_MINUS_C_MINUS_O@" ]; then
148         echo "  $oldcc_compile" -c $file -o $out
149       else
150         echo "  $oldcc_compile" -c $file
151         tmp=`echo $file | sed -e 's/[.][cs]$/'${objext}/ -e 's,.*/,,'`
152         echo "  mv $tmp $out"
153       fi
154
155       libgcc1_objs="$libgcc1_objs ${name}${objext}"
156     done
157     ;;
158   *)
159     echo "I'm confused about libgcc1." 1>&2
160     exit 1
161     ;;
162 esac
163
164 #
165 # Build libgcc2 components.
166 #
167
168 libgcc2_objs=""
169
170 for name in $LIB2FUNCS; do
171   for ml in $MULTILIBS; do
172     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
173     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
174     out="libgcc/${dir}/${name}${objext}"
175
176     echo $out: $libgcc2_c_dep
177     echo "      $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
178       -c '$(srcdir)/libgcc2.c' -o $out
179   done
180   libgcc2_objs="$libgcc2_objs ${name}${objext}"
181 done
182
183 for name in $LIB2FUNCS_EH; do
184   for ml in $MULTILIBS; do
185     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
186     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
187     out="libgcc/${dir}/${name}${objext}"
188
189     echo $out: $libgcc2_c_dep
190     echo "      $gcc_compile" '$(MAYBE_USE_COLLECT2)' -fexceptions \
191       $flags -DL$name -c '$(srcdir)/libgcc2.c' -o $out
192   done
193   libgcc2_objs="$libgcc2_objs ${name}${objext}"
194 done
195
196 if [ "$FPBIT" ]; then
197   for name in $FPBIT_FUNCS; do
198     for ml in $MULTILIBS; do
199       dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
200       flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
201       out="libgcc/${dir}/${name}${objext}"
202
203       echo $out: $FPBIT $fpbit_c_dep
204       echo "    $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
205         -c $FPBIT -o $out
206     done
207     libgcc2_objs="$libgcc2_objs ${name}${objext}"
208   done
209 fi
210
211 if [ "$DPBIT" ]; then
212   for name in $DPBIT_FUNCS; do
213     for ml in $MULTILIBS; do
214       dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
215       flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
216       out="libgcc/${dir}/${name}${objext}"
217
218       echo $out: $DPBIT $fpbit_c_dep
219       echo "    $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
220         -c $DPBIT -o $out
221     done
222     libgcc2_objs="$libgcc2_objs ${name}${objext}"
223   done
224 fi
225
226 for file in $LIB2ADD; do
227   name=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
228   oname=`echo $name | sed -e 's,.*/,,'`
229
230   for ml in $MULTILIBS; do
231     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
232     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
233     out="libgcc/${dir}/${oname}${objext}"
234     if [ ${name}.asm = ${file} ]; then
235       flags="$flags -xassembler-with-cpp"
236     fi
237
238     echo $out: stmp-dirs $file
239     echo "      $gcc_compile" $flags -c $file -o $out
240   done
241   libgcc2_objs="$libgcc2_objs ${oname}${objext}"
242 done
243
244 # SHLIB_MKMAP
245 # SHLIB_MAPFILES
246 for ml in $MULTILIBS; do
247   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
248   flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
249
250   libgcc_objs=""
251   for o in $libgcc1_objs; do
252     if [ "$LIBGCC1" = libgcc1-asm.a ]; then
253       libgcc_objs="$libgcc_objs libgcc/${dir}/$o"
254     else
255       libgcc_objs="$libgcc_objs libgcc/$o"
256     fi
257   done
258   for o in $libgcc2_objs; do
259     libgcc_objs="$libgcc_objs libgcc/${dir}/$o"
260   done
261   shlib_deps="$libgcc_objs"
262
263   if [ "$SHLIB_LINK" -a "$SHLIB_MKMAP" -a -z "$mapfile" ]; then
264     mapfile="libgcc.map"
265     echo ""
266     echo "${mapfile}: $SHLIB_MKMAP $SHLIB_MAPFILES $libgcc_objs"
267     echo '      { $(NM_FOR_TARGET)'" $SHLIB_NM_FLAGS $libgcc_objs; echo %%; cat $SHLIB_MAPFILES; } | "'$(AWK)'" -f $SHLIB_MKMAP > "'tmp-$@'
268     echo '      mv tmp-$@ $@'
269   fi
270   shlib_deps="$shlib_deps $mapfile"
271
272   # Depend on EXTRA_MULTILIB_PARTS, since that's where crtbegin/end
273   # usually are put in a true multilib situation.
274   for f in $EXTRA_MULTILIB_PARTS; do
275     shlib_deps="$shlib_deps $dir/$f"
276   done
277
278   echo ""
279   echo "${dir}/libgcc.a: $libgcc_objs"
280   echo "        -rm -rf ${dir}/libgcc.a"
281   echo '        $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a $libgcc_objs
282   echo '        if $(RANLIB_TEST_FOR_TARGET) ; then' \\
283   echo '          $(RANLIB_FOR_TARGET)' ${dir}/libgcc.a ';' \\
284   echo '        else true; fi;'
285
286   if [ "$SHLIB_LINK" ]; then
287     if [ -z "$SHLIB_MULTILIB" ]; then
288       if [ "$dir" = "." ]; then
289         shlib_base_name="libgcc_s";
290       else
291         shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
292       fi
293       echo ""
294       echo "${dir}/${shlib_base_name}${SHLIB_EXT}: $shlib_deps"
295       echo "    $SHLIB_LINK" \
296          | sed -e "s%@multilib_flags@%$flags%g" \
297                -e "s%@multilib_dir@%$dir%g" \
298                -e "s%@shlib_objs@%$libgcc_objs%g" \
299                -e "s%@shlib_base_name@%$shlib_base_name%g" \
300                -e "s%@shlib_map_file@%$mapfile%g"
301     elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
302       shlib_base_name="libgcc_s";
303       echo ""
304       echo "${shlib_base_name}${SHLIB_EXT}: $shlib_deps"
305       echo "    $SHLIB_LINK" \
306          | sed -e "s%@multilib_flags@%$flags%g" \
307                -e "s%@multilib_dir@%$dir%g" \
308                -e "s%@shlib_objs@%$libgcc_objs%g" \
309                -e "s%@shlib_base_name@%$shlib_base_name%g" \
310                -e "s%@shlib_map_file@%$mapfile%g"
311     fi
312   fi
313 done
314
315 dirs=libgcc
316 for ml in $MULTILIBS; do
317   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
318   if [ $dir != . ]; then
319     dirs="$dirs libgcc/${dir}"
320   fi
321 done
322 echo ''
323 echo 'libgcc-stage-start:'
324 echo '  for dir in '"${dirs}"'; do \'
325 echo '    if [ -d $(stage)/$$dir ]; then true; else mkdir $(stage)/$$dir; fi; \'
326 echo '  done'
327 echo '  -for dir in '"${dirs}"'; do \'
328 echo '    mv $$dir/*'"${objext}"' $(stage)/$$dir; \'
329 echo '  done'
330
331 echo ""
332 all=stmp-dirs
333 dirs=libgcc
334
335 for ml in $MULTILIBS; do
336   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
337   if [ $dir != . ]; then
338     dirs="$dirs ${dir} libgcc/${dir}"
339   fi
340   all="$all ${dir}/libgcc.a"
341   if [ "$SHLIB_LINK" ]; then
342     if [ -z "$SHLIB_MULTILIB" ]; then
343       if [ "$dir" = "." ]; then
344         suff="";
345       else
346         suff=_`echo $dir | sed s,/,_,g`
347       fi
348       all="$all ${dir}/libgcc_s${suff}${SHLIB_EXT}"
349     elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
350       all="$all libgcc_s${SHLIB_EXT}"
351     fi
352   fi
353 done
354
355 echo 'stmp-dirs: force'
356 echo '  for d in '"$dirs"'; do \'
357 echo '    if [ -d $$d ]; then true; else mkdir $$d; fi \'
358 echo '  done'
359 echo '  if [ -f stmp-dirs ]; then true; else touch stmp-dirs; fi'
360
361 for f in $EXTRA_MULTILIB_PARTS; do
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     case $dir in
366     .) out=$f ; t= ;;
367     *) out=$dir/$f ; t=$dir/ ;;
368     esac
369     case $out in
370     # Prevent `make' from interpreting $out as a macro assignment
371     *'$(EQ)'*) targ="T_TARGET=$out T_TARGET" ;;
372     *) targ=$out ;;
373     esac
374
375     echo $out: stmp-dirs
376     echo "      $make_compile" \\
377     echo '        LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
378     echo '        MULTILIB_CFLAGS="'$flags'"' T=$t $targ
379
380     all="$all $out"
381   done
382 done
383
384 echo ""
385 echo "all: $all"
386
387 echo ""
388 echo "install: $all"
389 for ml in $MULTILIBS; do
390   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
391   if [ $dir != . ]; then
392     ldir='$(libsubdir)'/$dir
393     echo "      if [ -d $ldir ]; then true; else mkdir $ldir; chmod a+rx $ldir; fi;"
394   else
395     ldir='$(libsubdir)'
396   fi
397   echo '        $(INSTALL_DATA)' ${dir}/libgcc.a ${ldir}/
398   echo '        $(RANLIB_FOR_TARGET)' ${ldir}/libgcc.a
399
400   if [ "$SHLIB_LINK" ]; then
401     if [ -z "$SHLIB_MULTILIB" ]; then
402       if [ "$dir" = "." ]; then
403         shlib_base_name="libgcc_s";
404       else
405         shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
406       fi
407       echo "    $SHLIB_INSTALL" \
408         | sed -e "s%@shlib_base_name@%$shlib_base_name%g"
409     elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
410       shlib_base_name="libgcc_s";
411       echo "    $SHLIB_INSTALL" \
412         | sed -e "s%@shlib_base_name@%$shlib_base_name%g"
413     fi
414   fi
415 done
416 for f in $EXTRA_MULTILIB_PARTS; do
417   for ml in $MULTILIBS; do
418     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
419     if [ $dir != . ]; then
420       out=${dir}/$f
421       ldir='$(libsubdir)'/$dir
422     else
423       out=$f
424       ldir='$(libsubdir)'
425     fi
426     echo '      $(INSTALL_DATA)' $out $ldir/
427   done
428 done