2 # Construct makefile for libgcc.
3 # Copyright (C) 2000 Free Software Foundation, Inc.
5 # This file is part of GNU CC.
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 # 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.
46 if [ "@build_canonical@" = "@target@" ]; then
53 if $OLDCC -E $tmp |
grep yes > /dev
/null
2>&1; then
59 # Disable SHLIB_LINK if shared libgcc not enabled.
60 if [ "@enable_shared@" = "no" ]; then
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)"'
78 # Dependancies for libgcc1.c
79 libgcc1_c_dep
='stmp-dirs $(srcdir)/libgcc1.c $(CONFIG_H)'
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'
84 # Dependancies for fp-bit.c
85 fpbit_c_dep
='stmp-dirs config.status tsystem.h'
88 # Build libgcc1 components.
98 echo "You must find a way to make libgcc1 components yourself" 1>&2
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}"
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
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' / /' \
118 libgcc1_objs
="$libgcc1_objs ${name}${objext}"
123 for name
in $LIB1FUNCS; do
124 out
="libgcc/${name}${objext}"
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
130 echo " $oldcc_compile" -DL$name $flags -c '$(srcdir)/libgcc1.c'
131 echo " mv libgcc1${objext} $out"
134 libgcc1_objs
="$libgcc1_objs ${name}${objext}"
137 for file in $LIB1FUNCS_EXTRA; do
138 name
=`echo $file | sed -e 's/[.][cS]$//' -e 's/[.]asm$//'`
139 out
="libgcc/${name}${objext}"
142 if [ ${name}.asm
= $file ]; then
143 echo " cp $file ${name}.s"
147 if [ -z "@NO_MINUS_C_MINUS_O@" ]; then
148 echo " $oldcc_compile" -c $file -o $out
150 echo " $oldcc_compile" -c $file
151 tmp
=`echo $file | sed -e 's/[.][cs]$/'${objext}/ -e 's,.*/,,'`
155 libgcc1_objs
="$libgcc1_objs ${name}${objext}"
159 echo "I'm confused about libgcc1." 1>&2
165 # Build libgcc2 components.
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}"
176 echo $out: $libgcc2_c_dep
177 echo " $gcc_compile" '$(MAYBE_USE_COLLECT2)' $flags -DL$name \
178 -c '$(srcdir)/libgcc2.c' -o $out
180 libgcc2_objs
="$libgcc2_objs ${name}${objext}"
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}"
189 echo $out: $libgcc2_c_dep
190 echo " $gcc_compile" '$(MAYBE_USE_COLLECT2)' -fexceptions \
191 $flags -DL$name -c '$(srcdir)/libgcc2.c' -o $out
193 libgcc2_objs
="$libgcc2_objs ${name}${objext}"
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}"
203 echo $out: $FPBIT $fpbit_c_dep
204 echo " $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
207 libgcc2_objs
="$libgcc2_objs ${name}${objext}"
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}"
218 echo $out: $DPBIT $fpbit_c_dep
219 echo " $gcc_compile" -DFINE_GRAINED_LIBRARIES $flags -DL$name \
222 libgcc2_objs
="$libgcc2_objs ${name}${objext}"
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,.*/,,'`
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"
238 echo $out: stmp-dirs
$file
239 echo " $gcc_compile" $flags -c $file -o $out
241 libgcc2_objs
="$libgcc2_objs ${oname}${objext}"
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'`;
251 for o
in $libgcc1_objs; do
252 if [ "$LIBGCC1" = libgcc1-asm.a
]; then
253 libgcc_objs
="$libgcc_objs libgcc/${dir}/$o"
255 libgcc_objs
="$libgcc_objs libgcc/$o"
258 for o
in $libgcc2_objs; do
259 libgcc_objs
="$libgcc_objs libgcc/${dir}/$o"
261 shlib_deps
="$libgcc_objs"
263 if [ "$SHLIB_LINK" -a "$SHLIB_MKMAP" -a -z "$mapfile" ]; then
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-$@'
270 shlib_deps
="$shlib_deps $mapfile"
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"
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;'
286 if [ "$SHLIB_LINK" ]; then
287 if [ -z "$SHLIB_MULTILIB" ]; then
288 if [ "$dir" = "." ]; then
289 shlib_base_name
="libgcc_s";
291 shlib_base_name
=libgcc_s_
`echo $dir | sed s,/,_,g`
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";
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"
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}"
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; \'
327 echo ' -for dir in '"${dirs}"'; do \'
328 echo ' mv $
$dir/*'"${objext}"' $
(stage
)/$
$dir; \'
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}"
340 all
="$all ${dir}/libgcc.a"
341 if [ "$SHLIB_LINK" ]; then
342 if [ -z "$SHLIB_MULTILIB" ]; then
343 if [ "$dir" = "." ]; then
346 suff
=_
`echo $dir | sed s,/,_,g`
348 all
="$all ${dir}/libgcc_s${suff}${SHLIB_EXT}"
349 elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
350 all
="$all libgcc_s${SHLIB_EXT}"
355 echo 'stmp-dirs: force'
356 echo ' for d in '"$dirs"'; do \'
357 echo ' if [ -d $
$d ]; then true
; else mkdir $
$d; fi \'
359 echo ' if [ -f stmp-dirs ]; then true; else touch stmp-dirs; fi'
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'`;
367 *) out
=$dir/$f ; t
=$dir/ ;;
370 # Prevent `make' from interpreting $out as a macro assignment
371 *'$(EQ)'*) targ
="T_TARGET=$out T_TARGET" ;;
376 echo " $make_compile" \\
377 echo ' LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
378 echo ' MULTILIB_CFLAGS="'$flags'"' T
=$t $targ
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;"
397 echo ' $(INSTALL_DATA)' ${dir}/libgcc.a
${ldir}/
398 echo ' $(RANLIB_FOR_TARGET)' ${ldir}/libgcc.a
400 if [ "$SHLIB_LINK" ]; then
401 if [ -z "$SHLIB_MULTILIB" ]; then
402 if [ "$dir" = "." ]; then
403 shlib_base_name
="libgcc_s";
405 shlib_base_name
=libgcc_s_
`echo $dir | sed s,/,_,g`
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"
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
421 ldir
='$(libsubdir)'/$dir
426 echo ' $(INSTALL_DATA)' $out $ldir/