mklibgcc.in revision 90075
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.
36echo 'srcdir = @srcdir@'
37echo 'VPATH = @srcdir@'
38echo 'EQ = ='
39echo
40echo 'force:'
41echo
42
43# Disable SHLIB_LINK if shared libgcc not enabled.
44if [ "@enable_shared@" = "no" ]; then
45  SHLIB_LINK=""
46fi
47
48# Build lines.
49
50gcc_compile='$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES)'
51make_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
62libgcc2_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
65fpbit_c_dep='stmp-dirs config.status tsystem.h'
66
67#
68# Build libgcc1 components.
69#
70
71libgcc1_objs=""
72
73for 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}"
96done
97
98#
99# Build libgcc2 components.
100#
101
102libgcc2_objs=""
103libgcc2_st_objs=""
104libgcc2_eh_objs=""
105
106for 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}"
117done
118
119for 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}"
130done
131
132for 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}"
143done
144
145if [ "$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
158fi
159
160if [ "$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
173fi
174
175for 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}"
191done
192
193for 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
213done
214
215for 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}"
231done
232
233# SHLIB_MKMAP
234# SHLIB_MAPFILES
235for 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  echo ""
274  echo "${dir}/libgcc.a: $libgcc_objs $libgcc_st_objs"
275  echo "	-rm -rf ${dir}/libgcc.a"
276  echo '	$(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a $libgcc_objs $libgcc_st_objs
277  echo '	if $(RANLIB_TEST_FOR_TARGET) ; then' \\
278  echo '	  $(RANLIB_FOR_TARGET)' ${dir}/libgcc.a ';' \\
279  echo '	else true; fi;'
280
281  if [ "$SHLIB_LINK" ]; then
282
283    echo ""
284    echo "${dir}/libgcc_eh.a: $libgcc_eh_objs"
285    echo "	-rm -rf ${dir}/libgcc_eh.a"
286    echo '	$(AR_CREATE_FOR_TARGET)' ${dir}/libgcc_eh.a $libgcc_eh_objs
287    echo '	if $(RANLIB_TEST_FOR_TARGET) ; then' \\
288    echo '	  $(RANLIB_FOR_TARGET)' ${dir}/libgcc_eh.a ';' \\
289    echo '	else true; fi;'
290
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}${SHLIB_EXT}: $shlib_deps"
299      echo "	$SHLIB_LINK" \
300	 | sed -e "s%@multilib_flags@%$flags%g" \
301	       -e "s%@multilib_dir@%$dir%g" \
302	       -e "s%@shlib_objs@%$libgcc_sh_objs%g" \
303	       -e "s%@shlib_base_name@%$shlib_base_name%g" \
304	       -e "s%@shlib_map_file@%$mapfile%g"
305    elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
306      shlib_base_name="libgcc_s";
307      echo ""
308      echo "${shlib_base_name}${SHLIB_EXT}: $shlib_deps"
309      echo "	$SHLIB_LINK" \
310	 | sed -e "s%@multilib_flags@%$flags%g" \
311	       -e "s%@multilib_dir@%$dir%g" \
312	       -e "s%@shlib_objs@%$libgcc_sh_objs%g" \
313	       -e "s%@shlib_base_name@%$shlib_base_name%g" \
314	       -e "s%@shlib_map_file@%$mapfile%g"
315    fi
316  fi
317done
318
319dirs=libgcc
320for ml in $MULTILIBS; do
321  dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
322  if [ $dir != . ]; then
323    dirs="$dirs libgcc/${dir}"
324  fi
325done
326echo ''
327echo 'libgcc-stage-start:'
328echo '	for dir in '"${dirs}"'; do \'
329echo '	  if [ -d $(stage)/$$dir ]; then true; else mkdir $(stage)/$$dir; fi; \'
330echo '	done'
331echo '	-for dir in '"${dirs}"'; do \'
332echo '	  mv $$dir/*'"${objext}"' $(stage)/$$dir; \'
333echo '	done'
334
335echo ""
336all=stmp-dirs
337dirs=libgcc
338
339for ml in $MULTILIBS; do
340  dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
341  if [ $dir != . ]; then
342    dirs="$dirs ${dir} libgcc/${dir}"
343  fi
344  all="$all ${dir}/libgcc.a"
345  if [ "$SHLIB_LINK" ]; then
346    all="$all ${dir}/libgcc_eh.a"
347    if [ -z "$SHLIB_MULTILIB" ]; then
348      if [ "$dir" = "." ]; then
349	suff="";
350      else
351	suff=_`echo $dir | sed s,/,_,g`
352      fi
353      all="$all ${dir}/libgcc_s${suff}${SHLIB_EXT}"
354    elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
355      all="$all libgcc_s${SHLIB_EXT}"
356    fi
357  fi
358done
359
360echo 'stmp-dirs: force'
361echo '	for d in '"$dirs"'; do \'
362echo '	  if [ -d $$d ]; then true; else '$mkinstalldirs' $$d; fi; \'
363echo '	done'
364echo '	if [ -f stmp-dirs ]; then true; else touch stmp-dirs; fi'
365
366for f in $EXTRA_MULTILIB_PARTS; do
367  for ml in $MULTILIBS; do
368    dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
369    flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
370    case $dir in
371    .) out=$f ; t= ;;
372    *) out=$dir/$f ; t=$dir/ ;;
373    esac
374    case $out in
375    # Prevent `make' from interpreting $out as a macro assignment
376    *'$(EQ)'*) targ="T_TARGET=$out T_TARGET" ;;
377    *) targ=$out ;;
378    esac
379
380    echo $out: stmp-dirs
381    echo "	$make_compile" \\
382    echo '	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
383    echo '	  MULTILIB_CFLAGS="'$flags'"' T=$t $targ
384
385    all="$all $out"
386  done
387done
388
389echo ""
390echo "all: $all"
391
392echo ""
393echo "install: $all"
394for ml in $MULTILIBS; do
395  dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
396  if [ $dir != . ]; then
397    ldir='$(libsubdir)'/$dir
398    echo "	if [ -d $ldir ]; then true; else mkdir $ldir; chmod a+rx $ldir; fi;"
399  else
400    ldir='$(libsubdir)'
401  fi
402  echo '	$(INSTALL_DATA)' ${dir}/libgcc.a ${ldir}/
403  echo '	$(RANLIB_FOR_TARGET)' ${ldir}/libgcc.a
404
405  if [ "$SHLIB_LINK" ]; then
406    echo '	$(INSTALL_DATA)' ${dir}/libgcc_eh.a ${ldir}/
407    echo '	$(RANLIB_FOR_TARGET)' ${ldir}/libgcc_eh.a
408
409    if [ -z "$SHLIB_MULTILIB" ]; then
410      if [ "$dir" = "." ]; then
411	shlib_base_name="libgcc_s";
412      else
413	shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
414      fi
415      echo "	$SHLIB_INSTALL" \
416	| sed -e "s%@shlib_base_name@%$shlib_base_name%g"
417    elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
418      shlib_base_name="libgcc_s";
419      echo "	$SHLIB_INSTALL" \
420	| sed -e "s%@shlib_base_name@%$shlib_base_name%g"
421    fi
422  fi
423done
424for f in $EXTRA_MULTILIB_PARTS; do
425  for ml in $MULTILIBS; do
426    dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
427    if [ $dir != . ]; then
428      out=${dir}/$f
429      ldir='$(libsubdir)'/$dir
430    else
431      out=$f
432      ldir='$(libsubdir)'
433    fi
434    echo '	$(INSTALL_DATA)' $out $ldir/
435  done
436done
437