scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed May 18 23:00:46 2011 +0200 (2011-05-18)
changeset 2467 200836977ce6
parent 2466 b7df125a1c78
child 2475 62c563f492ec
permissions -rw-r--r--
config: rename variables that are arrays

Make it explicit that a variable is an array bu the name of the variable.
It will be used later when .config gets munged to allow both multiple
arguments and arguments with spaces at the same time to be passed from the
configuration down to the build scripts.

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
    83             else
    84                 do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=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 core_prefix_dir
   118     local lang_opt
   119     local tmp
   120     local -a host_libstdcxx_flags
   121     local -a extra_config
   122     local -a core_LDFLAGS
   123     local -a core_targets
   124 
   125     while [ $# -ne 0 ]; do
   126         eval "${1}"
   127         shift
   128     done
   129 
   130     lang_opt=c
   131     case "${mode}" in
   132         static)
   133             core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
   134             extra_config+=("--with-newlib")
   135             extra_config+=("--enable-threads=no")
   136             extra_config+=("--disable-shared")
   137             copy_headers=y  # For baremetal, as there's no headers to copy,
   138                             # we copy an empty directory. So, who cares?
   139             ;;
   140         shared)
   141             core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
   142             extra_config+=("--enable-shared")
   143             copy_headers=y
   144             ;;
   145         baremetal)
   146             core_prefix_dir="${CT_PREFIX_DIR}"
   147             extra_config+=("--with-newlib")
   148             extra_config+=("--enable-threads=no")
   149             extra_config+=("--disable-shared")
   150             [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
   151             copy_headers=n
   152             ;;
   153         *)
   154             CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
   155             ;;
   156     esac
   157 
   158     CT_DoStep INFO "Installing ${mode} core C compiler"
   159     mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
   160     cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
   161 
   162     # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
   163     [ -n "${CT_CC_BUGURL}" ]     && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   164     [ -n "${CT_CC_PKGVERSION}" ] && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   165 
   166     if [ "${copy_headers}" = "y" ]; then
   167         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   168         CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${core_prefix_dir}/${CT_TARGET}/include"
   169     fi
   170 
   171     CT_DoLog EXTRA "Configuring ${mode} core C compiler"
   172 
   173     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   174         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   175         if [ -n "${tmp}" ]; then
   176             extra_config+=("${tmp}")
   177         fi
   178     done
   179     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   180         extra_config+=("--enable-__cxa_atexit")
   181     else
   182         extra_config+=("--disable-__cxa_atexit")
   183     fi
   184 
   185     # *** WARNING ! ***
   186     # Keep this full if-else-if-elif-fi-fi block in sync
   187     # with the same block in do_cc, below.
   188     if [ "${build_staticlinked}" = "yes" ]; then
   189         core_LDFLAGS+=("-static")
   190         host_libstdcxx_flags+=("-static-libgcc")
   191         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   192         host_libstdcxx_flags+=("-lm")
   193         # Companion libraries are build static (eg !shared), so
   194         # the libstdc++ is not pulled automatically, although it
   195         # is needed. Shoe-horn it in our LDFLAGS
   196         # Ditto libm on some Fedora boxen
   197         core_LDFLAGS+=("-lstdc++")
   198         core_LDFLAGS+=("-lm")
   199     else
   200         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   201             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   202             # build script
   203             # FIXME: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   204             # see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   205             host_libstdcxx_flags+=("-static-libgcc")
   206             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   207             host_libstdcxx_flags+=("-lm")
   208         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   209             # When companion libraries are build static (eg !shared),
   210             # the libstdc++ is not pulled automatically, although it
   211             # is needed. Shoe-horn it in our LDFLAGS
   212             # Ditto libm on some Fedora boxen
   213             core_LDFLAGS+=("-lstdc++")
   214             core_LDFLAGS+=("-lm")
   215         fi
   216     fi
   217 
   218     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   219         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   220         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   221     fi
   222     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   223         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   224     fi
   225     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   226         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   227         # With PPL 0.11+, also pull libpwl if needed
   228         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   229             host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
   230             host_libstdcxx_flags+=("-lpwl")
   231         fi
   232         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   233     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   234         extra_config+=("--with-ppl=no")
   235         extra_config+=("--with-cloog=no")
   236     fi
   237     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   238         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   239         extra_config+=("--enable-lto")
   240     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   241         extra_config+=("--with-libelf=no")
   242         extra_config+=("--disable-lto")
   243     fi
   244 
   245     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   246         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   247     fi
   248 
   249     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   250         extra_config+=("--enable-target-optspace")
   251     fi
   252 
   253     case "${CT_CC_GCC_LDBL_128}" in
   254         y)  extra_config+=("--with-long-double-128");;
   255         m)  ;;
   256         "") extra_config+=("--without-long-double-128");;
   257     esac
   258 
   259     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   260 
   261     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   262     CT_DoExecLog CFG                                \
   263     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   264     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   265     LDFLAGS="${core_LDFLAGS[*]}"                    \
   266     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   267         --build=${CT_BUILD}                         \
   268         --host=${CT_HOST}                           \
   269         --target=${CT_TARGET}                       \
   270         --prefix="${core_prefix_dir}"               \
   271         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   272         --disable-multilib                          \
   273         --disable-libmudflap                        \
   274         ${CC_CORE_SYSROOT_ARG}                      \
   275         "${extra_config[@]}"                        \
   276         --disable-nls                               \
   277         --enable-symvers=gnu                        \
   278         --enable-languages="${lang_opt}"            \
   279         "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}"
   280 
   281     if [ "${build_libgcc}" = "yes" ]; then
   282         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   283         # gcc/config/t-libunwind so -lc is removed from the link for
   284         # libgcc_s.so, as we do not have a target -lc yet.
   285         # This is not as ugly as it appears to be ;-) All symbols get resolved
   286         # during the glibc build, and we provide a proper libgcc_s.so for the
   287         # cross toolchain during the final gcc build.
   288         #
   289         # As we cannot modify the source tree, nor override SHLIB_LC itself
   290         # during configure or make, we have to edit the resultant
   291         # gcc/libgcc.mk itself to remove -lc from the link.
   292         # This causes us to have to jump through some hoops...
   293         #
   294         # To produce libgcc.mk to edit we firstly require libiberty.a,
   295         # so we configure then build it.
   296         # Next we have to configure gcc, create libgcc.mk then edit it...
   297         # So much easier if we just edit the source tree, but hey...
   298         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   299             CT_DoExecLog CFG make configure-libiberty
   300             CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
   301             CT_DoExecLog CFG make configure-gcc configure-libcpp
   302             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
   303         else
   304             CT_DoExecLog CFG make configure-gcc configure-libcpp configure-build-libiberty
   305             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
   306         fi
   307         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   308         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   309             CT_DoExecLog CFG make configure-libdecnumber
   310             CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
   311         fi
   312 
   313         # Starting with GCC 4.3, libgcc.mk is no longer built,
   314         # and libgcc.mvars is used instead.
   315 
   316         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   317             libgcc_rule="libgcc.mvars"
   318             core_targets=( gcc target-libgcc )
   319         else
   320             libgcc_rule="libgcc.mk"
   321             core_targets=( gcc )
   322         fi
   323 
   324         # On bare metal and canadian build the host-compiler is used when
   325         # actually the build-system compiler is required. Choose the correct
   326         # compilers for canadian build and use the defaults on other
   327         # configurations.
   328         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   329             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   330                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   331         else
   332             repair_cc=""
   333         fi
   334 
   335         CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
   336                               ${repair_cc}
   337         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   338     else # build_libgcc
   339         core_targets=( gcc )
   340     fi   # ! build libgcc
   341     if [    "${build_libstdcxx}" = "yes"    \
   342          -a "${CT_CC_LANG_CXX}"  = "y"      \
   343        ]; then
   344         core_targets+=( target-libstdc++-v3 )
   345     fi
   346 
   347     CT_DoLog EXTRA "Building ${mode} core C compiler"
   348     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
   349 
   350     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   351     CT_DoExecLog ALL make "${core_targets[@]/#/install-}"
   352 
   353     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   354     # to call the C compiler with the same, somewhat canonical name.
   355     # check whether compiler has an extension
   356     file="$( ls -1 "${core_prefix_dir}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   357     [ -z "${file}" ] || ext=".${file##*.}"
   358     CT_DoExecLog ALL ln -sv "${CT_TARGET}-gcc${ext}" "${core_prefix_dir}/bin/${CT_TARGET}-cc${ext}"
   359 
   360     CT_EndStep
   361 }
   362 
   363 #------------------------------------------------------------------------------
   364 # Build final gcc
   365 do_cc() {
   366     local -a host_libstdcxx_flags
   367     local -a extra_config
   368     local -a final_LDFLAGS
   369     local tmp
   370 
   371     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   372     [ "${CT_BARE_METAL}" = "y" ] && return 0
   373 
   374     CT_DoStep INFO "Installing final compiler"
   375 
   376     mkdir -p "${CT_BUILD_DIR}/build-cc"
   377     cd "${CT_BUILD_DIR}/build-cc"
   378 
   379     CT_DoLog EXTRA "Configuring final compiler"
   380 
   381     # Enable selected languages
   382     lang_opt="c"
   383     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   384     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   385     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   386     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   387     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   388     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   389     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   390     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   391     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   392     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   393     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   394 
   395     extra_config+=("--enable-languages=${lang_opt}")
   396     extra_config+=("--disable-multilib")
   397     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   398         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   399         if [ -n "${tmp}" ]; then
   400             extra_config+=("${tmp}")
   401         fi
   402     done
   403 
   404     [ "${CT_SHARED_LIBS}" = "y" ]                   || extra_config+=("--disable-shared")
   405     [ -n "${CT_CC_PKGVERSION}" ]                    && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   406     [ -n "${CT_CC_BUGURL}" ]                        && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   407     case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
   408         y)  extra_config+=("--enable-sjlj-exceptions");;
   409         m)  ;;
   410         "") extra_config+=("--disable-sjlj-exceptions");;
   411     esac
   412     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   413         extra_config+=("--enable-__cxa_atexit")
   414     else
   415         extra_config+=("--disable-__cxa_atexit")
   416     fi
   417     if [ -n "${CC_ENABLE_CXX_FLAGS}" ]; then
   418         extra_config+=("--enable-cxx-flags=${CC_ENABLE_CXX_FLAGS}")
   419     fi
   420     if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
   421         extra_config+=(--enable-libmudflap)
   422     else
   423         extra_config+=(--disable-libmudflap)
   424     fi
   425     if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
   426         extra_config+=(--enable-libgomp)
   427     else
   428         extra_config+=(--disable-libgomp)
   429     fi
   430     if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
   431         extra_config+=(--enable-libssp)
   432     else
   433         extra_config+=(--disable-libssp)
   434     fi
   435 
   436     # *** WARNING ! ***
   437     # Keep this full if-else-if-elif-fi-fi block in sync
   438     # with the same block in do_cc_core, above.
   439     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   440         final_LDFLAGS+=("-static")
   441         host_libstdcxx_flags+=("-static-libgcc")
   442         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   443         host_libstdcxx_flags+=("-lm")
   444         # Companion libraries are build static (eg !shared), so
   445         # the libstdc++ is not pulled automatically, although it
   446         # is needed. Shoe-horn it in our LDFLAGS
   447         # Ditto libm on some Fedora boxen
   448         final_LDFLAGS+=("-lstdc++")
   449         final_LDFLAGS+=("-lm")
   450     else
   451         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   452             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   453             # build script
   454             # FIXME: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   455             # see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   456             host_libstdcxx_flags+=("-static-libgcc")
   457             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   458             host_libstdcxx_flags+=("-lm")
   459         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   460             # When companion libraries are build static (eg !shared),
   461             # the libstdc++ is not pulled automatically, although it
   462             # is needed. Shoe-horn it in our LDFLAGS
   463             # Ditto libm on some Fedora boxen
   464             final_LDFLAGS+=("-lstdc++")
   465             final_LDFLAGS+=("-lm")
   466         fi
   467     fi
   468 
   469     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   470         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   471         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   472     fi
   473     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   474         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   475     fi
   476     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   477         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   478         # With PPL 0.11+, also pull libpwl if needed
   479         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   480             host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
   481             host_libstdcxx_flags+=("-lpwl")
   482         fi
   483         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   484     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   485         extra_config+=("--with-ppl=no")
   486         extra_config+=("--with-cloog=no")
   487     fi
   488     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   489         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   490     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   491         extra_config+=("--with-libelf=no")
   492     fi
   493 
   494     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   495         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   496     fi
   497 
   498     if [ "${CT_THREADS}" = "none" ]; then
   499         extra_config+=("--disable-threads")
   500         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   501             CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
   502             extra_config+=("--disable-libgomp")
   503         fi
   504     else
   505         if [ "${CT_THREADS}" = "win32" ]; then
   506             extra_config+=("--enable-threads=win32")
   507             extra_config+=("--disable-win32-registry")
   508         else
   509             extra_config+=("--enable-threads=posix")
   510         fi
   511     fi
   512 
   513     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   514         extra_config+=("--enable-target-optspace")
   515     fi
   516     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   517         extra_config+=("--disable-libstdcxx-pch")
   518     fi
   519 
   520     case "${CT_CC_GCC_LDBL_128}" in
   521         y)  extra_config+=("--with-long-double-128");;
   522         m)  ;;
   523         "") extra_config+=("--without-long-double-128");;
   524     esac
   525 
   526     if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
   527         extra_config+=( --enable-plugin )
   528     fi
   529     if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
   530         extra_config+=( --enable-gold )
   531     fi
   532 
   533     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   534 
   535     # --enable-symvers=gnu really only needed for sh4 to work around a
   536     # detection problem only matters for gcc-3.2.x and later, I think.
   537     # --disable-nls to work around crash bug on ppc405, but also because
   538     # embedded systems don't really need message catalogs...
   539     CT_DoExecLog CFG                                \
   540     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   541     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   542     LDFLAGS="${final_LDFLAGS[*]}"                   \
   543     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   544     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   545     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   546     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   547         --build=${CT_BUILD}                         \
   548         --host=${CT_HOST}                           \
   549         --target=${CT_TARGET}                       \
   550         --prefix="${CT_PREFIX_DIR}"                 \
   551         ${CC_SYSROOT_ARG}                           \
   552         "${extra_config[@]}"                        \
   553         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   554         --disable-nls                               \
   555         --enable-symvers=gnu                        \
   556         --enable-c99                                \
   557         --enable-long-long                          \
   558         "${CT_CC_EXTRA_CONFIG_ARRAY[@]}"
   559 
   560     if [ "${CT_CANADIAN}" = "y" ]; then
   561         CT_DoLog EXTRA "Building libiberty"
   562         CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
   563     fi
   564 
   565     CT_DoLog EXTRA "Building final compiler"
   566     CT_DoExecLog ALL make ${JOBSFLAGS} all
   567 
   568     CT_DoLog EXTRA "Installing final compiler"
   569     CT_DoExecLog ALL make install
   570 
   571     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   572     # to call the C compiler with the same, somewhat canonical name.
   573     # check whether compiler has an extension
   574     file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   575     [ -z "${file}" ] || ext=".${file##*.}"
   576     CT_DoExecLog ALL ln -sv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   577 
   578     CT_EndStep
   579 }