scripts/build/cc/gcc.sh
author "Benoît THÉBAUDEAU" <benoit.thebaudeau@advansee.com>
Tue May 31 20:12:35 2011 +0200 (2011-05-31)
changeset 2487 481cd34691f0
parent 2475 62c563f492ec
child 2491 667054325aab
permissions -rw-r--r--
gcc: promote PKGVERSION and BUGURL options to toolchain level

This patch promotes the PKGVERSION and BUGURL options to toolchain level so that
all toolchain components supporting them can benefit from them.

These options are passed to configure through --with-pkgversion and
--with-bugurl.

They are supported by binutils 2.18+, gcc 4.3+, eglibc 2.9+ and gdb 7.0+.

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