scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Jan 03 22:57:25 2012 +0100 (2012-01-03)
changeset 2936 2dfea349d307
parent 2935 4a563f872440
child 2980 150402ee5468
child 3002 56e4a47dcf88
permissions -rw-r--r--
cc/gcc: build core compilers for canadian

Currently, we rely on an existing external cross-compiler targetting
the target, to build the C library.

This can pause quite a few problems if that compiler is different from
the one we are building, because it could introduce some ABI issues.

This patch removes this dependency, by building the core compilers
as we do for standard cross, and also by building the binutils and
gcc, for running on the build machine.

This means we no longer need to offer the cross-sompiler selection in
the menuconfig.

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 # This function builds up the set of languages to enable
    57 # No argument expected, returns the comma-separated language list on stdout
    58 cc_gcc_lang_list() {
    59     local lang_list
    60 
    61     lang_list="c"
    62     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_list+=",c++"
    63     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_list+=",fortran"
    64     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_list+=",ada"
    65     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_list+=",java"
    66     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_list+=",objc"
    67     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_list+=",obj-c++"
    68     lang_list+="${CT_CC_LANG_OTHERS:+,${CT_CC_LANG_OTHERS}}"
    69 
    70     printf "%s" "${lang_list}"
    71 }
    72 
    73 #------------------------------------------------------------------------------
    74 # Core gcc pass 1
    75 do_cc_core_pass_1() {
    76     local -a core_opts
    77     local do_core
    78 
    79     # We only need a pass-1 core gcc if the threading model is NPTL.
    80     # For all other cases, it is not used.
    81     case "${CT_THREADS}" in
    82         nptl)
    83             do_core=y
    84             core_opts+=( "mode=static" )
    85             core_opts+=( "host=${CT_BUILD}" )
    86             core_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
    87             core_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
    88             core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
    89             core_opts+=( "lang_list=c" )
    90             ;;
    91     esac
    92 
    93     if [ "${do_core}" = "y" ]; then
    94         CT_DoStep INFO "Installing pass-1 core C compiler"
    95         CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-core-pass-1"
    96 
    97         do_cc_core_backend "${core_opts[@]}"
    98 
    99         CT_Popd
   100         CT_EndStep
   101     fi
   102 }
   103 
   104 # Core gcc pass 2
   105 do_cc_core_pass_2() {
   106     local -a core_opts
   107     local do_core
   108 
   109     # Common options:
   110     core_opts+=( "host=${CT_BUILD}" )
   111     core_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
   112     core_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
   113     core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
   114     core_opts+=( "lang_list=c" )
   115 
   116     # Different conditions are at stake here:
   117     #   - In case the threading model is NPTL, we need a shared-capable core
   118     #     gcc; in all other cases, we need a static-only core gcc.
   119     #   - In case the threading model is NPTL or win32, or gcc is 4.3 or
   120     #     later, we need to build libgcc
   121     case "${CT_THREADS}" in
   122         nptl)
   123             do_core=y
   124             core_opts+=( "mode=shared" )
   125             core_opts+=( "build_libgcc=yes" )
   126             ;;
   127         win32)
   128             do_core=y
   129             core_opts+=( "mode=static" )
   130             core_opts+=( "build_libgcc=yes" )
   131             ;;
   132         *)
   133             do_core=y
   134             core_opts+=( "mode=static" )
   135             if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   136                 core_opts+=( "build_libgcc=yes" )
   137             fi
   138             ;;
   139     esac
   140 
   141     if [ "${do_core}" = "y" ]; then
   142         CT_DoStep INFO "Installing pass-2 core C compiler"
   143         CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-core-pass-2"
   144 
   145         do_cc_core_backend "${core_opts[@]}"
   146 
   147         CT_Popd
   148         CT_EndStep
   149     fi
   150 }
   151 
   152 #------------------------------------------------------------------------------
   153 # Build core gcc
   154 # This function is used to build the core C compiler.
   155 # Usage: do_cc_core_backend param=value [...]
   156 #   Parameter           : Definition                                : Type      : Default
   157 #   mode                : build a 'static', 'shared' or 'baremetal' : string    : (none)
   158 #   host                : the machine the core will run on          : tuple     : (none)
   159 #   prefix              : dir prefix to install into                : dir       : (none)
   160 #   complibs            : dir where complibs are isntalled          : dir       : (none)
   161 #   lang_list           : the list of languages to build            : string    : (empty)
   162 #   build_libgcc        : build libgcc or not                       : bool      : no
   163 #   build_libstdcxx     : build libstdc++ or not                    : bool      : no
   164 #   build_staticlinked  : build statically linked or not            : bool      : no
   165 #   build_manuals       : whether to build manuals or not           : bool      : no
   166 #   cflags              : host CFLAGS to use                        : string    : (empty)
   167 # Usage: do_cc_core_backend mode=[static|shared|baremetal] build_libgcc=[yes|no] build_staticlinked=[yes|no]
   168 do_cc_core_backend() {
   169     local mode
   170     local build_libgcc=no
   171     local build_libstdcxx=no
   172     local build_staticlinked=no
   173     local build_manuals=no
   174     local host
   175     local prefix
   176     local complibs
   177     local lang_list
   178     local cflags
   179     local tmp
   180     local -a host_libstdcxx_flags
   181     local -a extra_config
   182     local -a core_LDFLAGS
   183     local -a core_targets
   184     local arg
   185 
   186     for arg in "$@"; do
   187         eval "${arg// /\\ }"
   188     done
   189 
   190     CT_DoLog EXTRA "Configuring core C compiler"
   191 
   192     case "${mode}" in
   193         static)
   194             extra_config+=("--with-newlib")
   195             extra_config+=("--enable-threads=no")
   196             extra_config+=("--disable-shared")
   197             copy_headers=y  # For baremetal, as there's no headers to copy,
   198                             # we copy an empty directory. So, who cares?
   199             ;;
   200         shared)
   201             extra_config+=("--enable-shared")
   202             copy_headers=y
   203             ;;
   204         baremetal)
   205             extra_config+=("--with-newlib")
   206             extra_config+=("--enable-threads=no")
   207             extra_config+=("--disable-shared")
   208             copy_headers=n
   209             ;;
   210         *)
   211             CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
   212             ;;
   213     esac
   214 
   215     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   216         # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
   217         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   218         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   219     fi
   220 
   221     if [ "${copy_headers}" = "y" ]; then
   222         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   223         CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${prefix}/${CT_TARGET}/include"
   224     fi
   225 
   226     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   227         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   228         if [ -n "${tmp}" ]; then
   229             extra_config+=("${tmp}")
   230         fi
   231     done
   232     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   233         extra_config+=("--enable-__cxa_atexit")
   234     else
   235         extra_config+=("--disable-__cxa_atexit")
   236     fi
   237 
   238     # *** WARNING ! ***
   239     # Keep this full if-else-if-elif-fi-fi block in sync
   240     # with the same block in do_cc, below.
   241     if [ "${build_staticlinked}" = "yes" ]; then
   242         core_LDFLAGS+=("-static")
   243         host_libstdcxx_flags+=("-static-libgcc")
   244         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   245         host_libstdcxx_flags+=("-lm")
   246         # Companion libraries are build static (eg !shared), so
   247         # the libstdc++ is not pulled automatically, although it
   248         # is needed. Shoe-horn it in our LDFLAGS
   249         # Ditto libm on some Fedora boxen
   250         core_LDFLAGS+=("-lstdc++")
   251         core_LDFLAGS+=("-lm")
   252     else
   253         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   254             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   255             # build script
   256             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   257             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   258             host_libstdcxx_flags+=("-static-libgcc")
   259             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   260             host_libstdcxx_flags+=("-lm")
   261         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   262             # When companion libraries are build static (eg !shared),
   263             # the libstdc++ is not pulled automatically, although it
   264             # is needed. Shoe-horn it in our LDFLAGS
   265             # Ditto libm on some Fedora boxen
   266             core_LDFLAGS+=("-lstdc++")
   267             core_LDFLAGS+=("-lm")
   268         fi
   269     fi
   270 
   271     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   272         extra_config+=("--with-gmp=${complibs}")
   273         extra_config+=("--with-mpfr=${complibs}")
   274     fi
   275     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   276         extra_config+=("--with-mpc=${complibs}")
   277     fi
   278     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   279         extra_config+=("--with-ppl=${complibs}")
   280         # With PPL 0.11+, also pull libpwl if needed
   281         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   282             host_libstdcxx_flags+=("-L${complibs}/lib")
   283             host_libstdcxx_flags+=("-lpwl")
   284         fi
   285         extra_config+=("--with-cloog=${complibs}")
   286     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   287         extra_config+=("--with-ppl=no")
   288         extra_config+=("--with-cloog=no")
   289     fi
   290     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   291         extra_config+=("--with-libelf=${complibs}")
   292         extra_config+=("--enable-lto")
   293     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   294         extra_config+=("--with-libelf=no")
   295         extra_config+=("--disable-lto")
   296     fi
   297 
   298     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   299         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   300     fi
   301 
   302     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   303         extra_config+=("--enable-target-optspace")
   304     fi
   305 
   306     case "${CT_CC_GCC_LDBL_128}" in
   307         y)  extra_config+=("--with-long-double-128");;
   308         m)  ;;
   309         "") extra_config+=("--without-long-double-128");;
   310     esac
   311 
   312     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   313         extra_config+=( --enable-linker-build-id )
   314     fi
   315 
   316     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   317         "") ;;
   318         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   319     esac
   320 
   321     case "${CT_ARCH}" in
   322         mips)
   323             case "${CT_CC_GCC_mips_llsc}" in
   324                 y)  extra_config+=( --with-llsc );;
   325                 m)  ;;
   326                 *)  extra_config+=( --without-llsc );;
   327             esac
   328             case "${CT_CC_GCC_mips_synci}" in
   329                 y)  extra_config+=( --with-synci );;
   330                 m)  ;;
   331                 *)  extra_config+=( --without-synci );;
   332             esac
   333             if [ "${CT_CC_GCC_mips_plt}" ]; then
   334                 extra_config+=( --with-mips-plt )
   335             fi
   336             ;; # ARCH is mips
   337     esac
   338 
   339     extra_config+=(--disable-libgomp)
   340     extra_config+=(--disable-libmudflap)
   341 
   342     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   343 
   344     [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ] && extra_config+=("--disable-libstdcxx-pch")
   345 
   346     if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
   347         extra_config+=("--with-system-zlib")
   348     fi
   349 
   350     if [ "${CT_MULTILIB}" = "y" ]; then
   351         extra_config+=("--enable-multilib")
   352     else
   353         extra_config+=("--disable-multilib")
   354     fi
   355 
   356     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   357 
   358     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   359     CT_DoExecLog CFG                                \
   360     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   361     CFLAGS="${cflags}"                              \
   362     LDFLAGS="${core_LDFLAGS[*]}"                    \
   363     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   364         --build=${CT_BUILD}                         \
   365         --host=${host}                              \
   366         --target=${CT_TARGET}                       \
   367         --prefix="${prefix}"                        \
   368         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   369         --disable-libmudflap                        \
   370         ${CC_CORE_SYSROOT_ARG}                      \
   371         "${extra_config[@]}"                        \
   372         --enable-languages="${lang_list}"           \
   373         "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}"
   374 
   375     if [ "${build_libgcc}" = "yes" ]; then
   376         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   377         # gcc/config/t-libunwind so -lc is removed from the link for
   378         # libgcc_s.so, as we do not have a target -lc yet.
   379         # This is not as ugly as it appears to be ;-) All symbols get resolved
   380         # during the glibc build, and we provide a proper libgcc_s.so for the
   381         # cross toolchain during the final gcc build.
   382         #
   383         # As we cannot modify the source tree, nor override SHLIB_LC itself
   384         # during configure or make, we have to edit the resultant
   385         # gcc/libgcc.mk itself to remove -lc from the link.
   386         # This causes us to have to jump through some hoops...
   387         #
   388         # To produce libgcc.mk to edit we firstly require libiberty.a,
   389         # so we configure then build it.
   390         # Next we have to configure gcc, create libgcc.mk then edit it...
   391         # So much easier if we just edit the source tree, but hey...
   392         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   393             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libiberty
   394             CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
   395             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp
   396             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
   397         else
   398             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp configure-build-libiberty
   399             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
   400         fi
   401         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   402         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   403             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libdecnumber
   404             CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
   405         fi
   406 
   407         # Starting with GCC 4.3, libgcc.mk is no longer built,
   408         # and libgcc.mvars is used instead.
   409 
   410         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   411             libgcc_rule="libgcc.mvars"
   412             core_targets=( gcc target-libgcc )
   413         else
   414             libgcc_rule="libgcc.mk"
   415             core_targets=( gcc )
   416         fi
   417 
   418         # On bare metal and canadian build the host-compiler is used when
   419         # actually the build-system compiler is required. Choose the correct
   420         # compilers for canadian build and use the defaults on other
   421         # configurations.
   422         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   423             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   424                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   425         else
   426             repair_cc=""
   427         fi
   428 
   429         CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
   430                               ${repair_cc}
   431         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   432     else # build_libgcc
   433         core_targets=( gcc )
   434     fi   # ! build libgcc
   435     if [    "${build_libstdcxx}" = "yes"    \
   436          -a "${CT_CC_LANG_CXX}"  = "y"      \
   437        ]; then
   438         core_targets+=( target-libstdc++-v3 )
   439     fi
   440 
   441     CT_DoLog EXTRA "Building core C compiler"
   442     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
   443 
   444     CT_DoLog EXTRA "Installing core C compiler"
   445     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/install-}"
   446 
   447     if [ "${build_manuals}" = "yes" ]; then
   448         CT_DoLog EXTRA "Building the GCC manuals"
   449         CT_DoExecLog ALL make pdf html
   450         CT_DoLog EXTRA "Installing the GCC manuals"
   451         CT_DoExecLog ALL make install-{pdf,html}-gcc
   452     fi
   453 
   454     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   455     # to call the C compiler with the same, somewhat canonical name.
   456     # check whether compiler has an extension
   457     file="$( ls -1 "${prefix}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   458     [ -z "${file}" ] || ext=".${file##*.}"
   459     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}"
   460 
   461     if [ "${CT_MULTILIB}" = "y" ]; then
   462         multilibs=( $( "${prefix}/bin/${CT_TARGET}-gcc" -print-multi-lib   \
   463                        |tail -n +2 ) )
   464         if [ ${#multilibs[@]} -ne 0 ]; then
   465             CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
   466             for i in "${multilibs[@]}"; do
   467                 dir="${i%%;*}"
   468                 flags="${i#*;}"
   469                 CT_DoLog EXTRA "   ${flags//@/ -}  -->  ${dir}/"
   470             done
   471         else
   472             CT_DoLog WARN "gcc configured for multilib, but none available"
   473         fi
   474     fi
   475 }
   476 
   477 #------------------------------------------------------------------------------
   478 # Build complete gcc to run on build
   479 do_cc_for_build() {
   480     local -a build_final_opts
   481     local build_final_backend
   482 
   483     # In case we're canadian or cross-native, it seems that a
   484     # real, complete compiler is needed?!? WTF? Sigh...
   485     # Otherwise, there is nothing to do.
   486     case "${CT_TOOLCHAIN_TYPE}" in
   487         native|cross)   return 0;;
   488     esac
   489 
   490     build_final_opts+=( "host=${CT_BUILD}" )
   491     build_final_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
   492     build_final_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
   493     build_final_opts+=( "lang_list=$( cc_gcc_lang_list )" )
   494     if [ "${CT_BARE_METAL}" = "y" ]; then
   495         # In the tests I've done, bare-metal was not impacted by the
   496         # lack of such a compiler, but better safe than sorry...
   497         build_final_opts+=( "mode=baremetal" )
   498         build_final_opts+=( "build_libgcc=yes" )
   499         build_final_opts+=( "build_libstdcxx=yes" )
   500         if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   501             build_final_opts+=( "build_staticlinked=yes" )
   502         fi
   503         build_final_backend=do_cc_core_backend
   504     else
   505         build_final_backend=do_cc_backend
   506     fi
   507 
   508     CT_DoStep INFO "Installing final compiler for build"
   509     CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final-build-${CT_BUILD}"
   510 
   511     "${build_final_backend}" "${build_final_opts[@]}"
   512 
   513     CT_Popd
   514     CT_EndStep
   515 }
   516 
   517 #------------------------------------------------------------------------------
   518 # Build final gcc to run on host
   519 do_cc_for_host() {
   520     local -a final_opts
   521     local final_backend
   522 
   523     final_opts+=( "host=${CT_HOST}" )
   524     final_opts+=( "prefix=${CT_PREFIX_DIR}" )
   525     final_opts+=( "complibs=${CT_HOST_COMPLIBS_DIR}" )
   526     final_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
   527     final_opts+=( "lang_list=$( cc_gcc_lang_list )" )
   528     if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   529         final_opts+=( "build_manuals=yes" )
   530     fi
   531     if [ "${CT_BARE_METAL}" = "y" ]; then
   532         final_opts+=( "mode=baremetal" )
   533         final_opts+=( "build_libgcc=yes" )
   534         final_opts+=( "build_libstdcxx=yes" )
   535         if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   536             final_opts+=( "build_staticlinked=yes" )
   537         fi
   538         final_backend=do_cc_core_backend
   539     else
   540         final_backend=do_cc_backend
   541     fi
   542 
   543     CT_DoStep INFO "Installing final compiler"
   544     CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final"
   545 
   546     "${final_backend}" "${final_opts[@]}"
   547 
   548     CT_Popd
   549     CT_EndStep
   550 }
   551 
   552 #------------------------------------------------------------------------------
   553 # Build the final gcc
   554 # Usage: do_cc_backend param=value [...]
   555 #   Parameter     : Definition                          : Type      : Default
   556 #   host          : the host we run onto                : tuple     : (none)
   557 #   prefix        : the runtime prefix                  : dir       : (none)
   558 #   complibs      : the companion libraries prefix      : dir       : (none)
   559 #   cflags        : the host CFLAGS                     : string    : (empty)
   560 #   lang_list     : the list of languages to build      : string    : (empty)
   561 #   build_manuals : whether to build manuals or not     : bool      : no
   562 do_cc_backend() {
   563     local host
   564     local prefix
   565     local complibs
   566     local cflags
   567     local lang_list
   568     local build_manuals
   569     local -a host_libstdcxx_flags
   570     local -a extra_config
   571     local -a final_LDFLAGS
   572     local tmp
   573     local arg
   574 
   575     for arg in "$@"; do
   576         eval "${arg// /\\ }"
   577     done
   578 
   579     CT_DoLog EXTRA "Configuring final compiler"
   580 
   581     # Enable selected languages
   582     extra_config+=("--enable-languages=${lang_list}")
   583 
   584     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   585         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   586         if [ -n "${tmp}" ]; then
   587             extra_config+=("${tmp}")
   588         fi
   589     done
   590 
   591     [ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared")
   592     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   593         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   594         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   595     fi
   596     case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
   597         y)  extra_config+=("--enable-sjlj-exceptions");;
   598         m)  ;;
   599         "") extra_config+=("--disable-sjlj-exceptions");;
   600     esac
   601     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   602         extra_config+=("--enable-__cxa_atexit")
   603     else
   604         extra_config+=("--disable-__cxa_atexit")
   605     fi
   606     if [ -n "${CT_CC_ENABLE_CXX_FLAGS}" ]; then
   607         extra_config+=("--enable-cxx-flags=${CT_CC_ENABLE_CXX_FLAGS}")
   608     fi
   609     if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
   610         extra_config+=(--enable-libmudflap)
   611     else
   612         extra_config+=(--disable-libmudflap)
   613     fi
   614     if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
   615         extra_config+=(--enable-libgomp)
   616     else
   617         extra_config+=(--disable-libgomp)
   618     fi
   619     if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
   620         extra_config+=(--enable-libssp)
   621     else
   622         extra_config+=(--disable-libssp)
   623     fi
   624 
   625     # *** WARNING ! ***
   626     # Keep this full if-else-if-elif-fi-fi block in sync
   627     # with the same block in do_cc_core, above.
   628     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   629         final_LDFLAGS+=("-static")
   630         host_libstdcxx_flags+=("-static-libgcc")
   631         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   632         host_libstdcxx_flags+=("-lm")
   633         # Companion libraries are build static (eg !shared), so
   634         # the libstdc++ is not pulled automatically, although it
   635         # is needed. Shoe-horn it in our LDFLAGS
   636         # Ditto libm on some Fedora boxen
   637         final_LDFLAGS+=("-lstdc++")
   638         final_LDFLAGS+=("-lm")
   639     else
   640         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   641             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   642             # build script
   643             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   644             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   645             host_libstdcxx_flags+=("-static-libgcc")
   646             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   647             host_libstdcxx_flags+=("-lm")
   648         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   649             # When companion libraries are build static (eg !shared),
   650             # the libstdc++ is not pulled automatically, although it
   651             # is needed. Shoe-horn it in our LDFLAGS
   652             # Ditto libm on some Fedora boxen
   653             final_LDFLAGS+=("-lstdc++")
   654             final_LDFLAGS+=("-lm")
   655         fi
   656     fi
   657 
   658     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   659         extra_config+=("--with-gmp=${complibs}")
   660         extra_config+=("--with-mpfr=${complibs}")
   661     fi
   662     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   663         extra_config+=("--with-mpc=${complibs}")
   664     fi
   665     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   666         extra_config+=("--with-ppl=${complibs}")
   667         # With PPL 0.11+, also pull libpwl if needed
   668         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   669             host_libstdcxx_flags+=("-L${complibs}/lib")
   670             host_libstdcxx_flags+=("-lpwl")
   671         fi
   672         extra_config+=("--with-cloog=${complibs}")
   673     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   674         extra_config+=("--with-ppl=no")
   675         extra_config+=("--with-cloog=no")
   676     fi
   677     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   678         extra_config+=("--with-libelf=${complibs}")
   679     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   680         extra_config+=("--with-libelf=no")
   681     fi
   682 
   683     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   684         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   685     fi
   686 
   687     if [ "${CT_THREADS}" = "none" ]; then
   688         extra_config+=("--disable-threads")
   689         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   690             CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
   691             extra_config+=("--disable-libgomp")
   692         fi
   693     else
   694         if [ "${CT_THREADS}" = "win32" ]; then
   695             extra_config+=("--enable-threads=win32")
   696             extra_config+=("--disable-win32-registry")
   697         else
   698             extra_config+=("--enable-threads=posix")
   699         fi
   700     fi
   701 
   702     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   703         extra_config+=("--enable-target-optspace")
   704     fi
   705     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   706         extra_config+=("--disable-libstdcxx-pch")
   707     fi
   708 
   709     case "${CT_CC_GCC_LDBL_128}" in
   710         y)  extra_config+=("--with-long-double-128");;
   711         m)  ;;
   712         "") extra_config+=("--without-long-double-128");;
   713     esac
   714 
   715     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   716         extra_config+=( --enable-linker-build-id )
   717     fi
   718 
   719     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   720         "") ;;
   721         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   722     esac
   723 
   724     if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
   725         extra_config+=( --enable-plugin )
   726     fi
   727     if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
   728         extra_config+=( --enable-gold )
   729     fi
   730 
   731     case "${CT_ARCH}" in
   732         mips)
   733             case "${CT_CC_GCC_mips_llsc}" in
   734                 y)  extra_config+=( --with-llsc );;
   735                 m)  ;;
   736                 *)  extra_config+=( --without-llsc );;
   737             esac
   738             case "${CT_CC_GCC_mips_synci}" in
   739                 y)  extra_config+=( --with-synci );;
   740                 m)  ;;
   741                 *)  extra_config+=( --without-synci );;
   742             esac
   743             if [ "${CT_CC_GCC_mips_plt}" ]; then
   744                 extra_config+=( --with-mips-plt )
   745             fi
   746             ;; # ARCH is mips
   747     esac
   748 
   749     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   750 
   751     if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
   752         extra_config+=("--with-system-zlib")
   753     fi
   754 
   755     if [ "${CT_MULTILIB}" = "y" ]; then
   756         extra_config+=("--enable-multilib")
   757     else
   758         extra_config+=("--disable-multilib")
   759     fi
   760 
   761     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   762 
   763     CT_DoExecLog CFG                                \
   764     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   765     CFLAGS="${cflags}"                              \
   766     LDFLAGS="${final_LDFLAGS[*]}"                   \
   767     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   768     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   769     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   770     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   771         --build=${CT_BUILD}                         \
   772         --host=${host}                              \
   773         --target=${CT_TARGET}                       \
   774         --prefix="${prefix}"                        \
   775         ${CC_SYSROOT_ARG}                           \
   776         "${extra_config[@]}"                        \
   777         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   778         --enable-c99                                \
   779         --enable-long-long                          \
   780         "${CT_CC_EXTRA_CONFIG_ARRAY[@]}"
   781 
   782     if [ "${CT_CANADIAN}" = "y" ]; then
   783         CT_DoLog EXTRA "Building libiberty"
   784         CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
   785     fi
   786 
   787     CT_DoLog EXTRA "Building final compiler"
   788     CT_DoExecLog ALL make ${JOBSFLAGS} all
   789 
   790     CT_DoLog EXTRA "Installing final compiler"
   791     CT_DoExecLog ALL make ${JOBSFLAGS} install
   792 
   793     if [ "${build_manuals}" = "yes" ]; then
   794         CT_DoLog EXTRA "Building the GCC manuals"
   795         CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
   796         CT_DoLog EXTRA "Installing the GCC manuals"
   797         CT_DoExecLog ALL make install-{pdf,html}-gcc
   798     fi
   799 
   800     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   801     # to call the C compiler with the same, somewhat canonical name.
   802     # check whether compiler has an extension
   803     file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   804     [ -z "${file}" ] || ext=".${file##*.}"
   805     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   806 
   807     if [ "${CT_MULTILIB}" = "y" ]; then
   808         multilibs=( $( "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc" -print-multi-lib \
   809                        |tail -n +2 ) )
   810         if [ ${#multilibs[@]} -ne 0 ]; then
   811             CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
   812             for i in "${multilibs[@]}"; do
   813                 dir="${i%%;*}"
   814                 flags="${i#*;}"
   815                 CT_DoLog EXTRA "   ${flags//@/ -}  -->  ${dir}/"
   816             done
   817         else
   818             CT_DoLog WARN "gcc configured for multilib, but none available"
   819         fi
   820     fi
   821 }