scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Mon Feb 13 21:47:25 2012 +0100 (2012-02-13)
changeset 2883 cea814c9932a
parent 2817 240df3865193
child 2884 91017ae2151c
permissions -rw-r--r--
libc/glibc: do not consume parameters when parsing them

Currently, there are two constructs used to parse arguments in
glibc backends, one that consumes args as they are parsed, and
one that does not.

Always use the construct that does not eat args as they are parsed.

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