scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 17:56:22 2011 +0200 (2011-07-17)
changeset 2889 f3b2199620f1
parent 2888 dd71df95903a
child 2890 a59712c236df
permissions -rw-r--r--
cc/gcc: pass the install prefix to the core passes

Currently, the discrimination on the core compilers prefixes depends on
the type of core compiler to build.

This is not correct, and the caller of the core backend should specify
the prefix.

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