scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Apr 15 00:22:42 2011 +0200 (2011-04-15)
branch1.11
changeset 2557 b71761e8cff1
parent 2554 e378a7ccc345
child 2558 b7317d2fe0e9
permissions -rw-r--r--
scripts/internals: do not remove lib{32,64}/ symlinks after build

During the build, we create lib{32,64}/ symlinks out of the sysroot.
In some cases (eg. mingw32 target), these symlinks are still required
when running the toolchain. For other combinations, the symlinks are
without incidence, so they can be safely kept after the build.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
(transplanted from 751c3f735ada4a95aa981841b832adb08b88ce27)
     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-languages="${lang_opt}"            \
   278         ${CT_CC_CORE_EXTRA_CONFIG}
   279 
   280     if [ "${build_libgcc}" = "yes" ]; then
   281         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   282         # gcc/config/t-libunwind so -lc is removed from the link for
   283         # libgcc_s.so, as we do not have a target -lc yet.
   284         # This is not as ugly as it appears to be ;-) All symbols get resolved
   285         # during the glibc build, and we provide a proper libgcc_s.so for the
   286         # cross toolchain during the final gcc build.
   287         #
   288         # As we cannot modify the source tree, nor override SHLIB_LC itself
   289         # during configure or make, we have to edit the resultant
   290         # gcc/libgcc.mk itself to remove -lc from the link.
   291         # This causes us to have to jump through some hoops...
   292         #
   293         # To produce libgcc.mk to edit we firstly require libiberty.a,
   294         # so we configure then build it.
   295         # Next we have to configure gcc, create libgcc.mk then edit it...
   296         # So much easier if we just edit the source tree, but hey...
   297         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   298             CT_DoExecLog CFG make configure-libiberty
   299             CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
   300             CT_DoExecLog CFG make configure-gcc configure-libcpp
   301             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
   302         else
   303             CT_DoExecLog CFG make configure-gcc configure-libcpp configure-build-libiberty
   304             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
   305         fi
   306         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   307         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   308             CT_DoExecLog CFG make configure-libdecnumber
   309             CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
   310         fi
   311 
   312         # Starting with GCC 4.3, libgcc.mk is no longer built,
   313         # and libgcc.mvars is used instead.
   314 
   315         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   316             libgcc_rule="libgcc.mvars"
   317             core_targets=( gcc target-libgcc )
   318         else
   319             libgcc_rule="libgcc.mk"
   320             core_targets=( gcc )
   321         fi
   322 
   323         # On bare metal and canadian build the host-compiler is used when
   324         # actually the build-system compiler is required. Choose the correct
   325         # compilers for canadian build and use the defaults on other
   326         # configurations.
   327         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   328             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   329                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   330         else
   331             repair_cc=""
   332         fi
   333 
   334         CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
   335                               ${repair_cc}
   336         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   337     else # build_libgcc
   338         core_targets=( gcc )
   339     fi   # ! build libgcc
   340     if [    "${build_libstdcxx}" = "yes"    \
   341          -a "${CT_CC_LANG_CXX}"  = "y"      \
   342        ]; then
   343         core_targets+=( target-libstdc++-v3 )
   344     fi
   345 
   346     CT_DoLog EXTRA "Building ${mode} core C compiler"
   347     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
   348 
   349     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   350     CT_DoExecLog ALL make "${core_targets[@]/#/install-}"
   351 
   352     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   353     # to call the C compiler with the same, somewhat canonical name.
   354     # check whether compiler has an extension
   355     file="$( ls -1 "${core_prefix_dir}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   356     [ -z "${file}" ] || ext=".${file##*.}"
   357     CT_DoExecLog ALL ln -sv "${CT_TARGET}-gcc${ext}" "${core_prefix_dir}/bin/${CT_TARGET}-cc${ext}"
   358 
   359     CT_EndStep
   360 }
   361 
   362 #------------------------------------------------------------------------------
   363 # Build final gcc
   364 do_cc() {
   365     local -a host_libstdcxx_flags
   366     local -a extra_config
   367     local -a final_LDFLAGS
   368     local tmp
   369 
   370     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   371     [ "${CT_BARE_METAL}" = "y" ] && return 0
   372 
   373     CT_DoStep INFO "Installing final compiler"
   374 
   375     mkdir -p "${CT_BUILD_DIR}/build-cc"
   376     cd "${CT_BUILD_DIR}/build-cc"
   377 
   378     CT_DoLog EXTRA "Configuring final compiler"
   379 
   380     # Enable selected languages
   381     lang_opt="c"
   382     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   383     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   384     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   385     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   386     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   387     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   388     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   389     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   390     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   391     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   392     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   393 
   394     extra_config+=("--enable-languages=${lang_opt}")
   395     extra_config+=("--disable-multilib")
   396     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   397         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   398         if [ -n "${tmp}" ]; then
   399             extra_config+=("${tmp}")
   400         fi
   401     done
   402 
   403     [ "${CT_SHARED_LIBS}" = "y" ]                   || extra_config+=("--disable-shared")
   404     [ -n "${CT_CC_PKGVERSION}" ]                    && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   405     [ -n "${CT_CC_BUGURL}" ]                        && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   406     case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
   407         y)  extra_config+=("--enable-sjlj-exceptions");;
   408         m)  ;;
   409         "") extra_config+=("--disable-sjlj-exceptions");;
   410     esac
   411     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   412         extra_config+=("--enable-__cxa_atexit")
   413     else
   414         extra_config+=("--disable-__cxa_atexit")
   415     fi
   416     if [ -n "${CC_ENABLE_CXX_FLAGS}" ]; then
   417         extra_config+=("--enable-cxx-flags=${CC_ENABLE_CXX_FLAGS}")
   418     fi
   419     if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
   420         extra_config+=(--enable-libmudflap)
   421     else
   422         extra_config+=(--disable-libmudflap)
   423     fi
   424     if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
   425         extra_config+=(--enable-libgomp)
   426     else
   427         extra_config+=(--disable-libgomp)
   428     fi
   429     if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
   430         extra_config+=(--enable-libssp)
   431     else
   432         extra_config+=(--disable-libssp)
   433     fi
   434 
   435     # *** WARNING ! ***
   436     # Keep this full if-else-if-elif-fi-fi block in sync
   437     # with the same block in do_cc_core, above.
   438     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   439         final_LDFLAGS+=("-static")
   440         host_libstdcxx_flags+=("-static-libgcc")
   441         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   442         host_libstdcxx_flags+=("-lm")
   443         # Companion libraries are build static (eg !shared), so
   444         # the libstdc++ is not pulled automatically, although it
   445         # is needed. Shoe-horn it in our LDFLAGS
   446         # Ditto libm on some Fedora boxen
   447         final_LDFLAGS+=("-lstdc++")
   448         final_LDFLAGS+=("-lm")
   449     else
   450         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   451             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   452             # build script
   453             # FIXME: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   454             # see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   455             host_libstdcxx_flags+=("-static-libgcc")
   456             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   457             host_libstdcxx_flags+=("-lm")
   458         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   459             # When companion libraries are build static (eg !shared),
   460             # the libstdc++ is not pulled automatically, although it
   461             # is needed. Shoe-horn it in our LDFLAGS
   462             # Ditto libm on some Fedora boxen
   463             final_LDFLAGS+=("-lstdc++")
   464             final_LDFLAGS+=("-lm")
   465         fi
   466     fi
   467 
   468     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   469         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   470         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   471     fi
   472     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   473         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   474     fi
   475     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   476         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   477         # With PPL 0.11+, also pull libpwl if needed
   478         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   479             host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
   480             host_libstdcxx_flags+=("-lpwl")
   481         fi
   482         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   483     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   484         extra_config+=("--with-ppl=no")
   485         extra_config+=("--with-cloog=no")
   486     fi
   487     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   488         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   489     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   490         extra_config+=("--with-libelf=no")
   491     fi
   492 
   493     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   494         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   495     fi
   496 
   497     if [ "${CT_THREADS}" = "none" ]; then
   498         extra_config+=("--disable-threads")
   499         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   500             CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
   501             extra_config+=("--disable-libgomp")
   502         fi
   503     else
   504         if [ "${CT_THREADS}" = "win32" ]; then
   505             extra_config+=("--enable-threads=win32")
   506             extra_config+=("--disable-win32-registry")
   507         else
   508             extra_config+=("--enable-threads=posix")
   509         fi
   510     fi
   511 
   512     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   513         extra_config+=("--enable-target-optspace")
   514     fi
   515     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   516         extra_config+=("--disable-libstdcxx-pch")
   517     fi
   518 
   519     case "${CT_CC_GCC_LDBL_128}" in
   520         y)  extra_config+=("--with-long-double-128");;
   521         m)  ;;
   522         "") extra_config+=("--without-long-double-128");;
   523     esac
   524 
   525     if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
   526         extra_config+=( --enable-plugin )
   527     fi
   528     if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
   529         extra_config+=( --enable-gold )
   530     fi
   531 
   532     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   533 
   534     # --disable-nls to work around crash bug on ppc405, but also because
   535     # embedded systems don't really need message catalogs...
   536     CT_DoExecLog CFG                                \
   537     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   538     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   539     LDFLAGS="${final_LDFLAGS[*]}"                   \
   540     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   541     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   542     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   543     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   544         --build=${CT_BUILD}                         \
   545         --host=${CT_HOST}                           \
   546         --target=${CT_TARGET}                       \
   547         --prefix="${CT_PREFIX_DIR}"                 \
   548         ${CC_SYSROOT_ARG}                           \
   549         "${extra_config[@]}"                        \
   550         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   551         --disable-nls                               \
   552         --enable-c99                                \
   553         --enable-long-long                          \
   554         ${CT_CC_EXTRA_CONFIG}
   555 
   556     if [ "${CT_CANADIAN}" = "y" ]; then
   557         CT_DoLog EXTRA "Building libiberty"
   558         CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
   559     fi
   560 
   561     CT_DoLog EXTRA "Building final compiler"
   562     CT_DoExecLog ALL make ${JOBSFLAGS} all
   563 
   564     CT_DoLog EXTRA "Installing final compiler"
   565     CT_DoExecLog ALL make install
   566 
   567     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   568     # to call the C compiler with the same, somewhat canonical name.
   569     # check whether compiler has an extension
   570     file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   571     [ -z "${file}" ] || ext=".${file##*.}"
   572     CT_DoExecLog ALL ln -sv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   573 
   574     CT_EndStep
   575 }