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
2007-06-16 18:08:14 +00:00
do_print_filename( ) {
[ " ${ CT_CC } " = "gcc" ] || return 0
2007-06-16 21:44:45 +00:00
echo " gcc- ${ CT_CC_VERSION } "
2007-06-16 18:08:14 +00:00
}
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!
2008-05-03 17:51:16 +00:00
CT_GetFile " ${ CT_CC_FILE } " \
{ ftp,http} ://ftp.gnu.org/gnu/gcc{ ,{ ,/releases} /${ CT_CC_FILE } }
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( ) {
CT_ExtractAndPatch " ${ CT_CC_FILE } "
}
2007-08-15 10:14:43 +00:00
#------------------------------------------------------------------------------
# Core gcc pass 1
do_cc_core_pass_1( ) {
# In case we're NPTL, build the static core gcc;
# in any other case, do nothing.
case " ${ CT_THREADS } " in
2008-08-12 07:47:51 +00:00
nptl) do_cc_core mode = static build_libgcc = no; ;
*) ; ;
2007-08-15 10:14:43 +00:00
esac
}
# Core gcc pass 2
do_cc_core_pass_2( ) {
# In case we're NPTL, build the shared core gcc,
2008-08-07 13:28:02 +00:00
# in any other case, build the static core gcc and the target libgcc.
2007-08-15 10:14:43 +00:00
case " ${ CT_THREADS } " in
2008-08-12 07:47:51 +00:00
nptl) do_cc_core mode = shared build_libgcc = yes; ;
*) do_cc_core mode = static build_libgcc = yes; ;
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:
# - we're building static or shared: mode=[static|shared]
# - we need to build libgcc or not: build_libgcc=[yes|no]
# Usage: do_cc_core_static mode=[static|shared] build_libgcc=[yes|no]
do_cc_core( ) {
local mode
local build_libgcc
local core_prefix_dir
local extra_config
2007-08-15 10:14:43 +00:00
2008-08-12 07:47:51 +00:00
eval $1
eval $2
CT_TestOrAbort " Internal Error: 'mode' must either 'static' or 'shared', not ' ${ mode :- (empty) } ' " " ${ mode } " = "static" -o " ${ mode } " = "shared"
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
mkdir -p " ${ CT_BUILD_DIR } /build-cc-core- ${ mode } "
cd " ${ CT_BUILD_DIR } /build-cc-core- ${ mode } "
CT_DoStep INFO " Installing ${ mode } core C compiler "
case " ${ mode } " in
static)
core_prefix_dir = " ${ CT_CC_CORE_STATIC_PREFIX_DIR } "
extra_config = " ${ extra_config } --with-newlib --enable-threads=no --disable-shared "
; ;
shared)
core_prefix_dir = " ${ CT_CC_CORE_SHARED_PREFIX_DIR } "
extra_config = " ${ extra_config } --enable-shared "
; ;
esac
2007-08-15 10:14:43 +00:00
2008-06-17 11:22:23 +00:00
CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
2008-08-12 07:47:51 +00:00
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 "
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-05-14 17:56:33 +00:00
CC_FOR_BUILD = " ${ CT_CC_NATIVE } " \
2007-08-15 10:14:43 +00:00
CFLAGS = " ${ CT_CFLAGS_FOR_HOST } " \
2008-07-14 15:56:57 +00:00
CT_DoExecLog ALL \
2007-08-15 10:14:43 +00:00
" ${ CT_SRC_DIR } / ${ CT_CC_FILE } /configure " \
${ CT_CANADIAN_OPT } \
--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 \
--enable-languages= c \
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...
2008-08-07 13:28:02 +00:00
if [ ! -f " ${ CT_SRC_DIR } / ${ CT_CC_FILE } /gcc/BASE-VER " ] ; then
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.
if [ -d " ${ CT_SRC_DIR } / ${ CT_CC_FILE } /libdecnumber " ] ; then
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.
gcc_version_major = $( echo ${ CT_CC_VERSION } | sed -r -e 's/^([^\.]+)\..*/\1/' )
gcc_version_minor = $( echo ${ CT_CC_VERSION } | sed -r -e 's/^[^\.]+\.([^.]+).*/\1/' )
if [ ${ gcc_version_major } -eq 4 -a ${ gcc_version_minor } -ge 3 \
-o ${ gcc_version_major } -gt 4 ] ; then
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( ) {
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 "
2007-09-15 21:44:18 +00:00
extra_config = " ${ extra_config } ${ CT_ARCH_WITH_ARCH } ${ CT_ARCH_WITH_ABI } ${ CT_ARCH_WITH_CPU } ${ CT_ARCH_WITH_TUNE } ${ CT_ARCH_WITH_FPU } ${ CT_ARCH_WITH_FLOAT } "
2008-06-09 16:14:23 +00:00
[ " ${ 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...
2008-05-14 17:56:33 +00:00
CC_FOR_BUILD = " ${ CT_CC_NATIVE } " \
2007-09-16 17:59:18 +00:00
CFLAGS = " ${ CT_CFLAGS_FOR_HOST } " \
2008-05-25 22:10:32 +00:00
CFLAGS_FOR_TARGET = " ${ CT_TARGET_CFLAGS } " \
CXXFLAGS_FOR_TARGET = " ${ CT_TARGET_CFLAGS } " \
LDFLAGS_FOR_TARGET = " ${ CT_TARGET_LDFLAGS } " \
2008-07-14 15:56:57 +00:00
CT_DoExecLog ALL \
2007-02-24 11:00:05 +00:00
" ${ CT_SRC_DIR } / ${ CT_CC_FILE } /configure " \
${ CT_CANADIAN_OPT } \
--target= ${ CT_TARGET } --host= ${ CT_HOST } \
--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 \
2008-05-14 17:56:33 +00:00
--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-07-14 15:56:57 +00:00
ln -sv " ${ CT_PREFIX_DIR } /bin/ ${ CT_TARGET } " -{ g,} cc 2>& 1 | CT_DoLog ALL
2007-07-08 17:44:59 +00:00
2007-02-24 11:00:05 +00:00
CT_EndStep
}