OSDN Git Service

2002-03-30 Daniel Berlin <dan@dberlin.org>
[pf3gnuchains/gcc-fork.git] / gcc / mklibgcc.in
1 #!/bin/sh
2 # Construct makefile for libgcc.
3 #   Copyright (C) 2000, 2002 Free Software Foundation, Inc.
4 #
5 # This file is part of GCC.
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 # LIB1ASMFUNCS
12 # LIB2FUNCS_1
13 # LIB2FUNCS_2
14 # LIB2FUNCS_ST
15 # LIB2ADD
16 # LIB2ADD_ST 
17 # LIB2ADDEH
18 # LIB2ADDEHDEP
19 # FPBIT
20 # FPBIT_FUNCS
21 # LIB2_DIVMOD_FUNCS
22 # DPBIT
23 # DPBIT_FUNCS
24 # LIBGCC
25 # MULTILIBS
26 # EXTRA_MULTILIB_PARTS
27 # SHLIB_EXT
28 # SHLIB_LINK
29 # SHLIB_MULTILIB
30 # SHLIB_MKMAP
31 # SHLIB_MKMAP_OPTS
32 # SHLIB_MAPFILES
33 # SHLIB_NM_FLAGS
34 # SHLIB_INSTALL
35
36 # Make needs VPATH to be literal.
37 echo 'srcdir = @srcdir@'
38 echo 'VPATH = @srcdir@'
39 echo 'EQ = ='
40 echo
41 echo 'force:'
42 echo
43
44 # Disable SHLIB_LINK if shared libgcc not enabled.
45 if [ "@enable_shared@" = "no" ]; then
46   SHLIB_LINK=""
47 fi
48
49 # Build lines.
50
51 gcc_compile='$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES)'
52 make_compile='$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
53           AR_FOR_TARGET="$(AR_FOR_TARGET)" \
54           AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
55           AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
56           AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
57           CC="$(CC)" CFLAGS="$(CFLAGS)" \
58           HOST_PREFIX="$(HOST_PREFIX)" \
59           HOST_PREFIX_1="$(HOST_PREFIX_1)" \
60           LANGUAGES="$(LANGUAGES)"'
61
62 # Dependencies for libgcc2.c
63 libgcc2_c_dep='stmp-dirs $(srcdir)/libgcc2.c $(CONFIG_H) $(MACHMODE_H) longlong.h gbl-ctors.h config.status stmp-int-hdrs tsystem.h'" $LIB2ADDEHDEP"
64
65 # Dependencies for fp-bit.c
66 fpbit_c_dep='stmp-dirs config.status tsystem.h'
67
68 #
69 # Build libgcc1 components.
70 #
71
72 libgcc1_objs=""
73
74 for name in $LIB1ASMFUNCS; do
75   for ml in $MULTILIBS; do
76     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
77     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
78     out="libgcc/${dir}/${name}${objext}"
79
80     echo ${out}: stmp-dirs '$(srcdir)/config/$(LIB1ASMSRC)'
81     echo "      $gcc_compile" $flags -DL$name -xassembler-with-cpp \
82           -c '$(srcdir)/config/$(LIB1ASMSRC)' -o $out
83
84     # Remove any objects from LIB2FUNCS and LIB2_DIVMOD_FUNCS that are
85     # defined as optimized assembly code in LIB1ASMFUNCS.
86     LIB2FUNCS_1=`echo $LIB2FUNCS_1 | sed -e 's/^'$name' //' \
87                                          -e 's/ '$name' / /' \
88                                          -e 's/ '$name'$//'`
89     LIB2FUNCS_2=`echo $LIB2FUNCS_2 | sed -e 's/^'$name' //' \
90                                          -e 's/ '$name' / /' \
91                                          -e 's/ '$name'$//'`
92     LIB2_DIVMOD_FUNCS=`echo $LIB2_DIVMOD_FUNCS | sed -e 's/^'$name' //' \
93                                                      -e 's/ '$name' / /' \
94                                                      -e 's/ '$name'$//'`
95   done
96   libgcc1_objs="$libgcc1_objs ${name}${objext}"
97 done
98
99 #
100 # Build libgcc2 components.
101 #
102
103 libgcc2_objs=""
104 libgcc2_st_objs=""
105 libgcc2_eh_objs=""
106
107 for name in $LIB2FUNCS_1 $LIB2FUNCS_2; do
108   for ml in $MULTILIBS; do
109     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
110     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
111     out="libgcc/${dir}/${name}${objext}"
112
113     echo $out: $libgcc2_c_dep
114     echo "      $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
115       -c '$(srcdir)/libgcc2.c' -o $out
116   done
117   libgcc2_objs="$libgcc2_objs ${name}${objext}"
118 done
119
120 for name in $LIB2FUNCS_ST; do
121   for ml in $MULTILIBS; do
122     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
123     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
124     out="libgcc/${dir}/${name}${objext}"
125
126     echo $out: $libgcc2_c_dep
127     echo "      $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
128       -c '$(srcdir)/libgcc2.c' -o $out
129   done
130   libgcc2_st_objs="$libgcc2_st_objs ${name}${objext}"
131 done
132
133 for name in $LIB2_DIVMOD_FUNCS; do
134   for ml in $MULTILIBS; do
135     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
136     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
137     out="libgcc/${dir}/${name}${objext}"
138
139     echo $out: $libgcc2_c_dep
140     echo "      $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
141       -c '$(srcdir)/libgcc2.c' -fexceptions -fnon-call-exceptions -o $out
142   done
143   libgcc2_objs="$libgcc2_objs ${name}${objext}"
144 done
145
146 if [ "$FPBIT" ]; then
147   for name in $FPBIT_FUNCS; do
148     for ml in $MULTILIBS; do
149       dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
150       flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
151       out="libgcc/${dir}/${name}${objext}"
152
153       echo $out: $FPBIT $fpbit_c_dep
154       echo "    $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
155         -c $FPBIT -o $out
156     done
157     libgcc2_objs="$libgcc2_objs ${name}${objext}"
158   done
159 fi
160
161 if [ "$DPBIT" ]; then
162   for name in $DPBIT_FUNCS; do
163     for ml in $MULTILIBS; do
164       dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
165       flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
166       out="libgcc/${dir}/${name}${objext}"
167
168       echo $out: $DPBIT $fpbit_c_dep
169       echo "    $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
170         -c $DPBIT -o $out
171     done
172     libgcc2_objs="$libgcc2_objs ${name}${objext}"
173   done
174 fi
175
176 for file in $LIB2ADD; do
177   name=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
178   oname=`echo $name | sed -e 's,.*/,,'`
179
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}/${oname}${objext}"
184     if [ ${name}.asm = ${file} ]; then
185       flags="$flags -xassembler-with-cpp"
186     fi
187
188     echo $out: stmp-dirs $file
189     echo "      $gcc_compile" $flags -c $file -o $out
190   done
191   libgcc2_objs="$libgcc2_objs ${oname}${objext}"
192 done
193
194 for file in $LIB2ADDEH; do
195   name=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
196   oname=`echo $name | sed -e 's,.*/,,'`
197
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}/${oname}${objext}"
202     if [ ${name}.asm = ${file} ]; then
203       flags="$flags -xassembler-with-cpp"
204     fi
205
206     echo $out: stmp-dirs $file
207     echo "      $gcc_compile" $flags -fexceptions -c $file -o $out
208   done
209   if [ "$SHLIB_LINK" ]; then
210     libgcc2_eh_objs="$libgcc2_eh_objs ${oname}${objext}"
211   else
212     libgcc2_objs="$libgcc2_objs ${oname}${objext}"
213   fi
214 done
215
216 for file in $LIB2ADD_ST; do
217   name=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
218   oname=`echo $name | sed -e 's,.*/,,'`
219
220   for ml in $MULTILIBS; do
221     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
222     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
223     out="libgcc/${dir}/${oname}${objext}"
224     if [ ${name}.asm = ${file} ]; then
225       flags="$flags -xassembler-with-cpp"
226     fi
227
228     echo $out: stmp-dirs $file
229     echo "      $gcc_compile" $flags -c $file -o $out
230   done
231   libgcc2_st_objs="$libgcc2_st_objs ${oname}${objext}"
232 done
233
234 # SHLIB_MKMAP
235 # SHLIB_MKMAP_OPTS
236 # SHLIB_MAPFILES
237 for ml in $MULTILIBS; do
238   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
239   flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
240
241   libgcc_objs=""
242   libgcc_eh_objs=""
243   for o in $libgcc1_objs; do
244     libgcc_objs="$libgcc_objs libgcc/${dir}/$o"
245   done
246   for o in $libgcc2_objs; do
247     libgcc_objs="$libgcc_objs libgcc/${dir}/$o"
248   done
249   for o in $libgcc2_eh_objs; do
250     libgcc_eh_objs="$libgcc_eh_objs libgcc/${dir}/$o"
251   done
252   libgcc_sh_objs="$libgcc_objs $libgcc_eh_objs"
253   shlib_deps="$libgcc_sh_objs"
254
255   libgcc_st_objs=""
256   for o in $libgcc2_st_objs; do
257     libgcc_st_objs="$libgcc_st_objs libgcc/${dir}/$o"
258   done
259
260   if [ "$SHLIB_LINK" -a "$SHLIB_MKMAP" -a -z "$mapfile" ]; then
261     mapfile="libgcc.map"
262     echo ""
263     echo "${mapfile}: $SHLIB_MKMAP $SHLIB_MAPFILES $libgcc_sh_objs"
264     echo '      { $(NM_FOR_TARGET)'" $SHLIB_NM_FLAGS $libgcc_sh_objs; echo %%; cat $SHLIB_MAPFILES; } | "'$(AWK)'" -f $SHLIB_MKMAP $SHLIB_MKMAP_OPTS > "'tmp-$@'
265     echo '      mv tmp-$@ $@'
266   fi
267   shlib_deps="$shlib_deps $mapfile"
268
269   # Depend on EXTRA_MULTILIB_PARTS, since that's where crtbegin/end
270   # usually are put in a true multilib situation.
271   for f in $EXTRA_MULTILIB_PARTS; do
272     shlib_deps="$shlib_deps $dir/$f"
273   done
274
275   libgcc_a_objs="$libgcc_objs $libgcc_st_objs"
276
277   if [ "@libgcc_visibility@" = yes -a "$SHLIB_LINK" ]; then
278     libgcc_a_objs=
279     echo ""
280     for o in $libgcc_objs $libgcc_st_objs; do
281       # .oS objects will have all non-local symbol definitions .hidden
282       oS=`echo ${o} | sed s~${objext}'$~.oS~g'`
283       echo "${oS}: stmp-dirs ${o}"
284       echo '    @$(NM_FOR_TARGET) '${SHLIB_NM_FLAGS} ${o}' | $(AWK) '\''NF == 3 { print "\t.hidden", $$3 }'\'' | $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) '${flags}' -r -nostdinc -nostdlib -o $@ '${o}' -xassembler -'
285       libgcc_a_objs="${libgcc_a_objs} ${oS}"
286     done
287   fi
288
289   echo ""
290   echo "${dir}/libgcc.a: $libgcc_a_objs"
291   echo "        -rm -rf ${dir}/libgcc.a"
292   echo '        $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a $libgcc_a_objs
293   echo '        if $(RANLIB_TEST_FOR_TARGET) ; then' \\
294   echo '          $(RANLIB_FOR_TARGET)' ${dir}/libgcc.a ';' \\
295   echo '        else true; fi;'
296
297   if [ "$SHLIB_LINK" ]; then
298
299     echo ""
300     echo "${dir}/libgcc_eh.a: $libgcc_eh_objs"
301     echo "      -rm -rf ${dir}/libgcc_eh.a"
302     echo '      $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc_eh.a $libgcc_eh_objs
303     echo '      if $(RANLIB_TEST_FOR_TARGET) ; then' \\
304     echo '        $(RANLIB_FOR_TARGET)' ${dir}/libgcc_eh.a ';' \\
305     echo '      else true; fi;'
306
307     if [ -z "$SHLIB_MULTILIB" ]; then
308       if [ "$dir" = "." ]; then
309         shlib_base_name="libgcc_s";
310       else
311         shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
312       fi
313       echo ""
314       echo "${dir}/${shlib_base_name}${SHLIB_EXT}: $shlib_deps"
315       echo "    $SHLIB_LINK" \
316          | sed -e "s%@multilib_flags@%$flags%g" \
317                -e "s%@multilib_dir@%$dir%g" \
318                -e "s%@shlib_objs@%$libgcc_sh_objs%g" \
319                -e "s%@shlib_base_name@%$shlib_base_name%g" \
320                -e "s%@shlib_map_file@%$mapfile%g"
321     elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
322       shlib_base_name="libgcc_s";
323       echo ""
324       echo "${shlib_base_name}${SHLIB_EXT}: $shlib_deps"
325       echo "    $SHLIB_LINK" \
326          | sed -e "s%@multilib_flags@%$flags%g" \
327                -e "s%@multilib_dir@%$dir%g" \
328                -e "s%@shlib_objs@%$libgcc_sh_objs%g" \
329                -e "s%@shlib_base_name@%$shlib_base_name%g" \
330                -e "s%@shlib_map_file@%$mapfile%g"
331     fi
332   fi
333 done
334
335 dirs=libgcc
336 for ml in $MULTILIBS; do
337   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
338   if [ $dir != . ]; then
339     dirs="$dirs libgcc/${dir}"
340   fi
341 done
342 echo ''
343 echo 'libgcc-stage-start:'
344 echo '  for dir in '"${dirs}"'; do \'
345 echo '    if [ -d $(stage)/$$dir ]; then true; else mkdir $(stage)/$$dir; fi; \'
346 echo '  done'
347 echo '  -for dir in '"${dirs}"'; do \'
348 echo '    mv $$dir/*'"${objext}"' $(stage)/$$dir; \'
349 echo '  done'
350
351 echo ""
352 all=stmp-dirs
353 dirs=libgcc
354
355 for ml in $MULTILIBS; do
356   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
357   if [ $dir != . ]; then
358     dirs="$dirs ${dir} libgcc/${dir}"
359   fi
360   all="$all ${dir}/libgcc.a"
361   if [ "$SHLIB_LINK" ]; then
362     all="$all ${dir}/libgcc_eh.a"
363     if [ -z "$SHLIB_MULTILIB" ]; then
364       if [ "$dir" = "." ]; then
365         suff="";
366       else
367         suff=_`echo $dir | sed s,/,_,g`
368       fi
369       all="$all ${dir}/libgcc_s${suff}${SHLIB_EXT}"
370     elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
371       all="$all libgcc_s${SHLIB_EXT}"
372     fi
373   fi
374 done
375
376 echo 'stmp-dirs: force'
377 echo '  for d in '"$dirs"'; do \'
378 echo '    if [ -d $$d ]; then true; else '$mkinstalldirs' $$d; fi; \'
379 echo '  done'
380 echo '  if [ -f stmp-dirs ]; then true; else touch stmp-dirs; fi'
381
382 for f in $EXTRA_MULTILIB_PARTS; do
383   for ml in $MULTILIBS; do
384     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
385     flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
386     case $dir in
387     .) out=$f ; t= ;;
388     *) out=$dir/$f ; t=$dir/ ;;
389     esac
390     case $out in
391     # Prevent `make' from interpreting $out as a macro assignment
392     *'$(EQ)'*) targ="T_TARGET=$out T_TARGET" ;;
393     *) targ=$out ;;
394     esac
395
396     echo $out: stmp-dirs
397     echo "      $make_compile" \\
398     echo '        LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
399     echo '        MULTILIB_CFLAGS="'$flags'"' T=$t $targ
400
401     all="$all $out"
402   done
403 done
404
405 echo ""
406 echo "all: $all"
407
408 echo ""
409 echo "install: $all"
410 for ml in $MULTILIBS; do
411   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
412   if [ $dir != . ]; then
413     ldir='$(libsubdir)'/$dir
414     echo "      if [ -d $ldir ]; then true; else mkdir $ldir; chmod a+rx $ldir; fi;"
415   else
416     ldir='$(libsubdir)'
417   fi
418   echo '        $(INSTALL_DATA)' ${dir}/libgcc.a ${ldir}/
419   echo '        $(RANLIB_FOR_TARGET)' ${ldir}/libgcc.a
420
421   if [ "$SHLIB_LINK" ]; then
422     echo '      $(INSTALL_DATA)' ${dir}/libgcc_eh.a ${ldir}/
423     echo '      $(RANLIB_FOR_TARGET)' ${ldir}/libgcc_eh.a
424
425     if [ -z "$SHLIB_MULTILIB" ]; then
426       if [ "$dir" = "." ]; then
427         shlib_base_name="libgcc_s";
428       else
429         shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
430       fi
431       echo "    $SHLIB_INSTALL" \
432         | sed -e "s%@shlib_base_name@%$shlib_base_name%g"
433     elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
434       shlib_base_name="libgcc_s";
435       echo "    $SHLIB_INSTALL" \
436         | sed -e "s%@shlib_base_name@%$shlib_base_name%g"
437     fi
438   fi
439 done
440 for f in $EXTRA_MULTILIB_PARTS; do
441   for ml in $MULTILIBS; do
442     dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
443     if [ $dir != . ]; then
444       out=${dir}/$f
445       ldir='$(libsubdir)'/$dir
446     else
447       out=$f
448       ldir='$(libsubdir)'
449     fi
450     echo '      $(INSTALL_DATA)' $out $ldir/
451   done
452 done