* Makefile.in (SYSTEM_H): Define.
[official-gcc.git] / gcc / mklibgcc.in
blob6341b302b830982457555da4e0ec9c8158cc623f
1 #!/bin/sh
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.
10 # objext
11 # OLDCC
12 # LIBGCC1
13 # LIB1FUNCS
14 # LIB1ASMFUNCS
15 # LIB1FUNCS_EXTRA
16 # LIB2FUNCS
17 # LIB2FUNCS_EH
18 # LIB2ADD
19 # FPBIT
20 # FPBIT_FUNCS
21 # DPBIT
22 # DPBIT_FUNCS
23 # LIBGCC
24 # MULTILIBS
25 # EXTRA_MULTILIB_PARTS
26 # SHLIB_EXT
27 # SHLIB_LINK
28 # SHLIB_MULTILIB
29 # SHLIB_MKMAP
30 # SHLIB_MAPFILES
31 # SHLIB_NM_FLAGS
32 # SHLIB_INSTALL
34 # Make needs VPATH to be literal.
35 echo 'srcdir = @srcdir@'
36 echo 'VPATH = @srcdir@'
37 echo 'EQ = ='
38 echo
39 echo 'force:'
40 echo
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
47 tmp="tmp-$$.c"
48 cat > $tmp <<EOF
49 #ifdef __GNUC__
50 yes;
51 #endif
52 EOF
53 if $OLDCC -E $tmp | grep yes > /dev/null 2>&1; then
54 LIB1FUNCS=""
56 rm -f $tmp
59 # Disable SHLIB_LINK if shared libgcc not enabled.
60 if [ "@enable_shared@" = "no" ]; then
61 SHLIB_LINK=""
64 # Build lines.
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.
91 libgcc1_objs=""
93 case X"$LIBGCC1" in
94 Xlibgcc1.null | X)
97 Xlibgcc1.cross)
98 echo "You must find a way to make libgcc1 components yourself" 1>&2
101 Xlibgcc1-asm.a)
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' / /' \
116 -e 's/ '$name'$//'`
117 done
118 libgcc1_objs="$libgcc1_objs ${name}${objext}"
119 done
122 Xlibgcc1.a)
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
129 else
130 echo " $oldcc_compile" -DL$name $flags -c '$(srcdir)/libgcc1.c'
131 echo " mv libgcc1${objext} $out"
134 libgcc1_objs="$libgcc1_objs ${name}${objext}"
135 done
137 for file in $LIB1FUNCS_EXTRA; do
138 name=`echo $file | sed -e 's/[.][cS]$//' -e 's/[.]asm$//'`
139 out="libgcc/${name}${objext}"
141 echo $out: $file
142 if [ ${name}.asm = $file ]; then
143 echo " cp $file ${name}.s"
144 file=${name}.s
147 if [ -z "@NO_MINUS_C_MINUS_O@" ]; then
148 echo " $oldcc_compile" -c $file -o $out
149 else
150 echo " $oldcc_compile" -c $file
151 tmp=`echo $file | sed -e 's/[.][cs]$/'${objext}/ -e 's,.*/,,'`
152 echo " mv $tmp $out"
155 libgcc1_objs="$libgcc1_objs ${name}${objext}"
156 done
159 echo "I'm confused about libgcc1." 1>&2
160 exit 1
162 esac
165 # Build libgcc2 components.
168 libgcc2_objs=""
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
179 done
180 libgcc2_objs="$libgcc2_objs ${name}${objext}"
181 done
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
192 done
193 libgcc2_objs="$libgcc2_objs ${name}${objext}"
194 done
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 \
205 -c $FPBIT -o $out
206 done
207 libgcc2_objs="$libgcc2_objs ${name}${objext}"
208 done
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 \
220 -c $DPBIT -o $out
221 done
222 libgcc2_objs="$libgcc2_objs ${name}${objext}"
223 done
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
240 done
241 libgcc2_objs="$libgcc2_objs ${oname}${objext}"
242 done
244 # SHLIB_MKMAP
245 # SHLIB_MAPFILES
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'`;
250 libgcc_objs=""
251 for o in $libgcc1_objs; do
252 if [ "$LIBGCC1" = libgcc1-asm.a ]; then
253 libgcc_objs="$libgcc_objs libgcc/${dir}/$o"
254 else
255 libgcc_objs="$libgcc_objs libgcc/$o"
257 done
258 for o in $libgcc2_objs; do
259 libgcc_objs="$libgcc_objs libgcc/${dir}/$o"
260 done
261 shlib_deps="$libgcc_objs"
263 if [ "$SHLIB_LINK" -a "$SHLIB_MKMAP" -a -z "$mapfile" ]; then
264 mapfile="libgcc.map"
265 echo ""
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-$@'
268 echo ' mv 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"
276 done
278 echo ""
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";
290 else
291 shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
293 echo ""
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";
303 echo ""
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"
313 done
315 dirs=libgcc
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}"
321 done
322 echo ''
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; \'
326 echo ' done'
327 echo ' -for dir in '"${dirs}"'; do \'
328 echo ' mv $$dir/*'"${objext}"' $(stage)/$$dir; \'
329 echo ' done'
331 echo ""
332 all=stmp-dirs
333 dirs=libgcc
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
344 suff="";
345 else
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}"
353 done
355 echo 'stmp-dirs: force'
356 echo ' for d in '"$dirs"'; do \'
357 echo ' if [ -d $$d ]; then true; else mkdir $$d; fi \'
358 echo ' done'
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'`;
365 case $dir in
366 .) out=$f ; t= ;;
367 *) out=$dir/$f ; t=$dir/ ;;
368 esac
369 case $out in
370 # Prevent `make' from interpreting $out as a macro assignment
371 *'$(EQ)'*) targ="T_TARGET=$out T_TARGET" ;;
372 *) targ=$out ;;
373 esac
375 echo $out: stmp-dirs
376 echo " $make_compile" \\
377 echo ' LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
378 echo ' MULTILIB_CFLAGS="'$flags'"' T=$t $targ
380 all="$all $out"
381 done
382 done
384 echo ""
385 echo "all: $all"
387 echo ""
388 echo "install: $all"
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;"
394 else
395 ldir='$(libsubdir)'
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";
404 else
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"
415 done
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
420 out=${dir}/$f
421 ldir='$(libsubdir)'/$dir
422 else
423 out=$f
424 ldir='$(libsubdir)'
426 echo ' $(INSTALL_DATA)' $out $ldir/
427 done
428 done