OSDN Git Service

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