scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Aug 19 00:52:05 2011 +0200 (2011-08-19)
changeset 2614 814ea73df7e0
parent 2545 484f5cf55902
child 2676 af542a04bf69
permissions -rw-r--r--
scripts: simplify and fix the toolchain config script

The script that is installed, and which sole purpose is to dump
the .config that was used to build the toolchain, is pure insanity.

Let's make it much, much more simpler...

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