2 # Construct makefile for libgcc.
3 # Copyright (C) 2000 Free Software Foundation, Inc.
5 # This file is part of GCC.
7 # Arguments, taken from the environment, since there are a lot
8 # of them, and positional args becomes quite ugly.
25 # EXTRA_MULTILIB_PARTS
34 # Make needs VPATH to be literal.
35 echo 'srcdir = @srcdir@'
36 echo 'VPATH = @srcdir@'
42 # Disable SHLIB_LINK if shared libgcc not enabled.
43 if [ "@enable_shared@" = "no" ]; then
49 gcc_compile
='$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES)'
50 make_compile
='$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
51 AR_FOR_TARGET="$(AR_FOR_TARGET)" \
52 AR_CREATE_FOR_TARGET="$(AR_CREATE_FOR_TARGET)" \
53 AR_EXTRACT_FOR_TARGET="$(AR_EXTRACT_FOR_TARGET)" \
54 AR_FLAGS_FOR_TARGET="$(AR_FLAGS_FOR_TARGET)" \
55 CC="$(CC)" CFLAGS="$(CFLAGS)" \
56 HOST_PREFIX="$(HOST_PREFIX)" \
57 HOST_PREFIX_1="$(HOST_PREFIX_1)" \
58 LANGUAGES="$(LANGUAGES)"'
60 # Dependencies for libgcc2.c
61 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 # Dependencies for fp-bit.c
64 fpbit_c_dep
='stmp-dirs config.status tsystem.h'
67 # Build libgcc1 components.
72 for name
in $LIB1ASMFUNCS; do
73 for ml
in $MULTILIBS; do
74 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
75 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
76 out
="libgcc/${dir}/${name}${objext}"
78 echo ${out}: stmp-dirs
'$(srcdir)/config/$(LIB1ASMSRC)'
79 echo " $gcc_compile" $flags -DL$name -xassembler-with-cpp \
80 -c '$(srcdir)/config/$(LIB1ASMSRC)' -o $out
82 # Remove any objects from LIB2FUNCS and LIB2_DIVMOD_FUNCS that are
83 # defined as optimized assembly code in LIB1ASMFUNCS.
84 LIB2FUNCS
=`echo $LIB2FUNCS | sed -e 's/^'$name' //' \
87 LIB2_DIVMOD_FUNCS
=`echo $LIB2_DIVMOD_FUNCS | sed -e 's/^'$name' //' \
91 libgcc1_objs
="$libgcc1_objs ${name}${objext}"
95 # Build libgcc2 components.
101 for name
in $LIB2FUNCS; do
102 for ml
in $MULTILIBS; do
103 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
104 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
105 out
="libgcc/${dir}/${name}${objext}"
107 echo $out: $libgcc2_c_dep
108 echo " $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
109 -c '$(srcdir)/libgcc2.c' -o $out
111 libgcc2_objs
="$libgcc2_objs ${name}${objext}"
114 for name
in $LIB2FUNCS_ST; do
115 for ml
in $MULTILIBS; do
116 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
117 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
118 out
="libgcc/${dir}/${name}${objext}"
120 echo $out: $libgcc2_c_dep
121 echo " $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
122 -c '$(srcdir)/libgcc2.c' -o $out
124 libgcc2_st_objs
="$libgcc2_st_objs ${name}${objext}"
127 for name
in $LIB2_DIVMOD_FUNCS; do
128 for ml
in $MULTILIBS; do
129 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
130 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
131 out
="libgcc/${dir}/${name}${objext}"
133 echo $out: $libgcc2_c_dep
134 echo " $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
135 -c '$(srcdir)/libgcc2.c' -fexceptions -fnon-call-exceptions -o $out
137 libgcc2_objs
="$libgcc2_objs ${name}${objext}"
140 if [ "$FPBIT" ]; then
141 for name
in $FPBIT_FUNCS; do
142 for ml
in $MULTILIBS; do
143 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
144 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
145 out
="libgcc/${dir}/${name}${objext}"
147 echo $out: $FPBIT $fpbit_c_dep
148 echo " $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
151 libgcc2_objs
="$libgcc2_objs ${name}${objext}"
155 if [ "$DPBIT" ]; then
156 for name
in $DPBIT_FUNCS; do
157 for ml
in $MULTILIBS; do
158 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
159 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
160 out
="libgcc/${dir}/${name}${objext}"
162 echo $out: $DPBIT $fpbit_c_dep
163 echo " $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
166 libgcc2_objs
="$libgcc2_objs ${name}${objext}"
170 for file in $LIB2ADD; do
171 name
=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
172 oname
=`echo $name | sed -e 's,.*/,,'`
174 for ml
in $MULTILIBS; do
175 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
176 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
177 out
="libgcc/${dir}/${oname}${objext}"
178 if [ ${name}.asm
= ${file} ]; then
179 flags
="$flags -xassembler-with-cpp"
182 echo $out: stmp-dirs
$file
183 echo " $gcc_compile" $flags -c $file -o $out
185 libgcc2_objs
="$libgcc2_objs ${oname}${objext}"
188 for file in $LIB2ADDEH; do
189 name
=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
190 oname
=`echo $name | sed -e 's,.*/,,'`
192 for ml
in $MULTILIBS; do
193 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
194 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
195 out
="libgcc/${dir}/${oname}${objext}"
196 if [ ${name}.asm
= ${file} ]; then
197 flags
="$flags -xassembler-with-cpp"
200 echo $out: stmp-dirs
$file
201 echo " $gcc_compile" $flags -fexceptions -c $file -o $out
203 libgcc2_objs
="$libgcc2_objs ${oname}${objext}"
206 for file in $LIB2ADD_ST; do
207 name
=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
208 oname
=`echo $name | sed -e 's,.*/,,'`
210 for ml
in $MULTILIBS; do
211 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
212 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
213 out
="libgcc/${dir}/${oname}${objext}"
214 if [ ${name}.asm
= ${file} ]; then
215 flags
="$flags -xassembler-with-cpp"
218 echo $out: stmp-dirs
$file
219 echo " $gcc_compile" $flags -c $file -o $out
221 libgcc2_st_objs
="$libgcc2_st_objs ${oname}${objext}"
226 for ml
in $MULTILIBS; do
227 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
228 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
231 for o
in $libgcc1_objs; do
232 libgcc_objs
="$libgcc_objs libgcc/${dir}/$o"
234 for o
in $libgcc2_objs; do
235 libgcc_objs
="$libgcc_objs libgcc/${dir}/$o"
237 shlib_deps
="$libgcc_objs"
240 for o
in $libgcc2_st_objs; do
241 libgcc_st_objs
="$libgcc_st_objs libgcc/${dir}/$o"
244 if [ "$SHLIB_LINK" -a "$SHLIB_MKMAP" -a -z "$mapfile" ]; then
247 echo "${mapfile}: $SHLIB_MKMAP $SHLIB_MAPFILES $libgcc_objs"
248 echo ' { $(NM_FOR_TARGET)'" $SHLIB_NM_FLAGS $libgcc_objs; echo %%; cat $SHLIB_MAPFILES; } | "'$(AWK)'" -f $SHLIB_MKMAP > "'tmp-$@'
251 shlib_deps
="$shlib_deps $mapfile"
253 # Depend on EXTRA_MULTILIB_PARTS, since that's where crtbegin/end
254 # usually are put in a true multilib situation.
255 for f
in $EXTRA_MULTILIB_PARTS; do
256 shlib_deps
="$shlib_deps $dir/$f"
260 echo "${dir}/libgcc.a: $libgcc_objs $libgcc_st_objs"
261 echo " -rm -rf ${dir}/libgcc.a"
262 echo ' $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a
$libgcc_objs $libgcc_st_objs
263 echo ' if $(RANLIB_TEST_FOR_TARGET) ; then' \\
264 echo ' $(RANLIB_FOR_TARGET)' ${dir}/libgcc.a
';' \\
265 echo ' else true; fi;'
267 if [ "$SHLIB_LINK" ]; then
268 if [ -z "$SHLIB_MULTILIB" ]; then
269 if [ "$dir" = "." ]; then
270 shlib_base_name
="libgcc_s";
272 shlib_base_name
=libgcc_s_
`echo $dir | sed s,/,_,g`
275 echo "${dir}/${shlib_base_name}${SHLIB_EXT}: $shlib_deps"
276 echo " $SHLIB_LINK" \
277 |
sed -e "s%@multilib_flags@%$flags%g" \
278 -e "s%@multilib_dir@%$dir%g" \
279 -e "s%@shlib_objs@%$libgcc_objs%g" \
280 -e "s%@shlib_base_name@%$shlib_base_name%g" \
281 -e "s%@shlib_map_file@%$mapfile%g"
282 elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
283 shlib_base_name
="libgcc_s";
285 echo "${shlib_base_name}${SHLIB_EXT}: $shlib_deps"
286 echo " $SHLIB_LINK" \
287 |
sed -e "s%@multilib_flags@%$flags%g" \
288 -e "s%@multilib_dir@%$dir%g" \
289 -e "s%@shlib_objs@%$libgcc_objs%g" \
290 -e "s%@shlib_base_name@%$shlib_base_name%g" \
291 -e "s%@shlib_map_file@%$mapfile%g"
297 for ml
in $MULTILIBS; do
298 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
299 if [ $dir != .
]; then
300 dirs="$dirs libgcc/${dir}"
304 echo 'libgcc-stage-start:'
305 echo ' for dir in '"${dirs}"'; do \'
306 echo ' if [ -d $
(stage
)/$
$dir ]; then true
; else mkdir $
(stage
)/$
$dir; fi; \'
308 echo ' -for dir in '"${dirs}"'; do \'
309 echo ' mv $
$dir/*'"${objext}"' $
(stage
)/$
$dir; \'
316 for ml
in $MULTILIBS; do
317 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
318 if [ $dir != .
]; then
319 dirs="$dirs ${dir} libgcc/${dir}"
321 all
="$all ${dir}/libgcc.a"
322 if [ "$SHLIB_LINK" ]; then
323 if [ -z "$SHLIB_MULTILIB" ]; then
324 if [ "$dir" = "." ]; then
327 suff
=_
`echo $dir | sed s,/,_,g`
329 all
="$all ${dir}/libgcc_s${suff}${SHLIB_EXT}"
330 elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
331 all
="$all libgcc_s${SHLIB_EXT}"
336 echo 'stmp-dirs: force'
337 echo ' for d in '"$dirs"'; do \'
338 echo ' if [ -d $
$d ]; then true
; else '$mkinstalldirs' $
$d; fi \'
340 echo ' if [ -f stmp-dirs ]; then true; else touch stmp-dirs; fi'
342 for f
in $EXTRA_MULTILIB_PARTS; do
343 for ml
in $MULTILIBS; do
344 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
345 flags
=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
348 *) out
=$dir/$f ; t
=$dir/ ;;
351 # Prevent `make' from interpreting $out as a macro assignment
352 *'$(EQ)'*) targ
="T_TARGET=$out T_TARGET" ;;
357 echo " $make_compile" \\
358 echo ' LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
359 echo ' MULTILIB_CFLAGS="'$flags'"' T
=$t $targ
370 for ml
in $MULTILIBS; do
371 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
372 if [ $dir != .
]; then
373 ldir
='$(libsubdir)'/$dir
374 echo " if [ -d $ldir ]; then true; else mkdir $ldir; chmod a+rx $ldir; fi;"
378 echo ' $(INSTALL_DATA)' ${dir}/libgcc.a
${ldir}/
379 echo ' $(RANLIB_FOR_TARGET)' ${ldir}/libgcc.a
381 if [ "$SHLIB_LINK" ]; then
382 if [ -z "$SHLIB_MULTILIB" ]; then
383 if [ "$dir" = "." ]; then
384 shlib_base_name
="libgcc_s";
386 shlib_base_name
=libgcc_s_
`echo $dir | sed s,/,_,g`
388 echo " $SHLIB_INSTALL" \
389 |
sed -e "s%@shlib_base_name@%$shlib_base_name%g"
390 elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
391 shlib_base_name
="libgcc_s";
392 echo " $SHLIB_INSTALL" \
393 |
sed -e "s%@shlib_base_name@%$shlib_base_name%g"
397 for f
in $EXTRA_MULTILIB_PARTS; do
398 for ml
in $MULTILIBS; do
399 dir
=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
400 if [ $dir != .
]; then
402 ldir
='$(libsubdir)'/$dir
407 echo ' $(INSTALL_DATA)' $out $ldir/