Better handle the second pass core gcc build, differentiating between gcc prior to 4.3 with gcc from 4.3.
Simplify detecting wether gcc is 4.3 and later, or older than 4.3 (we already know from .config).
/trunk/scripts/build/cc/gcc.sh | 22 13 9 0 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
1 # This file adds the function to build the gcc C compiler
3 # Copyright 2007 Yann E. MORIN
4 # Licensed under the GPL v2. See COPYING in the root of this package
7 [ "${CT_CC}" = "gcc" ] || return 0
8 echo "gcc-${CT_CC_VERSION}"
13 # Ah! gcc folks are kind of 'different': they store the tarballs in
14 # subdirectories of the same name! That's because gcc is such /crap/ that
15 # it is such /big/ that it needs being splitted for distribution! Sad. :-(
16 # Arrgghh! Some of those versions does not follow this convention:
17 # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
18 # subdirectory! You bastard!
19 CT_GetFile "${CT_CC_FILE}" \
20 {ftp,http}://ftp.gnu.org/gnu/gcc{,{,/releases}/${CT_CC_FILE}}
25 CT_ExtractAndPatch "${CT_CC_FILE}"
28 #------------------------------------------------------------------------------
31 # If we're building for bare metal, build the static core gcc,
33 # In case we're not bare metal, and we're NPTL, build the static core gcc.
34 # In any other case, do nothing.
35 case "${CT_BARE_METAL},${CT_THREADS}" in
36 y,*) do_cc_core mode=baremetal build_libgcc=yes;;
37 ,nptl) do_cc_core mode=static build_libgcc=no;;
44 # In case we're building for bare metal, do nothing, we already have
46 # In case we're NPTL, build the shared core gcc and the target libgcc.
47 # In any other case, build the static core gcc and, if using gcc-4.3+,
48 # also build the target libgcc.
49 case "${CT_BARE_METAL},${CT_THREADS}" in
52 do_cc_core mode=shared build_libgcc=yes
54 *) if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
55 do_cc_core mode=static build_libgcc=yes
57 do_cc_core mode=static build_libgcc=no
63 #------------------------------------------------------------------------------
65 # This function is used to build both the static and the shared core C conpiler,
66 # with or without the target libgcc. We need to know wether:
67 # - we're building static, shared or bare metal: mode=[static|shared|baremetal]
68 # - we need to build libgcc or not : build_libgcc=[yes|no]
69 # Usage: do_cc_core_static mode=[static|shared|baremetal] build_libgcc=[yes|no]
78 CT_TestOrAbort "Internal Error: 'mode' must either 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'" "${mode}" = "static" -o "${mode}" = "shared" -o "${mode}" = "baremetal"
79 CT_TestOrAbort "Internal Error: 'build_libgcc' must be either 'yes' or 'no', not '${build_libgcc:-(empty)}'" "${build_libgcc}" = "yes" -o "${build_libgcc}" = "no"
80 # In normal conditions, ( "${mode}" = "shared" ) implies
81 # ( "${build_libgcc}" = "yes" ), but I won't check for that
83 mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
84 cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
86 CT_DoStep INFO "Installing ${mode} core C compiler"
89 core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
90 extra_config="${extra_config} --with-newlib --enable-threads=no --disable-shared"
94 core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
95 extra_config="${extra_config} --enable-shared"
99 core_prefix_dir="${CT_PREFIX_DIR}"
100 extra_config="${extra_config} --with-newlib --enable-threads=no --disable-shared"
105 if [ "${copy_headers}" = "y" ]; then
106 CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
107 CT_DoExecLog ALL mkdir -p "${core_prefix_dir}/${CT_TARGET}/include"
108 CT_DoExecLog ALL cp -r "${CT_HEADERS_DIR}"/* "${core_prefix_dir}/${CT_TARGET}/include"
111 CT_DoLog EXTRA "Configuring ${mode} core C compiler"
113 extra_config="${extra_config} ${CT_ARCH_WITH_ARCH}"
114 extra_config="${extra_config} ${CT_ARCH_WITH_ABI}"
115 extra_config="${extra_config} ${CT_ARCH_WITH_CPU}"
116 extra_config="${extra_config} ${CT_ARCH_WITH_TUNE}"
117 extra_config="${extra_config} ${CT_ARCH_WITH_FPU}"
118 extra_config="${extra_config} ${CT_ARCH_WITH_FLOAT}"
119 [ "${CT_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
120 if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
121 extra_config="${extra_config} --enable-__cxa_atexit"
123 extra_config="${extra_config} --disable-__cxa_atexit"
126 CT_DoLog DEBUG "Extra config passed: '${extra_config}'"
128 # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
129 CC_FOR_BUILD="${CT_CC_NATIVE}" \
130 CFLAGS="${CT_CFLAGS_FOR_HOST}" \
132 "${CT_SRC_DIR}/${CT_CC_FILE}/configure" \
135 --target=${CT_TARGET} \
136 --prefix="${core_prefix_dir}" \
137 --with-local-prefix="${CT_SYSROOT_DIR}" \
139 ${CC_CORE_SYSROOT_ARG} \
142 --enable-symvers=gnu \
143 --enable-languages=c \
144 --enable-target-optspace \
145 ${CT_CC_CORE_EXTRA_CONFIG}
147 if [ "${build_libgcc}" = "yes" ]; then
148 # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
149 # gcc/config/t-libunwind so -lc is removed from the link for
150 # libgcc_s.so, as we do not have a target -lc yet.
151 # This is not as ugly as it appears to be ;-) All symbols get resolved
152 # during the glibc build, and we provide a proper libgcc_s.so for the
153 # cross toolchain during the final gcc build.
155 # As we cannot modify the source tree, nor override SHLIB_LC itself
156 # during configure or make, we have to edit the resultant
157 # gcc/libgcc.mk itself to remove -lc from the link.
158 # This causes us to have to jump through some hoops...
160 # To produce libgcc.mk to edit we firstly require libiberty.a,
161 # so we configure then build it.
162 # Next we have to configure gcc, create libgcc.mk then edit it...
163 # So much easier if we just edit the source tree, but hey...
164 if [ ! -f "${CT_SRC_DIR}/${CT_CC_FILE}/gcc/BASE-VER" ]; then
165 CT_DoExecLog ALL make configure-libiberty
166 CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libiberty libiberty.a
167 CT_DoExecLog ALL make configure-gcc configure-libcpp
168 CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp
170 CT_DoExecLog ALL make configure-gcc configure-libcpp configure-build-libiberty
171 CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp all-build-libiberty
173 # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
174 if [ -d "${CT_SRC_DIR}/${CT_CC_FILE}/libdecnumber" ]; then
175 CT_DoExecLog ALL make configure-libdecnumber
176 CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libdecnumber libdecnumber.a
179 # Starting with GCC 4.3, libgcc.mk is no longer built,
180 # and libgcc.mvars is used instead.
182 if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
183 libgcc_rule="libgcc.mvars"
184 build_rules="all-gcc all-target-libgcc"
185 install_rules="install-gcc install-target-libgcc"
187 libgcc_rule="libgcc.mk"
188 build_rules="all-gcc"
189 install_rules="install-gcc"
192 CT_DoExecLog ALL make ${PARALLELMFLAGS} -C gcc ${libgcc_rule}
193 sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
195 build_rules="all-gcc"
196 install_rules="install-gcc"
199 if [ "${CT_CANADIAN}" = "y" ]; then
200 CT_DoLog EXTRA "Building libiberty"
201 CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
204 CT_DoLog EXTRA "Building ${mode} core C compiler"
205 CT_DoExecLog ALL make ${PARALLELMFLAGS} ${build_rules}
207 CT_DoLog EXTRA "Installing ${mode} core C compiler"
208 CT_DoExecLog ALL make ${install_rules}
213 #------------------------------------------------------------------------------
216 # If building for bare metal, nothing to be done here, the static core conpiler is enough!
217 [ "${CT_BARE_METAL}" = "y" ] && return 0
219 CT_DoStep INFO "Installing final compiler"
221 mkdir -p "${CT_BUILD_DIR}/build-cc"
222 cd "${CT_BUILD_DIR}/build-cc"
224 CT_DoLog EXTRA "Configuring final compiler"
226 # Enable selected languages
228 [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
229 [ "${CT_CC_LANG_FORTRAN}" = "y" ] && lang_opt="${lang_opt},fortran"
230 [ "${CT_CC_LANG_ADA}" = "y" ] && lang_opt="${lang_opt},ada"
231 [ "${CT_CC_LANG_JAVA}" = "y" ] && lang_opt="${lang_opt},java"
232 [ "${CT_CC_LANG_OBJC}" = "y" ] && lang_opt="${lang_opt},objc"
233 [ "${CT_CC_LANG_OBJCXX}" = "y" ] && lang_opt="${lang_opt},obj-c++"
234 CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
235 CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
236 CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
237 CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
238 lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
240 extra_config="--enable-languages=${lang_opt}"
241 extra_config="${extra_config} --disable-multilib"
242 extra_config="${extra_config} ${CT_ARCH_WITH_ARCH}"
243 extra_config="${extra_config} ${CT_ARCH_WITH_ABI}"
244 extra_config="${extra_config} ${CT_ARCH_WITH_CPU}"
245 extra_config="${extra_config} ${CT_ARCH_WITH_TUNE}"
246 extra_config="${extra_config} ${CT_ARCH_WITH_FPU}"
247 extra_config="${extra_config} ${CT_ARCH_WITH_FLOAT}"
248 [ "${CT_SHARED_LIBS}" = "y" ] || extra_config="${extra_config} --disable-shared"
249 [ "${CT_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
250 [ -n "${CT_CC_PKGVERSION}" ] && extra_config="${extra_config} --with-pkgversion=${CT_CC_PKGVERSION}"
251 [ -n "${CT_CC_BUGURL}" ] && extra_config="${extra_config} --with-bugurl=${CT_CC_BUGURL}"
252 [ "${CT_CC_SJLJ_EXCEPTIONS_USE}" = "y" ] && extra_config="${extra_config} --enable-sjlj-exceptions"
253 [ "${CT_CC_SJLJ_EXCEPTIONS_DONT_USE}" = "y" ] && extra_config="${extra_config} --disable-sjlj-exceptions"
254 if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
255 extra_config="${extra_config} --enable-__cxa_atexit"
257 extra_config="${extra_config} --disable-__cxa_atexit"
260 CT_DoLog DEBUG "Extra config passed: '${extra_config}'"
262 # --enable-symvers=gnu really only needed for sh4 to work around a
263 # detection problem only matters for gcc-3.2.x and later, I think.
264 # --disable-nls to work around crash bug on ppc405, but also because
265 # embedded systems don't really need message catalogs...
266 CC_FOR_BUILD="${CT_CC_NATIVE}" \
267 CFLAGS="${CT_CFLAGS_FOR_HOST}" \
268 CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \
269 CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \
270 LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}" \
272 "${CT_SRC_DIR}/${CT_CC_FILE}/configure" \
274 --target=${CT_TARGET} --host=${CT_HOST} \
275 --prefix="${CT_PREFIX_DIR}" \
278 --with-local-prefix="${CT_SYSROOT_DIR}" \
280 --enable-threads=posix \
281 --enable-symvers=gnu \
284 --enable-target-optspace \
285 ${CT_CC_EXTRA_CONFIG}
287 if [ "${CT_CANADIAN}" = "y" ]; then
288 CT_DoLog EXTRA "Building libiberty"
289 CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
292 CT_DoLog EXTRA "Building final compiler"
293 CT_DoExecLog ALL make ${PARALLELMFLAGS} all
295 CT_DoLog EXTRA "Installing final compiler"
296 CT_DoExecLog ALL make install
298 # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
299 # to call the C compiler with the same, somewhat canonical name.
300 ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}"-{g,}cc 2>&1 |CT_DoLog ALL