source: scripts/scripts/target-scripts/target-gcc.sh @ 8546c13

clfs-1.2clfs-2.1clfs-3.0.0-systemdclfs-3.0.0-sysvinitsystemdsysvinit
Last change on this file since 8546c13 was 8546c13, checked in by Jim Gifford <clfs@…>, 18 years ago

r2474@server (orig r1231): ryan | 2006-03-06 23:56:36 -0800

r1233@rei: lfs | 2006-03-07 18:48:37 +1100
Update for gcc-4.1.0 release


  • Property mode set to 100755
File size: 14.9 KB
Line 
1#!/bin/bash
2
3# cross-lfs target gcc build
4# --------------------------
5# $LastChangedBy$
6# $LastChangedDate$
7# $LastChangedRevision$
8# $HeadURL$
9#
10
11cd ${SRC}
12
13LOG="gcc-target.log"
14
15set_libdirname
16setup_multiarch
17
18if [ "${USE_SYSROOT}" = "Y" ]; then
19   BUILD_PREFIX=/usr
20   INSTALL_PREFIX="${LFS}${BUILD_PREFIX}"
21   INSTALL_OPTIONS="DESTDIR=${LFS}"
22else
23   BUILD_PREFIX=${TGT_TOOLS}
24   INSTALL_PREFIX="${TGT_TOOLS}"
25   INSTALL_OPTIONS=""
26fi
27
28if [ ! "${libdirname}" = "lib" ]; then
29   extra_conf="${extra_conf} --libdir=${BUILD_PREFIX}/${libdirname}"
30fi
31
32if [ "Y" = "${MULTIARCH}" ]; then
33   vendor_os=`echo ${TARGET} | sed 's@\([^-]*\)-\(.*\)@\2@'`
34   case ${TGT_ARCH} in
35      x86_64 )
36         TARGET=x86_64-${vendor_os}
37      ;;
38      sparc64* )
39         TARGET=sparc64-${vendor_os}
40      ;;
41      sparc* )
42         TARGET=sparc64-${vendor_os}
43      ;;
44      powerpc* | ppc* )
45         TARGET=powerpc64-${vendor_os}
46      ;;
47      s390* )
48         TARGET=s390x-${vendor_os}
49      ;;
50      mips*el* )
51         TARGET=mips64el-${vendor_os}
52      ;;
53      * )
54         # TODO: add some error messages etc
55         barf
56      ;;
57   esac
58else
59   # If we are not bi-arch, disable multilib
60   extra_conf="${extra_conf} --enable-multilib=no"
61
62   # HACK: this sets abi to n32 with mips... this should be handled
63   # by the multiarch funcs somehow... and set according to DEFAULTENV
64   case ${TGT_ARCH} in
65      mips* )
66         extra_conf="${extra_conf} --with-abi=${DEFAULTENV}"
67      ;;
68   esac
69fi
70
71# if target has no floating point unit, use soft float
72if [ "${WITHOUT_FPU}" = "Y" ]; then
73   extra_conf="${extra_conf} --with-float=soft"
74fi
75
76unpack_tarball gcc-${GCC_VER}
77
78#3.0 20030427
79# Cannot trust ${GCC_VER} to supply us with the correct
80# gcc version (especially if cvs).
81# Grab it straight from version.c
82cd ${SRC}/${PKGDIR}
83target_gcc_ver=`grep version_string gcc/version.c | \
84                sed 's@.* = \(\|"\)\([0-9.]*\).*@\2@g'`
85# As of gcc4, the above doesn't cut it... check gcc/BASE-VER
86if [ -z "${target_gcc_ver}" -a -f gcc/BASE-VER ]; then
87   target_gcc_ver=`cat gcc/BASE-VER`
88fi
89
90# Apply linkonce patch for gcc (should be fixed come gcc 3.4.4)
91cd ${SRC}/${PKGDIR}
92case ${target_gcc_ver} in
93   3.4.3 ) apply_patch gcc-3.4.3-linkonce-1
94           apply_patch gcc-3.4.0-arm-bigendian
95           apply_patch gcc-3.4.0-arm-nolibfloat
96           apply_patch gcc-3.4.0-arm-lib1asm
97           apply_patch gcc-3.4.3-clean_exec_and_lib_search_paths_when_cross-1
98   ;;
99   4.0.0 ) apply_patch gcc-4.0.0-fix_tree_optimisation_PR21173
100           apply_patch gcc-4.0.0-reload_check_uninitialized_pseudos_PR20973
101           apply_patch gcc-4.0.0-clean_exec_and_lib_search_paths_when_cross-1
102   ;;
103   4.0.* ) apply_patch gcc-4.0.0-clean_exec_and_lib_search_paths_when_cross-1 ;;
104   4.1.* ) apply_patch gcc-4.0.0-clean_exec_and_lib_search_paths_when_cross-1 ;;
105esac
106
107# if we are using gcc-3.4x, set libexecdir to */${libdirname}
108case ${target_gcc_ver} in
109   3.4* | 4.* )
110      extra_conf="${extra_conf} --libexecdir=${BUILD_PREFIX}/${libdirname}"
111   ;;
112esac
113
114# HACK: should at least check if any of these are set first
115ARCH_CFLAGS="${TGT_CFLAGS} ${ARCH_CFLAGS}"
116
117# if target is same as build host, adjust build slightly to avoid running
118# configure checks which we cannot run
119if [ "${TARGET}" = "${BUILD}" ]; then
120   BUILD=`echo ${BUILD} | sed 's@\([_a-zA-Z0-9]*\)\(-[_a-zA-Z0-9]*\)\(.*\)@\1\2x\3@'`
121fi
122
123if [ ! "${USE_SYSROOT}" = "Y" ]; then
124   # LFS style build
125   #----------------
126
127   # source functions for required gcc modifications
128   . ${SCRIPTS}/funcs/cross_gcc-funcs.sh
129
130   # Alter the generated specs file to
131   #  o set dynamic linker to be under ${TGT_TOOLS}/lib{,32,64}
132   #  o set startfile_prefix_spec so we search for startfiles
133   #    under ${TGT_TOOLS}/lib/lib{,32,64}
134   gcc_specs_mod
135
136   # We need to stop cpp using /usr/include as the standard include directory.
137   # This is defined in gcc/cppdefault.c using STANDARD_INCLUDE_DIR
138   cpp_undef_standard_include_dir
139
140   # We need to override SYSTEM_HEADER_DIR so fixincludes only fixes
141   # headers under ${TGT_TOOLS}
142   fixincludes_set_native_system_header_dir
143fi
144
145# HACKS
146#-------
147# This here is a hack. mklibgcc runs the created xgcc for determining
148# the multilib dirs and multilib os dirs. Only problem here is we are
149# cross building a native compiler so we cannot actually run xgcc.
150# We get around this by substituting our cross-compiler here for xgcc,
151# by rights it should have the same specs and produce the expected results
152#
153# NOTE: with gcc-4.1 onwards we can just set GCC_FOR_TARGET to our cross-compiler
154#       and be done with the shenannigans
155
156extra_makeopts=""
157case ${target_gcc_ver} in
158   4.[1-9].* )
159      extra_makeopts="${extra_makeopts} GCC_FOR_TARGET=${HST_TOOLS}/bin/${TARGET}-gcc"
160   ;;
161   * )
162      cd ${SRC}/${PKGDIR}/gcc
163      test -f mklibgcc.in-ORIG ||
164         mv mklibgcc.in mklibgcc.in-ORIG
165
166      sed "s@\./xgcc@${HST_TOOLS}/bin/${TARGET}-gcc@g" \
167         mklibgcc.in-ORIG > mklibgcc.in
168
169      # A similar problem exists when setting MULTILIBS on the environment
170      # for the mklibgcc script for generation of libgcc.mk .
171      # Here we will force it to use our cross-compiler to produce the results
172      # of gcc --print-multi-lib
173      sed -i "/MULTILIBS/s@\$(GCC_FOR_TARGET)@${HST_TOOLS}/bin/${TARGET}-gcc@g" \
174         Makefile.in
175   ;;
176esac
177
178# When cross-building a target native compiler we run into big issues
179# when determining assembler and linker features required for tls support,
180# ( not to mention which nm, objdump et al to use ) during the configures
181# triggered by make.
182#
183# Gcc's configury does not take into account the fact that when cross
184# building the target native compiler we are _still_ actually cross-compiling.
185# As far as it is concerned during the final configure fragment host = target,
186# it doesn't check whether host = build.
187#
188# It then performs its checks for binutils components as if this was a standard
189# host native build.
190#
191# If a target native binutils was installed before attempting to build gcc
192# it will try to use the created ld, as etc under ${TGT_TOOLS}
193# This obviously will not work, they will not run on the host.
194#
195# If the target native binutils hasn't been built yet it will use the
196# as ld et al from the _build_ host.
197# This quite frankly sucks rocks.
198#
199# The following patch fixes this behaviour, enforcing usage of our
200# cross-tools for configure checks if host = target and host != build
201#
202# NOTE: 20050507 This doesn't appear to be necessary for gcc 4.x :-)
203#       This of course will have to be checked thoroughly...
204
205# TODO: Add patches for gcc-3.3 series as well
206cd ${SRC}/${PKGDIR}
207case ${target_gcc_ver} in
208   3.4* )
209      apply_patch gcc-3.4.1-fix_configure_for_target_native
210   ;;
211   4.* )
212      # Testing only... set AS_FOR_TARGET and LD_FOR_TARGET so these are used
213      # for feature checks... will have to check for unintended side effects
214      extra_makeopts="${extra_makeopts} AS_FOR_TARGET=${HST_TOOLS}/bin/${TARGET}-as"
215      extra_makeopts="${extra_makeopts} LD_FOR_TARGET=${HST_TOOLS}/bin/${TARGET}-ld"
216   ;;
217esac
218#
219# End HACKS
220
221test -d ${SRC}/gcc-${GCC_VER}-target &&
222   rm -rf ${SRC}/gcc-${GCC_VER}-target
223
224mkdir -p ${SRC}/gcc-${GCC_VER}-target &&
225cd ${SRC}/gcc-${GCC_VER}-target &&
226
227max_log_init Gcc ${GCC_VER} cross-pt2 ${CONFLOGS} ${LOG}
228#CONFIG_SHELL=/bin/bash \
229CFLAGS="-O2 -pipe" \
230CXXFLAGS="-O2 -pipe" \
231CC="${TARGET}-gcc ${ARCH_CFLAGS}" \
232../${PKGDIR}/configure --prefix=${BUILD_PREFIX} \
233   --build=${BUILD} --host=${TARGET} --target=${TARGET} \
234   --enable-languages=c,c++ --enable-__cxa_atexit \
235   --enable-c99 --enable-long-long --enable-threads=posix \
236   --disable-nls --enable-shared ${extra_conf} \
237   >> ${LOGFILE} 2>&1 &&
238echo " o Configure OK" || barf
239#   --enable-languages=c,c++,f77,objc,ada,java,pascal,treelang --enable-__cxa_atexit \
240#   --enable-version-specific-runtime-libs \
241
242min_log_init ${BUILDLOGS} &&
243make ${PMFLAGS} BOOT_LDFLAGS="-s" BOOT_CFLAGS="-O2 ${HOST_CFLAGS} -pipe" \
244   STAGE1_CFLAGS="-O2 ${HOST_CFLAGS} -pipe" ${extra_makeopts} all \
245   >> ${LOGFILE} 2>&1 &&
246echo " o Build OK" || barf
247
248min_log_init ${INSTLOGS} &&
249make ${INSTALL_OPTIONS} install \
250   >> ${LOGFILE} 2>&1 &&
251echo " o Install OK" || barf
252
253if [ ! "${USE_SYSROOT}" = "Y" ]; then
254   # Prep new root for target native glibc build
255   libdirs="${libdirname}"
256   if [ "Y" = "${MULTIARCH}" ]; then libdirs="lib lib32 lib64" ; fi
257   for dir in ${libdirs} ; do
258      if [ -d ${TGT_TOOLS}/${dir} ]; then
259         test -d ${LFS}/usr/${dir} || mkdir -p ${LFS}/usr/${dir}
260         ln -sf ../..${TGT_TOOLS}/${dir}/libgcc_s.so.1 \
261            ${LFS}/usr/${dir}/libgcc_s.so.1
262         test -f ${TGT_TOOLS}/${dir}/libgcc_s.so &&
263            ln -sf libgcc_s.so.1 ${LFS}/usr/${dir}/libgcc_s.so
264         test -f ${TGT_TOOLS}/${dir}/libgcc_s_32.so &&
265            ln -sf libgcc_s.so.1 ${LFS}/usr/${dir}/libgcc_s_32.so
266         test -f ${TGT_TOOLS}/${dir}/libgcc_s_64.so &&
267            ln -sf libgcc_s.so.1 ${LFS}/usr/${dir}/libgcc_s_64.so
268      fi
269   done
270fi
271
272test -L ${INSTALL_PREFIX}/bin/cc || ln -s gcc ${INSTALL_PREFIX}/bin/cc
273
274esac
275
276# if we are using gcc-3.4x, set libexecdir to */${libdirname}
277case ${target_gcc_ver} in
278   3.4* | 4.* )
279      extra_conf="${extra_conf} --libexecdir=${BUILD_PREFIX}/${libdirname}"
280   ;;
281esac
282
283# HACK: should at least check if any of these are set first
284ARCH_CFLAGS="${TGT_CFLAGS} ${ARCH_CFLAGS}"
285
286# if target is same as build host, adjust build slightly to avoid running
287# configure checks which we cannot run
288if [ "${TARGET}" = "${BUILD}" ]; then
289   BUILD=`echo ${BUILD} | sed 's@\([_a-zA-Z0-9]*\)\(-[_a-zA-Z0-9]*\)\(.*\)@\1\2x\3@'`
290fi
291
292if [ ! "${USE_SYSROOT}" = "Y" ]; then
293   # LFS style build
294   #----------------
295
296   # source functions for required gcc modifications
297   . ${SCRIPTS}/funcs/cross_gcc-funcs.sh
298
299   # Alter the generated specs file to
300   #  o set dynamic linker to be under ${TGT_TOOLS}/lib{,32,64}
301   #  o set startfile_prefix_spec so we search for startfiles
302   #    under ${TGT_TOOLS}/lib/lib{,32,64}
303   gcc_specs_mod
304
305   # We need to stop cpp using /usr/include as the standard include directory.
306   # This is defined in gcc/cppdefault.c using STANDARD_INCLUDE_DIR
307   cpp_undef_standard_include_dir
308
309   # We need to override SYSTEM_HEADER_DIR so fixincludes only fixes
310   # headers under ${TGT_TOOLS}
311   fixincludes_set_native_system_header_dir
312fi
313
314# HACKS
315#-------
316
317# This here is a hack. mklibgcc runs the created xgcc for determining
318# the multilib dirs and multilib os dirs. Only problem here is we are
319# cross building a native compiler so we cannot actually run xgcc.
320# We get around this by substituting our cross-compiler here for xgcc,
321# by rights it should have the same specs and produce the expected results
322#
323# NOTE: with gcc-4.1 onwards we can just set GCC_FOR_TARGET to our cross-compiler
324#       and be done with the shenannigans
325
326extra_makeopts=""
327case ${target_gcc_ver} in
328   4.[1-9].* )
329      extra_makeopts="${extra_makeopts} GCC_FOR_TARGET=${HST_TOOLS}/bin/${TARGET}-gcc"
330   ;;
331   * )
332      cd ${SRC}/${PKGDIR}/gcc
333      test -f mklibgcc.in-ORIG ||
334         mv mklibgcc.in mklibgcc.in-ORIG
335
336      sed "s@\./xgcc@${HST_TOOLS}/bin/${TARGET}-gcc@g" \
337         mklibgcc.in-ORIG > mklibgcc.in
338
339      # A similar problem exists when setting MULTILIBS on the environment
340      # for the mklibgcc script for generation of libgcc.mk .
341      # Here we will force it to use our cross-compiler to produce the results
342      # of gcc --print-multi-lib
343      sed -i "/MULTILIBS/s@\$(GCC_FOR_TARGET)@${HST_TOOLS}/bin/${TARGET}-gcc@g" \
344         Makefile.in
345   ;;
346esac
347
348# When cross-building a target native compiler we run into big issues
349# when determining assembler and linker features required for tls support,
350# ( not to mention which nm, objdump et al to use ) during the configures
351# triggered by make.
352#
353# Gcc's configury does not take into account the fact that when cross
354# building the target native compiler we are _still_ actually cross-compiling.
355# As far as it is concerned during the final configure fragment host = target,
356# it doesn't check whether host = build.
357#
358# It then performs its checks for binutils components as if this was a standard
359# host native build.
360#
361# If a target native binutils was installed before attempting to build gcc
362# it will try to use the created ld, as etc under ${TGT_TOOLS}
363# This obviously will not work, they will not run on the host.
364#
365# If the target native binutils hasn't been built yet it will use the
366# as ld et al from the _build_ host.
367# This quite frankly sucks rocks.
368#
369# The following patch fixes this behaviour, enforcing usage of our
370# cross-tools for configure checks if host = target and host != build
371#
372# NOTE: 20050507 This doesn't appear to be necessary for gcc 4.x :-)
373#       This of course will have to be checked thoroughly...
374
375# TODO: Add patches for gcc-3.3 series as well
376cd ${SRC}/${PKGDIR}
377case ${target_gcc_ver} in
378   3.4* )
379      apply_patch gcc-3.4.1-fix_configure_for_target_native
380   ;;
381   4.* )
382      # set AS_FOR_TARGET and LD_FOR_TARGET so these are used for feature checks...
383      extra_makeopts="${extra_makeopts} AS_FOR_TARGET=${HST_TOOLS}/bin/${TARGET}-as"
384      extra_makeopts="${extra_makeopts} LD_FOR_TARGET=${HST_TOOLS}/bin/${TARGET}-ld"
385   ;;
386esac
387# End HACKS
388
389test -d ${SRC}/gcc-${GCC_VER}-target &&
390   rm -rf ${SRC}/gcc-${GCC_VER}-target
391
392mkdir -p ${SRC}/gcc-${GCC_VER}-target &&
393cd ${SRC}/gcc-${GCC_VER}-target &&
394
395max_log_init Gcc ${GCC_VER} cross-pt2 ${CONFLOGS} ${LOG}
396#CONFIG_SHELL=/bin/bash \
397CFLAGS="-O2 -pipe" \
398CXXFLAGS="-O2 -pipe" \
399CC="${TARGET}-gcc ${ARCH_CFLAGS}" \
400../${PKGDIR}/configure --prefix=${BUILD_PREFIX} \
401   --build=${BUILD} --host=${TARGET} --target=${TARGET} \
402   --enable-languages=c,c++ --enable-__cxa_atexit \
403   --enable-c99 --enable-long-long --enable-threads=posix \
404   --disable-nls --enable-shared ${extra_conf} \
405   >> ${LOGFILE} 2>&1 &&
406echo " o Configure OK" || barf
407#   --enable-languages=c,c++,f77,objc,ada,java,pascal,treelang --enable-__cxa_atexit \
408#   --enable-version-specific-runtime-libs \
409
410min_log_init ${BUILDLOGS} &&
411make ${PMFLAGS} BOOT_LDFLAGS="-s" BOOT_CFLAGS="-O2 ${HOST_CFLAGS} -pipe" \
412   STAGE1_CFLAGS="-O2 ${HOST_CFLAGS} -pipe" ${extra_makeopts} all \
413   >> ${LOGFILE} 2>&1 &&
414echo " o Build OK" || barf
415
416min_log_init ${INSTLOGS} &&
417make ${INSTALL_OPTIONS} install \
418   >> ${LOGFILE} 2>&1 &&
419echo " o Install OK" || barf
420
421if [ ! "${USE_SYSROOT}" = "Y" ]; then
422   # Prep new root for target native glibc build
423   libdirs="${libdirname}"
424   if [ "Y" = "${MULTIARCH}" ]; then libdirs="lib lib32 lib64" ; fi
425   for dir in ${libdirs} ; do
426      if [ -d ${TGT_TOOLS}/${dir} ]; then
427         test -d ${LFS}/usr/${dir} || mkdir -p ${LFS}/usr/${dir}
428         ln -sf ../..${TGT_TOOLS}/${dir}/libgcc_s.so.1 \
429            ${LFS}/usr/${dir}/libgcc_s.so.1
430         test -f ${TGT_TOOLS}/${dir}/libgcc_s.so &&
431            ln -sf libgcc_s.so.1 ${LFS}/usr/${dir}/libgcc_s.so
432         test -f ${TGT_TOOLS}/${dir}/libgcc_s_32.so &&
433            ln -sf libgcc_s.so.1 ${LFS}/usr/${dir}/libgcc_s_32.so
434         test -f ${TGT_TOOLS}/${dir}/libgcc_s_64.so &&
435            ln -sf libgcc_s.so.1 ${LFS}/usr/${dir}/libgcc_s_64.so
436      fi
437   done
438fi
439
440test -L ${INSTALL_PREFIX}/bin/cc || ln -s gcc ${INSTALL_PREFIX}/bin/cc
441
Note: See TracBrowser for help on using the repository browser.