2007-08-15 10:14:43 +00:00
# This file adds the function to build the gcc C compiler
2007-02-24 11:00:05 +00:00
# Copyright 2007 Yann E. MORIN
# Licensed under the GPL v2. See COPYING in the root of this package
2008-04-30 10:43:41 +00:00
# Download gcc
2007-05-07 09:04:02 +00:00
do_cc_get( ) {
# Ah! gcc folks are kind of 'different': they store the tarballs in
# subdirectories of the same name! That's because gcc is such /crap/ that
# it is such /big/ that it needs being splitted for distribution! Sad. :-(
# Arrgghh! Some of those versions does not follow this convention:
# gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
# subdirectory! You bastard!
2009-01-04 14:39:39 +00:00
CT_GetFile " gcc- ${ CT_CC_VERSION } " \
{ ftp,http} ://ftp.gnu.org/gnu/gcc{ ,{ ,/releases} /gcc-${ CT_CC_VERSION } }
2009-01-27 21:36:18 +00:00
ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-${ CT_CC_VERSION }
2009-01-06 22:10:17 +00:00
# Starting with GCC 4.3, ecj is used for Java, and will only be
# built if the configure script finds ecj.jar at the top of the
# GCC source tree, which will not be there unless we get it and
# put it there ourselves
if [ " ${ CT_CC_LANG_JAVA_USE_ECJ } " = "y" ] ; then
CT_GetFile ecj-latest .jar ftp://gcc.gnu.org/pub/java \
ftp://sourceware.org/pub/java
fi
2007-05-07 09:04:02 +00:00
}
2008-04-30 10:43:41 +00:00
# Extract gcc
2007-05-07 09:04:02 +00:00
do_cc_extract( ) {
2009-01-05 23:02:43 +00:00
CT_Extract " gcc- ${ CT_CC_VERSION } "
CT_Patch " gcc- ${ CT_CC_VERSION } "
2009-01-06 22:10:17 +00:00
# Copy ecj-latest.jar to ecj.jar at the top of the GCC source tree
if [ " ${ CT_CC_LANG_JAVA_USE_ECJ } " = "y" ] ; then
CT_DoExecLog ALL cp -v " ${ CT_TARBALLS_DIR } /ecj-latest.jar " " ${ CT_SRC_DIR } /gcc- ${ CT_CC_VERSION } /ecj.jar "
fi
2007-05-07 09:04:02 +00:00
}
2007-08-15 10:14:43 +00:00
#------------------------------------------------------------------------------
# Core gcc pass 1
do_cc_core_pass_1( ) {
2008-09-14 16:21:07 +00:00
# If we're building for bare metal, build the static core gcc,
# with libgcc.
# In case we're not bare metal, and we're NPTL, build the static core gcc.
# In any other case, do nothing.
case " ${ CT_BARE_METAL } , ${ CT_THREADS } " in
y,*) do_cc_core mode = baremetal build_libgcc = yes; ;
,nptl) do_cc_core mode = static build_libgcc = no; ;
2008-08-12 07:47:51 +00:00
*) ; ;
2007-08-15 10:14:43 +00:00
esac
}
# Core gcc pass 2
do_cc_core_pass_2( ) {
2008-09-14 16:21:07 +00:00
# In case we're building for bare metal, do nothing, we already have
# our compiler.
2008-09-30 18:19:18 +00:00
# In case we're NPTL, build the shared core gcc and the target libgcc.
# In any other case, build the static core gcc and, if using gcc-4.3+,
# also build the target libgcc.
2008-09-14 16:21:07 +00:00
case " ${ CT_BARE_METAL } , ${ CT_THREADS } " in
y,*) ; ;
2008-09-30 18:19:18 +00:00
,nptl)
do_cc_core mode = shared build_libgcc = yes
; ;
*) if [ " ${ CT_CC_GCC_4_3_or_later } " = "y" ] ; then
do_cc_core mode = static build_libgcc = yes
else
do_cc_core mode = static build_libgcc = no
fi
; ;
2007-08-15 10:14:43 +00:00
esac
}
#------------------------------------------------------------------------------
2008-08-12 07:47:51 +00:00
# Build core gcc
# This function is used to build both the static and the shared core C conpiler,
# with or without the target libgcc. We need to know wether:
2008-09-14 16:21:07 +00:00
# - we're building static, shared or bare metal: mode=[static|shared|baremetal]
# - we need to build libgcc or not : build_libgcc=[yes|no]
# Usage: do_cc_core_static mode=[static|shared|baremetal] build_libgcc=[yes|no]
2008-08-12 07:47:51 +00:00
do_cc_core( ) {
local mode
local build_libgcc
local core_prefix_dir
local extra_config
2008-12-24 17:34:32 +00:00
local lang_opt
2007-08-15 10:14:43 +00:00
2008-08-12 07:47:51 +00:00
eval $1
eval $2
2008-09-14 16:21:07 +00:00
CT_TestOrAbort " Internal Error: 'mode' must either 'static', 'shared' or 'baremetal', not ' ${ mode :- (empty) } ' " " ${ mode } " = "static" -o " ${ mode } " = "shared" -o " ${ mode } " = "baremetal"
2008-08-12 07:47:51 +00:00
CT_TestOrAbort " Internal Error: 'build_libgcc' must be either 'yes' or 'no', not ' ${ build_libgcc :- (empty) } ' " " ${ build_libgcc } " = "yes" -o " ${ build_libgcc } " = "no"
# In normal conditions, ( "${mode}" = "shared" ) implies
# ( "${build_libgcc}" = "yes" ), but I won't check for that
2008-12-24 17:34:32 +00:00
CT_DoStep INFO " Installing ${ mode } core C compiler "
2008-08-12 07:47:51 +00:00
mkdir -p " ${ CT_BUILD_DIR } /build-cc-core- ${ mode } "
cd " ${ CT_BUILD_DIR } /build-cc-core- ${ mode } "
2008-12-24 17:34:32 +00:00
lang_opt = c
2008-08-12 07:47:51 +00:00
case " ${ mode } " in
static)
core_prefix_dir = " ${ CT_CC_CORE_STATIC_PREFIX_DIR } "
extra_config = " ${ extra_config } --with-newlib --enable-threads=no --disable-shared "
2008-09-14 16:21:07 +00:00
copy_headers = y
2008-08-12 07:47:51 +00:00
; ;
shared)
core_prefix_dir = " ${ CT_CC_CORE_SHARED_PREFIX_DIR } "
extra_config = " ${ extra_config } --enable-shared "
2008-09-14 16:21:07 +00:00
copy_headers = y
; ;
baremetal)
core_prefix_dir = " ${ CT_PREFIX_DIR } "
extra_config = " ${ extra_config } --with-newlib --enable-threads=no --disable-shared "
2008-12-24 17:34:32 +00:00
[ " ${ CT_CC_LANG_CXX } " = "y" ] && lang_opt = " ${ lang_opt } ,c++ "
2008-09-14 16:21:07 +00:00
copy_headers = n
2008-08-12 07:47:51 +00:00
; ;
esac
2007-08-15 10:14:43 +00:00
2008-09-14 16:21:07 +00:00
if [ " ${ copy_headers } " = "y" ] ; then
CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
CT_DoExecLog ALL mkdir -p " ${ core_prefix_dir } / ${ CT_TARGET } /include "
CT_DoExecLog ALL cp -r " ${ CT_HEADERS_DIR } " /* " ${ core_prefix_dir } / ${ CT_TARGET } /include "
fi
2007-08-15 10:14:43 +00:00
2008-08-12 07:47:51 +00:00
CT_DoLog EXTRA " Configuring ${ mode } core C compiler "
2007-08-15 10:14:43 +00:00
2008-08-12 07:47:51 +00:00
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_ARCH } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_ABI } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_CPU } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_TUNE } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_FPU } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_FLOAT } "
2008-07-13 10:32:38 +00:00
[ " ${ CT_GMP_MPFR } " = "y" ] && extra_config = " ${ extra_config } --with-gmp= ${ CT_PREFIX_DIR } --with-mpfr= ${ CT_PREFIX_DIR } "
2008-05-22 22:38:37 +00:00
if [ " ${ CT_CC_CXA_ATEXIT } " = "y" ] ; then
extra_config = " ${ extra_config } --enable-__cxa_atexit "
else
extra_config = " ${ extra_config } --disable-__cxa_atexit "
fi
2007-08-15 10:14:43 +00:00
2008-05-20 21:32:39 +00:00
CT_DoLog DEBUG " Extra config passed: ' ${ extra_config } ' "
2007-08-15 10:14:43 +00:00
# Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
2008-11-13 18:22:23 +00:00
CC_FOR_BUILD = " ${ CT_BUILD } -gcc " \
2007-08-15 10:14:43 +00:00
CFLAGS = " ${ CT_CFLAGS_FOR_HOST } " \
2008-07-14 15:56:57 +00:00
CT_DoExecLog ALL \
2009-01-04 14:39:39 +00:00
" ${ CT_SRC_DIR } /gcc- ${ CT_CC_VERSION } /configure " \
2008-11-13 18:22:23 +00:00
--build= ${ CT_BUILD } \
2007-08-15 10:14:43 +00:00
--host= ${ CT_HOST } \
--target= ${ CT_TARGET } \
2008-08-12 07:47:51 +00:00
--prefix= " ${ core_prefix_dir } " \
2007-08-15 10:14:43 +00:00
--with-local-prefix= " ${ CT_SYSROOT_DIR } " \
--disable-multilib \
${ CC_CORE_SYSROOT_ARG } \
${ extra_config } \
--disable-nls \
--enable-symvers= gnu \
2008-12-24 17:34:32 +00:00
--enable-languages= " ${ lang_opt } " \
2008-05-14 17:56:33 +00:00
--enable-target-optspace \
2008-07-14 15:56:57 +00:00
${ CT_CC_CORE_EXTRA_CONFIG }
2007-08-15 10:14:43 +00:00
2008-08-07 13:28:02 +00:00
if [ " ${ build_libgcc } " = "yes" ] ; then
2008-08-12 07:47:51 +00:00
# HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
# gcc/config/t-libunwind so -lc is removed from the link for
# libgcc_s.so, as we do not have a target -lc yet.
# This is not as ugly as it appears to be ;-) All symbols get resolved
# during the glibc build, and we provide a proper libgcc_s.so for the
# cross toolchain during the final gcc build.
#
# As we cannot modify the source tree, nor override SHLIB_LC itself
# during configure or make, we have to edit the resultant
# gcc/libgcc.mk itself to remove -lc from the link.
# This causes us to have to jump through some hoops...
#
# To produce libgcc.mk to edit we firstly require libiberty.a,
# so we configure then build it.
# Next we have to configure gcc, create libgcc.mk then edit it...
# So much easier if we just edit the source tree, but hey...
2009-01-04 14:39:39 +00:00
if [ ! -f " ${ CT_SRC_DIR } /gcc- ${ CT_CC_VERSION } /gcc/BASE-VER " ] ; then
2008-08-07 13:28:02 +00:00
CT_DoExecLog ALL make configure-libiberty
CT_DoExecLog ALL make ${ PARALLELMFLAGS } -C libiberty libiberty.a
CT_DoExecLog ALL make configure-gcc configure-libcpp
CT_DoExecLog ALL make ${ PARALLELMFLAGS } all-libcpp
else
CT_DoExecLog ALL make configure-gcc configure-libcpp configure-build-libiberty
CT_DoExecLog ALL make ${ PARALLELMFLAGS } all-libcpp all-build-libiberty
fi
# HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
2009-01-04 14:39:39 +00:00
if [ -d " ${ CT_SRC_DIR } /gcc- ${ CT_CC_VERSION } /libdecnumber " ] ; then
2008-08-07 13:28:02 +00:00
CT_DoExecLog ALL make configure-libdecnumber
CT_DoExecLog ALL make ${ PARALLELMFLAGS } -C libdecnumber libdecnumber.a
fi
# Starting with GCC 4.3, libgcc.mk is no longer built,
# and libgcc.mvars is used instead.
2008-09-30 18:19:18 +00:00
if [ " ${ CT_CC_GCC_4_3_or_later } " = "y" ] ; then
2008-08-07 13:28:02 +00:00
libgcc_rule = "libgcc.mvars"
build_rules = "all-gcc all-target-libgcc"
install_rules = "install-gcc install-target-libgcc"
else
libgcc_rule = "libgcc.mk"
build_rules = "all-gcc"
install_rules = "install-gcc"
fi
CT_DoExecLog ALL make ${ PARALLELMFLAGS } -C gcc ${ libgcc_rule }
sed -r -i -e 's@-lc@@g' gcc/${ libgcc_rule }
else # build_libgcc
build_rules = "all-gcc"
install_rules = "install-gcc"
fi # ! build libgcc
2008-08-04 12:38:06 +00:00
2007-08-15 10:14:43 +00:00
if [ " ${ CT_CANADIAN } " = "y" ] ; then
CT_DoLog EXTRA "Building libiberty"
2008-07-14 15:56:57 +00:00
CT_DoExecLog ALL make ${ PARALLELMFLAGS } all-build-libiberty
2007-08-15 10:14:43 +00:00
fi
2008-08-12 07:47:51 +00:00
CT_DoLog EXTRA " Building ${ mode } core C compiler "
2008-07-24 16:56:28 +00:00
CT_DoExecLog ALL make ${ PARALLELMFLAGS } ${ build_rules }
2007-08-15 10:14:43 +00:00
2008-08-12 07:47:51 +00:00
CT_DoLog EXTRA " Installing ${ mode } core C compiler "
2008-07-24 16:56:28 +00:00
CT_DoExecLog ALL make ${ install_rules }
2007-08-15 10:14:43 +00:00
CT_EndStep
}
#------------------------------------------------------------------------------
2007-05-07 09:04:02 +00:00
# Build final gcc
2007-02-24 11:00:05 +00:00
do_cc( ) {
2008-09-14 16:21:07 +00:00
# If building for bare metal, nothing to be done here, the static core conpiler is enough!
[ " ${ CT_BARE_METAL } " = "y" ] && return 0
2007-04-23 21:03:49 +00:00
CT_DoStep INFO "Installing final compiler"
2007-02-24 11:00:05 +00:00
mkdir -p " ${ CT_BUILD_DIR } /build-cc "
cd " ${ CT_BUILD_DIR } /build-cc "
2007-05-01 09:03:40 +00:00
CT_DoLog EXTRA "Configuring final compiler"
2007-02-24 11:00:05 +00:00
# Enable selected languages
lang_opt = "c"
[ " ${ CT_CC_LANG_CXX } " = "y" ] && lang_opt = " ${ lang_opt } ,c++ "
[ " ${ CT_CC_LANG_FORTRAN } " = "y" ] && lang_opt = " ${ lang_opt } ,fortran "
[ " ${ CT_CC_LANG_ADA } " = "y" ] && lang_opt = " ${ lang_opt } ,ada "
[ " ${ CT_CC_LANG_JAVA } " = "y" ] && lang_opt = " ${ lang_opt } ,java "
[ " ${ CT_CC_LANG_OBJC } " = "y" ] && lang_opt = " ${ lang_opt } ,objc "
[ " ${ CT_CC_LANG_OBJCXX } " = "y" ] && lang_opt = " ${ lang_opt } ,obj-c++ "
CT_Test "Building ADA language is not yet supported. Will try..." " ${ CT_CC_LANG_ADA } " = "y"
CT_Test "Building Objective-C language is not yet supported. Will try..." " ${ CT_CC_LANG_OBJC } " = "y"
CT_Test "Building Objective-C++ language is not yet supported. Will try..." " ${ CT_CC_LANG_OBJCXX } " = "y"
2008-04-30 10:43:41 +00:00
CT_Test " Building ${ CT_CC_LANG_OTHERS //,/ } language(s) is not yet supported. Will try... " -n " ${ CT_CC_LANG_OTHERS } "
2008-05-20 21:32:39 +00:00
lang_opt = $( echo " ${ lang_opt } , ${ CT_CC_LANG_OTHERS } " | sed -r -e 's/,+/,/g; s/,*$//;' )
2007-02-24 11:00:05 +00:00
extra_config = " --enable-languages= ${ lang_opt } "
2008-05-24 22:49:54 +00:00
extra_config = " ${ extra_config } --disable-multilib "
2008-09-14 16:21:07 +00:00
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_ARCH } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_ABI } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_CPU } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_TUNE } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_FPU } "
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_FLOAT } "
[ " ${ CT_SHARED_LIBS } " = "y" ] || extra_config = " ${ extra_config } --disable-shared "
2008-08-07 13:55:30 +00:00
[ " ${ CT_GMP_MPFR } " = "y" ] && extra_config = " ${ extra_config } --with-gmp= ${ CT_PREFIX_DIR } --with-mpfr= ${ CT_PREFIX_DIR } "
[ -n " ${ CT_CC_PKGVERSION } " ] && extra_config = " ${ extra_config } --with-pkgversion= ${ CT_CC_PKGVERSION } "
[ -n " ${ CT_CC_BUGURL } " ] && extra_config = " ${ extra_config } --with-bugurl= ${ CT_CC_BUGURL } "
[ " ${ CT_CC_SJLJ_EXCEPTIONS_USE } " = "y" ] && extra_config = " ${ extra_config } --enable-sjlj-exceptions "
[ " ${ CT_CC_SJLJ_EXCEPTIONS_DONT_USE } " = "y" ] && extra_config = " ${ extra_config } --disable-sjlj-exceptions "
2008-05-22 22:38:37 +00:00
if [ " ${ CT_CC_CXA_ATEXIT } " = "y" ] ; then
extra_config = " ${ extra_config } --enable-__cxa_atexit "
else
extra_config = " ${ extra_config } --disable-__cxa_atexit "
fi
2007-02-24 11:00:05 +00:00
2008-05-20 21:32:39 +00:00
CT_DoLog DEBUG " Extra config passed: ' ${ extra_config } ' "
2007-02-24 11:00:05 +00:00
# --enable-symvers=gnu really only needed for sh4 to work around a
# detection problem only matters for gcc-3.2.x and later, I think.
# --disable-nls to work around crash bug on ppc405, but also because
# embedded systems don't really need message catalogs...
2009-01-04 14:39:39 +00:00
CC_FOR_BUILD = " ${ CT_BUILD } -gcc " \
CFLAGS = " ${ CT_CFLAGS_FOR_HOST } " \
CFLAGS_FOR_TARGET = " ${ CT_TARGET_CFLAGS } " \
CXXFLAGS_FOR_TARGET = " ${ CT_TARGET_CFLAGS } " \
LDFLAGS_FOR_TARGET = " ${ CT_TARGET_LDFLAGS } " \
CT_DoExecLog ALL \
" ${ CT_SRC_DIR } /gcc- ${ CT_CC_VERSION } /configure " \
--build= ${ CT_BUILD } \
--host= ${ CT_HOST } \
--target= ${ CT_TARGET } \
--prefix= " ${ CT_PREFIX_DIR } " \
${ CC_SYSROOT_ARG } \
${ extra_config } \
--with-local-prefix= " ${ CT_SYSROOT_DIR } " \
--disable-nls \
--enable-threads= posix \
--enable-symvers= gnu \
--enable-c99 \
--enable-long-long \
--enable-target-optspace \
2008-07-14 15:56:57 +00:00
${ CT_CC_EXTRA_CONFIG }
2007-02-24 11:00:05 +00:00
2007-05-24 17:49:24 +00:00
if [ " ${ CT_CANADIAN } " = "y" ] ; then
2007-02-24 11:00:05 +00:00
CT_DoLog EXTRA "Building libiberty"
2008-07-14 15:56:57 +00:00
CT_DoExecLog ALL make ${ PARALLELMFLAGS } all-build-libiberty
2007-02-24 11:00:05 +00:00
fi
2007-05-01 09:03:40 +00:00
CT_DoLog EXTRA "Building final compiler"
2008-07-14 15:56:57 +00:00
CT_DoExecLog ALL make ${ PARALLELMFLAGS } all
2007-02-24 11:00:05 +00:00
2007-05-01 09:03:40 +00:00
CT_DoLog EXTRA "Installing final compiler"
2008-07-14 15:56:57 +00:00
CT_DoExecLog ALL make install
2007-02-24 11:00:05 +00:00
2007-07-08 17:44:59 +00:00
# Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
# to call the C compiler with the same, somewhat canonical name.
2008-10-28 18:51:44 +00:00
CT_DoExecLog ALL ln -sv " ${ CT_TARGET } " -gcc " ${ CT_PREFIX_DIR } /bin/ ${ CT_TARGET } " -cc
2007-07-08 17:44:59 +00:00
2007-02-24 11:00:05 +00:00
CT_EndStep
}