scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Dec 12 00:01:54 2011 +0100 (2011-12-12)
changeset 2798 4d92888ec7cb
parent 2780 03ab39f149b4
child 2814 3dc2727ebffc
permissions -rw-r--r--
kernel/linux: add alternate download locations

Some longterm versions are not in the usual directory.
Account for these new locations.

Get rid of the mirror location, now that the main kernel site is
(almost) back to normal operations.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
     1 # This file adds the function to build the gcc C compiler
     2 # Copyright 2007 Yann E. MORIN
     3 # Licensed under the GPL v2. See COPYING in the root of this package
     4 
     5 # Download gcc
     6 do_cc_get() {
     7     local linaro_version
     8     local linaro_series
     9     local linaro_base_url="http://launchpad.net/gcc-linaro"
    10 
    11 
    12     # Account for the Linaro versioning
    13     linaro_version="$( echo "${CT_CC_VERSION}"      \
    14                        |sed -r -e 's/^linaro-//;'   \
    15                      )"
    16     linaro_series="$( echo "${linaro_version}"      \
    17                       |sed -r -e 's/-.*//;'         \
    18                     )"
    19 
    20     # Ah! gcc folks are kind of 'different': they store the tarballs in
    21     # subdirectories of the same name! That's because gcc is such /crap/ that
    22     # it is such /big/ that it needs being splitted for distribution! Sad. :-(
    23     # Arrgghh! Some of those versions does not follow this convention:
    24     # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
    25     # subdirectory! You bastard!
    26     CT_GetFile "gcc-${CT_CC_VERSION}"                                                       \
    27                {ftp,http}://ftp.gnu.org/gnu/gcc{,{,/releases}/gcc-${CT_CC_VERSION}}         \
    28                ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-${CT_CC_VERSION} \
    29                ftp://ftp.uvsq.fr/pub/gcc/snapshots/${CT_CC_VERSION}                         \
    30                "${linaro_base_url}/${linaro_series}/${linaro_version}/+download"
    31 
    32     # Starting with GCC 4.3, ecj is used for Java, and will only be
    33     # built if the configure script finds ecj.jar at the top of the
    34     # GCC source tree, which will not be there unless we get it and
    35     # put it there ourselves
    36     if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y" ]; then
    37         CT_GetFile ecj-latest .jar ftp://gcc.gnu.org/pub/java   \
    38                                    ftp://sourceware.org/pub/java
    39     fi
    40 }
    41 
    42 # Extract gcc
    43 do_cc_extract() {
    44     CT_Extract "gcc-${CT_CC_VERSION}"
    45     CT_Patch "gcc" "${CT_CC_VERSION}"
    46 
    47     # Copy ecj-latest.jar to ecj.jar at the top of the GCC source tree
    48     if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y"                     \
    49          -a ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"   \
    50        ]; then
    51         CT_DoExecLog ALL cp -v "${CT_TARBALLS_DIR}/ecj-latest.jar" "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"
    52     fi
    53 }
    54 
    55 #------------------------------------------------------------------------------
    56 # Core gcc pass 1
    57 do_cc_core_pass_1() {
    58     # If we're building for bare metal, build the static core gcc,
    59     # with libgcc.
    60     # In case we're not bare metal and building a canadian compiler, do nothing
    61     # In case we're not bare metal, and we're NPTL, build the static core gcc.
    62     # In any other case, do nothing.
    63     case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
    64         y,*,*)  do_cc_core mode=static;;
    65         ,y,*)   ;;
    66         ,,nptl) do_cc_core mode=static;;
    67         *)      ;;
    68     esac
    69 }
    70 
    71 # Core gcc pass 2
    72 do_cc_core_pass_2() {
    73     # In case we're building for bare metal, do nothing, we already have
    74     # our compiler.
    75     # In case we're not bare metal and building a canadian compiler, do nothing
    76     # In case we're NPTL, build the shared core gcc and the target libgcc.
    77     # In any other case, build the static core gcc and, if using gcc-4.3+,
    78     # also build the target libgcc.
    79     case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
    80         y,*,*)
    81             if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
    82                 do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=yes build_staticlinked=yes build_manuals=yes
    83             else
    84                 do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=yes build_manuals=yes
    85             fi
    86             ;;
    87         ,y,*)   ;;
    88         ,,nptl)
    89             do_cc_core mode=shared build_libgcc=yes
    90             ;;
    91         ,,win32)
    92             do_cc_core mode=static build_libgcc=yes
    93             ;;
    94         *)  if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
    95                 do_cc_core mode=static build_libgcc=yes
    96             else
    97                 do_cc_core mode=static
    98             fi
    99             ;;
   100     esac
   101 }
   102 
   103 #------------------------------------------------------------------------------
   104 # Build core gcc
   105 # This function is used to build both the static and the shared core C conpiler,
   106 # with or without the target libgcc. We need to know wether:
   107 #  - we're building static, shared or bare metal: mode=[static|shared|baremetal]
   108 #  - we need to build libgcc or not             : build_libgcc=[yes|no]       (default: no)
   109 #  - we need to build libstdc++ or not          : build_libstdcxx=[yes|no]    (default: no)
   110 #  - we need to build statically linked or not  : build_staticlinked=[yes|no] (default: no)
   111 # Usage: do_cc_core mode=[static|shared|baremetal] build_libgcc=[yes|no] build_staticlinked=[yes|no]
   112 do_cc_core() {
   113     local mode
   114     local build_libgcc=no
   115     local build_libstdcxx=no
   116     local build_staticlinked=no
   117     local build_manuals=no
   118     local core_prefix_dir
   119     local lang_opt
   120     local tmp
   121     local -a host_libstdcxx_flags
   122     local -a extra_config
   123     local -a core_LDFLAGS
   124     local -a core_targets
   125 
   126     while [ $# -ne 0 ]; do
   127         eval "${1// /\\ }"
   128         shift
   129     done
   130 
   131     lang_opt=c
   132     case "${mode}" in
   133         static)
   134             core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
   135             extra_config+=("--with-newlib")
   136             extra_config+=("--enable-threads=no")
   137             extra_config+=("--disable-shared")
   138             copy_headers=y  # For baremetal, as there's no headers to copy,
   139                             # we copy an empty directory. So, who cares?
   140             ;;
   141         shared)
   142             core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
   143             extra_config+=("--enable-shared")
   144             copy_headers=y
   145             ;;
   146         baremetal)
   147             core_prefix_dir="${CT_PREFIX_DIR}"
   148             extra_config+=("--with-newlib")
   149             extra_config+=("--enable-threads=no")
   150             extra_config+=("--disable-shared")
   151             [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
   152             copy_headers=n
   153             ;;
   154         *)
   155             CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
   156             ;;
   157     esac
   158 
   159     CT_DoStep INFO "Installing ${mode} core C compiler"
   160     mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
   161     cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
   162 
   163     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   164         # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
   165         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   166         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   167     fi
   168 
   169     if [ "${copy_headers}" = "y" ]; then
   170         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   171         CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${core_prefix_dir}/${CT_TARGET}/include"
   172     fi
   173 
   174     CT_DoLog EXTRA "Configuring ${mode} core C compiler"
   175 
   176     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   177         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   178         if [ -n "${tmp}" ]; then
   179             extra_config+=("${tmp}")
   180         fi
   181     done
   182     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   183         extra_config+=("--enable-__cxa_atexit")
   184     else
   185         extra_config+=("--disable-__cxa_atexit")
   186     fi
   187 
   188     # *** WARNING ! ***
   189     # Keep this full if-else-if-elif-fi-fi block in sync
   190     # with the same block in do_cc, below.
   191     if [ "${build_staticlinked}" = "yes" ]; then
   192         core_LDFLAGS+=("-static")
   193         host_libstdcxx_flags+=("-static-libgcc")
   194         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   195         host_libstdcxx_flags+=("-lm")
   196         # Companion libraries are build static (eg !shared), so
   197         # the libstdc++ is not pulled automatically, although it
   198         # is needed. Shoe-horn it in our LDFLAGS
   199         # Ditto libm on some Fedora boxen
   200         core_LDFLAGS+=("-lstdc++")
   201         core_LDFLAGS+=("-lm")
   202     else
   203         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   204             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   205             # build script
   206             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   207             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   208             host_libstdcxx_flags+=("-static-libgcc")
   209             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   210             host_libstdcxx_flags+=("-lm")
   211         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   212             # When companion libraries are build static (eg !shared),
   213             # the libstdc++ is not pulled automatically, although it
   214             # is needed. Shoe-horn it in our LDFLAGS
   215             # Ditto libm on some Fedora boxen
   216             core_LDFLAGS+=("-lstdc++")
   217             core_LDFLAGS+=("-lm")
   218         fi
   219     fi
   220 
   221     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   222         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   223         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   224     fi
   225     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   226         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   227     fi
   228     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   229         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   230         # With PPL 0.11+, also pull libpwl if needed
   231         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   232             host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
   233             host_libstdcxx_flags+=("-lpwl")
   234         fi
   235         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   236     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   237         extra_config+=("--with-ppl=no")
   238         extra_config+=("--with-cloog=no")
   239     fi
   240     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   241         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   242         extra_config+=("--enable-lto")
   243     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   244         extra_config+=("--with-libelf=no")
   245         extra_config+=("--disable-lto")
   246     fi
   247 
   248     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   249         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   250     fi
   251 
   252     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   253         extra_config+=("--enable-target-optspace")
   254     fi
   255 
   256     case "${CT_CC_GCC_LDBL_128}" in
   257         y)  extra_config+=("--with-long-double-128");;
   258         m)  ;;
   259         "") extra_config+=("--without-long-double-128");;
   260     esac
   261 
   262     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   263         extra_config+=( --enable-linker-build-id )
   264     fi
   265 
   266     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   267         "") ;;
   268         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   269     esac
   270 
   271     case "${CT_ARCH}" in
   272         mips)
   273             case "${CT_CC_GCC_mips_llsc}" in
   274                 y)  extra_config+=( --with-llsc );;
   275                 m)  ;;
   276                 *)  extra_config+=( --without-llsc );;
   277             esac
   278             case "${CT_CC_GCC_mips_synci}" in
   279                 y)  extra_config+=( --with-synci );;
   280                 m)  ;;
   281                 *)  extra_config+=( --without-synci );;
   282             esac
   283             if [ "${CT_CC_GCC_mips_plt}" ]; then
   284                 extra_config+=( --with-mips-plt )
   285             fi
   286             ;; # ARCH is mips
   287     esac
   288 
   289     extra_config+=(--disable-libgomp)
   290     extra_config+=(--disable-libmudflap)
   291 
   292     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   293 
   294     [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ] && extra_config+=("--disable-libstdcxx-pch")
   295 
   296     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   297 
   298     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   299     CT_DoExecLog CFG                                \
   300     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   301     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   302     LDFLAGS="${core_LDFLAGS[*]}"                    \
   303     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   304         --build=${CT_BUILD}                         \
   305         --host=${CT_HOST}                           \
   306         --target=${CT_TARGET}                       \
   307         --prefix="${core_prefix_dir}"               \
   308         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   309         --disable-multilib                          \
   310         --disable-libmudflap                        \
   311         ${CC_CORE_SYSROOT_ARG}                      \
   312         "${extra_config[@]}"                        \
   313         --enable-languages="${lang_opt}"            \
   314         "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}"
   315 
   316     if [ "${build_libgcc}" = "yes" ]; then
   317         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   318         # gcc/config/t-libunwind so -lc is removed from the link for
   319         # libgcc_s.so, as we do not have a target -lc yet.
   320         # This is not as ugly as it appears to be ;-) All symbols get resolved
   321         # during the glibc build, and we provide a proper libgcc_s.so for the
   322         # cross toolchain during the final gcc build.
   323         #
   324         # As we cannot modify the source tree, nor override SHLIB_LC itself
   325         # during configure or make, we have to edit the resultant
   326         # gcc/libgcc.mk itself to remove -lc from the link.
   327         # This causes us to have to jump through some hoops...
   328         #
   329         # To produce libgcc.mk to edit we firstly require libiberty.a,
   330         # so we configure then build it.
   331         # Next we have to configure gcc, create libgcc.mk then edit it...
   332         # So much easier if we just edit the source tree, but hey...
   333         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   334             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libiberty
   335             CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
   336             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp
   337             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
   338         else
   339             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp configure-build-libiberty
   340             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
   341         fi
   342         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   343         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   344             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libdecnumber
   345             CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
   346         fi
   347 
   348         # Starting with GCC 4.3, libgcc.mk is no longer built,
   349         # and libgcc.mvars is used instead.
   350 
   351         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   352             libgcc_rule="libgcc.mvars"
   353             core_targets=( gcc target-libgcc )
   354         else
   355             libgcc_rule="libgcc.mk"
   356             core_targets=( gcc )
   357         fi
   358 
   359         # On bare metal and canadian build the host-compiler is used when
   360         # actually the build-system compiler is required. Choose the correct
   361         # compilers for canadian build and use the defaults on other
   362         # configurations.
   363         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   364             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   365                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   366         else
   367             repair_cc=""
   368         fi
   369 
   370         CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
   371                               ${repair_cc}
   372         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   373     else # build_libgcc
   374         core_targets=( gcc )
   375     fi   # ! build libgcc
   376     if [    "${build_libstdcxx}" = "yes"    \
   377          -a "${CT_CC_LANG_CXX}"  = "y"      \
   378        ]; then
   379         core_targets+=( target-libstdc++-v3 )
   380     fi
   381 
   382     CT_DoLog EXTRA "Building ${mode} core C compiler"
   383     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
   384 
   385     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   386     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/install-}"
   387 
   388     if [ "${CT_BUILD_MANUALS}" = "y" -a "${build_manuals}" = "yes" ]; then
   389         CT_DoLog EXTRA "Building the GCC manuals"
   390         CT_DoExecLog ALL make pdf html
   391         CT_DoLog EXTRA "Installing the GCC manuals"
   392         CT_DoExecLog ALL make install-{pdf,html}-gcc
   393     fi
   394 
   395     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   396     # to call the C compiler with the same, somewhat canonical name.
   397     # check whether compiler has an extension
   398     file="$( ls -1 "${core_prefix_dir}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   399     [ -z "${file}" ] || ext=".${file##*.}"
   400     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${core_prefix_dir}/bin/${CT_TARGET}-cc${ext}"
   401 
   402     CT_EndStep
   403 }
   404 
   405 #------------------------------------------------------------------------------
   406 # Build final gcc
   407 do_cc() {
   408     local -a host_libstdcxx_flags
   409     local -a extra_config
   410     local -a final_LDFLAGS
   411     local tmp
   412 
   413     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   414     [ "${CT_BARE_METAL}" = "y" ] && return 0
   415 
   416     CT_DoStep INFO "Installing final compiler"
   417 
   418     mkdir -p "${CT_BUILD_DIR}/build-cc"
   419     cd "${CT_BUILD_DIR}/build-cc"
   420 
   421     CT_DoLog EXTRA "Configuring final compiler"
   422 
   423     # Enable selected languages
   424     lang_opt="c"
   425     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   426     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   427     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   428     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   429     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   430     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   431     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   432     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   433     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   434     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   435     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   436 
   437     extra_config+=("--enable-languages=${lang_opt}")
   438     extra_config+=("--disable-multilib")
   439     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   440         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   441         if [ -n "${tmp}" ]; then
   442             extra_config+=("${tmp}")
   443         fi
   444     done
   445 
   446     [ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared")
   447     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   448         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   449         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   450     fi
   451     case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
   452         y)  extra_config+=("--enable-sjlj-exceptions");;
   453         m)  ;;
   454         "") extra_config+=("--disable-sjlj-exceptions");;
   455     esac
   456     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   457         extra_config+=("--enable-__cxa_atexit")
   458     else
   459         extra_config+=("--disable-__cxa_atexit")
   460     fi
   461     if [ -n "${CT_CC_ENABLE_CXX_FLAGS}" ]; then
   462         extra_config+=("--enable-cxx-flags=${CT_CC_ENABLE_CXX_FLAGS}")
   463     fi
   464     if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
   465         extra_config+=(--enable-libmudflap)
   466     else
   467         extra_config+=(--disable-libmudflap)
   468     fi
   469     if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
   470         extra_config+=(--enable-libgomp)
   471     else
   472         extra_config+=(--disable-libgomp)
   473     fi
   474     if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
   475         extra_config+=(--enable-libssp)
   476     else
   477         extra_config+=(--disable-libssp)
   478     fi
   479 
   480     # *** WARNING ! ***
   481     # Keep this full if-else-if-elif-fi-fi block in sync
   482     # with the same block in do_cc_core, above.
   483     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   484         final_LDFLAGS+=("-static")
   485         host_libstdcxx_flags+=("-static-libgcc")
   486         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   487         host_libstdcxx_flags+=("-lm")
   488         # Companion libraries are build static (eg !shared), so
   489         # the libstdc++ is not pulled automatically, although it
   490         # is needed. Shoe-horn it in our LDFLAGS
   491         # Ditto libm on some Fedora boxen
   492         final_LDFLAGS+=("-lstdc++")
   493         final_LDFLAGS+=("-lm")
   494     else
   495         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   496             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   497             # build script
   498             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   499             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   500             host_libstdcxx_flags+=("-static-libgcc")
   501             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   502             host_libstdcxx_flags+=("-lm")
   503         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   504             # When companion libraries are build static (eg !shared),
   505             # the libstdc++ is not pulled automatically, although it
   506             # is needed. Shoe-horn it in our LDFLAGS
   507             # Ditto libm on some Fedora boxen
   508             final_LDFLAGS+=("-lstdc++")
   509             final_LDFLAGS+=("-lm")
   510         fi
   511     fi
   512 
   513     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   514         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   515         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   516     fi
   517     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   518         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   519     fi
   520     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   521         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   522         # With PPL 0.11+, also pull libpwl if needed
   523         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   524             host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
   525             host_libstdcxx_flags+=("-lpwl")
   526         fi
   527         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   528     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   529         extra_config+=("--with-ppl=no")
   530         extra_config+=("--with-cloog=no")
   531     fi
   532     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   533         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   534     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   535         extra_config+=("--with-libelf=no")
   536     fi
   537 
   538     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   539         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   540     fi
   541 
   542     if [ "${CT_THREADS}" = "none" ]; then
   543         extra_config+=("--disable-threads")
   544         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   545             CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
   546             extra_config+=("--disable-libgomp")
   547         fi
   548     else
   549         if [ "${CT_THREADS}" = "win32" ]; then
   550             extra_config+=("--enable-threads=win32")
   551             extra_config+=("--disable-win32-registry")
   552         else
   553             extra_config+=("--enable-threads=posix")
   554         fi
   555     fi
   556 
   557     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   558         extra_config+=("--enable-target-optspace")
   559     fi
   560     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   561         extra_config+=("--disable-libstdcxx-pch")
   562     fi
   563 
   564     case "${CT_CC_GCC_LDBL_128}" in
   565         y)  extra_config+=("--with-long-double-128");;
   566         m)  ;;
   567         "") extra_config+=("--without-long-double-128");;
   568     esac
   569 
   570     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   571         extra_config+=( --enable-linker-build-id )
   572     fi
   573 
   574     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   575         "") ;;
   576         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   577     esac
   578 
   579     if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
   580         extra_config+=( --enable-plugin )
   581     fi
   582     if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
   583         extra_config+=( --enable-gold )
   584     fi
   585 
   586     case "${CT_ARCH}" in
   587         mips)
   588             case "${CT_CC_GCC_mips_llsc}" in
   589                 y)  extra_config+=( --with-llsc );;
   590                 m)  ;;
   591                 *)  extra_config+=( --without-llsc );;
   592             esac
   593             case "${CT_CC_GCC_mips_synci}" in
   594                 y)  extra_config+=( --with-synci );;
   595                 m)  ;;
   596                 *)  extra_config+=( --without-synci );;
   597             esac
   598             if [ "${CT_CC_GCC_mips_plt}" ]; then
   599                 extra_config+=( --with-mips-plt )
   600             fi
   601             ;; # ARCH is mips
   602     esac
   603 
   604     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   605 
   606     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   607 
   608     CT_DoExecLog CFG                                \
   609     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   610     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   611     LDFLAGS="${final_LDFLAGS[*]}"                   \
   612     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   613     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   614     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   615     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   616         --build=${CT_BUILD}                         \
   617         --host=${CT_HOST}                           \
   618         --target=${CT_TARGET}                       \
   619         --prefix="${CT_PREFIX_DIR}"                 \
   620         ${CC_SYSROOT_ARG}                           \
   621         "${extra_config[@]}"                        \
   622         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   623         --enable-c99                                \
   624         --enable-long-long                          \
   625         "${CT_CC_EXTRA_CONFIG_ARRAY[@]}"
   626 
   627     if [ "${CT_CANADIAN}" = "y" ]; then
   628         CT_DoLog EXTRA "Building libiberty"
   629         CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
   630     fi
   631 
   632     CT_DoLog EXTRA "Building final compiler"
   633     CT_DoExecLog ALL make ${JOBSFLAGS} all
   634 
   635     CT_DoLog EXTRA "Installing final compiler"
   636     CT_DoExecLog ALL make ${JOBSFLAGS} install
   637 
   638     if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   639         CT_DoLog EXTRA "Building the GCC manuals"
   640         CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
   641         CT_DoLog EXTRA "Installing the GCC manuals"
   642         CT_DoExecLog ALL make install-{pdf,html}-gcc
   643     fi
   644 
   645     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   646     # to call the C compiler with the same, somewhat canonical name.
   647     # check whether compiler has an extension
   648     file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   649     [ -z "${file}" ] || ext=".${file##*.}"
   650     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   651 
   652     CT_EndStep
   653 }