scripts/build/cc/gcc.sh
author Cody Schafer <dev@codyps.com>
Fri May 09 19:13:49 2014 -0700 (2014-05-09)
changeset 3312 4876ff97e039
parent 3311 e35fa03cd204
permissions -rw-r--r--
cc/gcc: allow CC_EXTRA_CONFIG_ARRAY on baremetal

The final bare-metal compiler is built using the core backend.
Currently the core uses the CC_CORE_EXTRA_CONFIG_ARRAY variable.

While this works as supposed to, this can leave the user puzzled
in the menuconfig, since all he can see is the core options, not
the final options.

Only show the core options if any of the core passes are needed,
and use the final options in the core-backend if we're issuing
the bare-metal compiler.

Signed-off-by: Cody P Schafer <dev@codyps.com>
[yann.morin.1998@free.fr: hide core options if no core pass needed;
use final option in core backend if issuing the bare-metal compiler]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Message-Id: <22181e546ba746202489.1399688067@localhost>
Patchwork-Id: 347586
     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     if [ "${CT_CC_CUSTOM}" = "y" ]; then
    12         CT_GetCustom "gcc" "${CT_CC_VERSION}" "${CT_CC_CUSTOM_LOCATION}"
    13     else
    14         # Account for the Linaro versioning
    15         linaro_version="$( echo "${CT_CC_VERSION}"      \
    16                            |sed -r -e 's/^linaro-//;'   \
    17                          )"
    18         linaro_series="$( echo "${linaro_version}"      \
    19                           |sed -r -e 's/-.*//;'         \
    20                         )"
    21 
    22         # Ah! gcc folks are kind of 'different': they store the tarballs in
    23         # subdirectories of the same name!
    24         # Arrgghh! Some of those versions does not follow this convention:
    25         # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
    26         # subdirectory!
    27         CT_GetFile "gcc-${CT_CC_VERSION}"                                                       \
    28                    {ftp,http}://ftp.gnu.org/gnu/gcc{,{,/releases}/gcc-${CT_CC_VERSION}}         \
    29                    ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-${CT_CC_VERSION} \
    30                    ftp://ftp.uvsq.fr/pub/gcc/snapshots/${CT_CC_VERSION}                         \
    31                    "${linaro_base_url}/${linaro_series}/${linaro_version}/+download"
    32 
    33     fi # ! custom location
    34     # Starting with GCC 4.3, ecj is used for Java, and will only be
    35     # built if the configure script finds ecj.jar at the top of the
    36     # GCC source tree, which will not be there unless we get it and
    37     # put it there ourselves
    38     if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y" ]; then
    39         CT_GetFile ecj-latest .jar ftp://gcc.gnu.org/pub/java   \
    40                                    ftp://sourceware.org/pub/java
    41     fi
    42 }
    43 
    44 # Extract gcc
    45 do_cc_extract() {
    46     # If using custom directory location, nothing to do
    47     if [ "${CT_CC_CUSTOM}" = "y"                    \
    48          -a -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}" ]; then
    49         return 0
    50     fi
    51 
    52     CT_Extract "gcc-${CT_CC_VERSION}"
    53     CT_Patch "gcc" "${CT_CC_VERSION}"
    54 
    55     # Copy ecj-latest.jar to ecj.jar at the top of the GCC source tree
    56     if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y"                     \
    57          -a ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"   \
    58        ]; then
    59         CT_DoExecLog ALL cp -v "${CT_TARBALLS_DIR}/ecj-latest.jar" "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"
    60     fi
    61 }
    62 
    63 #------------------------------------------------------------------------------
    64 # This function builds up the set of languages to enable
    65 # No argument expected, returns the comma-separated language list on stdout
    66 cc_gcc_lang_list() {
    67     local lang_list
    68 
    69     lang_list="c"
    70     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_list+=",c++"
    71     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_list+=",fortran"
    72     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_list+=",ada"
    73     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_list+=",java"
    74     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_list+=",objc"
    75     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_list+=",obj-c++"
    76     [ "${CT_CC_LANG_GOLANG}" = "y"   ] && lang_list+=",go"
    77     lang_list+="${CT_CC_LANG_OTHERS:+,${CT_CC_LANG_OTHERS}}"
    78 
    79     printf "%s" "${lang_list}"
    80 }
    81 
    82 #------------------------------------------------------------------------------
    83 # Core gcc pass 1
    84 do_cc_core_pass_1() {
    85     local -a core_opts
    86 
    87     if [ "${CT_CC_CORE_PASS_1_NEEDED}" != "y" ]; then
    88         return 0
    89     fi
    90 
    91     core_opts+=( "mode=static" )
    92     core_opts+=( "host=${CT_BUILD}" )
    93     core_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
    94     core_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
    95     core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
    96     core_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
    97     core_opts+=( "lang_list=c" )
    98 
    99     CT_DoStep INFO "Installing pass-1 core C compiler"
   100     CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-core-pass-1"
   101 
   102     do_cc_core_backend "${core_opts[@]}"
   103 
   104     CT_Popd
   105     CT_EndStep
   106 }
   107 
   108 # Core gcc pass 2
   109 do_cc_core_pass_2() {
   110     local -a core_opts
   111 
   112     if [ "${CT_CC_CORE_PASS_2_NEEDED}" != "y" ]; then
   113         return 0
   114     fi
   115 
   116     # Common options:
   117     core_opts+=( "host=${CT_BUILD}" )
   118     core_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
   119     core_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
   120     core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
   121     core_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
   122     core_opts+=( "lang_list=c" )
   123 
   124     # Different conditions are at stake here:
   125     #   - In case the threading model is NPTL, we need a shared-capable core
   126     #     gcc; in all other cases, we need a static-only core gcc.
   127     #   - In case the threading model is NPTL or win32, or gcc is 4.3 or
   128     #     later, we need to build libgcc
   129     case "${CT_THREADS}" in
   130         nptl)
   131             core_opts+=( "mode=shared" )
   132             core_opts+=( "build_libgcc=yes" )
   133             ;;
   134         win32)
   135             core_opts+=( "mode=static" )
   136             core_opts+=( "build_libgcc=yes" )
   137             ;;
   138         *)
   139             core_opts+=( "mode=static" )
   140             if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   141                 core_opts+=( "build_libgcc=yes" )
   142             fi
   143             ;;
   144     esac
   145 
   146     CT_DoStep INFO "Installing pass-2 core C compiler"
   147     CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-core-pass-2"
   148 
   149     do_cc_core_backend "${core_opts[@]}"
   150 
   151     CT_Popd
   152     CT_EndStep
   153 }
   154 
   155 #------------------------------------------------------------------------------
   156 # Build core gcc
   157 # This function is used to build the core C compiler.
   158 # Usage: do_cc_core_backend param=value [...]
   159 #   Parameter           : Definition                                : Type      : Default
   160 #   mode                : build a 'static', 'shared' or 'baremetal' : string    : (none)
   161 #   host                : the machine the core will run on          : tuple     : (none)
   162 #   prefix              : dir prefix to install into                : dir       : (none)
   163 #   complibs            : dir where complibs are isntalled          : dir       : (none)
   164 #   lang_list           : the list of languages to build            : string    : (empty)
   165 #   build_libgcc        : build libgcc or not                       : bool      : no
   166 #   build_libstdcxx     : build libstdc++ or not                    : bool      : no
   167 #   build_libgfortran   : build libgfortran or not                  : bool      : no
   168 #   build_staticlinked  : build statically linked or not            : bool      : no
   169 #   build_manuals       : whether to build manuals or not           : bool      : no
   170 #   cflags              : cflags to use                             : string    : (empty)
   171 #   ldflags             : ldflags to use                            : string    : (empty)
   172 # Usage: do_cc_core_backend mode=[static|shared|baremetal] build_libgcc=[yes|no] build_staticlinked=[yes|no]
   173 do_cc_core_backend() {
   174     local mode
   175     local build_libgcc=no
   176     local build_libstdcxx=no
   177     local build_libgfortran=no
   178     local build_staticlinked=no
   179     local build_manuals=no
   180     local host
   181     local prefix
   182     local complibs
   183     local lang_list
   184     local cflags
   185     local ldflags
   186     local tmp
   187     local -a host_libstdcxx_flags
   188     local -a extra_config
   189     local -a core_LDFLAGS
   190     local -a core_targets
   191     local -a extra_user_config
   192     local arg
   193 
   194     for arg in "$@"; do
   195         eval "${arg// /\\ }"
   196     done
   197 
   198     CT_DoLog EXTRA "Configuring gcc"
   199 
   200     case "${mode}" in
   201         static)
   202             extra_config+=("--with-newlib")
   203             extra_config+=("--enable-threads=no")
   204             extra_config+=("--disable-shared")
   205             extra_user_config=( "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}" )
   206             copy_headers=y  # For baremetal, as there's no headers to copy,
   207                             # we copy an empty directory. So, who cares?
   208             ;;
   209         shared)
   210             extra_config+=("--enable-shared")
   211             extra_user_config=( "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}" )
   212             copy_headers=y
   213             ;;
   214         baremetal)
   215             extra_config+=("--with-newlib")
   216             extra_config+=("--enable-threads=no")
   217             extra_config+=("--disable-shared")
   218             extra_user_config=( "${CT_CC_EXTRA_CONFIG_ARRAY[@]}" )
   219             copy_headers=n
   220             ;;
   221         *)
   222             CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
   223             ;;
   224     esac
   225 
   226     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   227         # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
   228         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   229         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   230     fi
   231 
   232     if [ "${copy_headers}" = "y" ]; then
   233         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   234         CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${prefix}/${CT_TARGET}/include"
   235     fi
   236 
   237     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   238         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   239         if [ -n "${tmp}" ]; then
   240             extra_config+=("${tmp}")
   241         fi
   242     done
   243     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   244         extra_config+=("--enable-__cxa_atexit")
   245     else
   246         extra_config+=("--disable-__cxa_atexit")
   247     fi
   248 
   249     core_LDFLAGS+=("${ldflags}")
   250 
   251     # *** WARNING ! ***
   252     # Keep this full if-else-if-elif-fi-fi block in sync
   253     # with the same block in do_cc, below.
   254     if [ "${build_staticlinked}" = "yes" ]; then
   255         core_LDFLAGS+=("-static")
   256         host_libstdcxx_flags+=("-static-libgcc")
   257         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   258         host_libstdcxx_flags+=("-lm")
   259         # Companion libraries are build static (eg !shared), so
   260         # the libstdc++ is not pulled automatically, although it
   261         # is needed. Shoe-horn it in our LDFLAGS
   262         # Ditto libm on some Fedora boxen
   263         core_LDFLAGS+=("-lstdc++")
   264         core_LDFLAGS+=("-lm")
   265     else
   266         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   267             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   268             # build script
   269             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   270             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   271             host_libstdcxx_flags+=("-static-libgcc")
   272             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   273             host_libstdcxx_flags+=("-lm")
   274         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   275             # When companion libraries are build static (eg !shared),
   276             # the libstdc++ is not pulled automatically, although it
   277             # is needed. Shoe-horn it in our LDFLAGS
   278             # Ditto libm on some Fedora boxen
   279             core_LDFLAGS+=("-lstdc++")
   280             core_LDFLAGS+=("-lm")
   281         fi
   282     fi
   283 
   284     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   285         extra_config+=("--with-gmp=${complibs}")
   286         extra_config+=("--with-mpfr=${complibs}")
   287     fi
   288     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   289         extra_config+=("--with-mpc=${complibs}")
   290     fi
   291     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   292         if [ "${CT_PPL}" = "y" ]; then
   293             extra_config+=("--with-ppl=${complibs}")
   294             # With PPL 0.11+, also pull libpwl if needed
   295             if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   296                 host_libstdcxx_flags+=("-L${complibs}/lib")
   297                 host_libstdcxx_flags+=("-lpwl")
   298             fi
   299         fi
   300         if [ "${CT_ISL}" = "y" ]; then
   301             extra_config+=("--with-isl=${complibs}")
   302         fi
   303         extra_config+=("--with-cloog=${complibs}")
   304     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   305         extra_config+=("--with-ppl=no")
   306         extra_config+=("--with-isl=no")
   307         extra_config+=("--with-cloog=no")
   308     fi
   309     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   310         extra_config+=("--with-libelf=${complibs}")
   311         extra_config+=("--enable-lto")
   312     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   313         extra_config+=("--with-libelf=no")
   314         extra_config+=("--disable-lto")
   315     fi
   316 
   317     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   318         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   319     fi
   320 
   321     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   322         extra_config+=("--enable-target-optspace")
   323     fi
   324 
   325     case "${CT_CC_GCC_LDBL_128}" in
   326         y)  extra_config+=("--with-long-double-128");;
   327         m)  ;;
   328         "") extra_config+=("--without-long-double-128");;
   329     esac
   330 
   331     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   332         extra_config+=( --enable-linker-build-id )
   333     fi
   334 
   335     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   336         "") ;;
   337         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   338     esac
   339 
   340     case "${CT_CC_GCC_DEC_FLOATS}" in
   341         "") ;;
   342         *)  extra_config+=( "--enable-decimal-float=${CT_CC_GCC_DEC_FLOATS}" );;
   343     esac
   344 
   345     case "${CT_ARCH}" in
   346         mips)
   347             case "${CT_CC_GCC_mips_llsc}" in
   348                 y)  extra_config+=( --with-llsc );;
   349                 m)  ;;
   350                 *)  extra_config+=( --without-llsc );;
   351             esac
   352             case "${CT_CC_GCC_mips_synci}" in
   353                 y)  extra_config+=( --with-synci );;
   354                 m)  ;;
   355                 *)  extra_config+=( --without-synci );;
   356             esac
   357             if [ "${CT_CC_GCC_mips_plt}" ]; then
   358                 extra_config+=( --with-mips-plt )
   359             fi
   360             ;; # ARCH is mips
   361     esac
   362 
   363     extra_config+=(--disable-libgomp)
   364     extra_config+=(--disable-libmudflap)
   365 
   366     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   367 
   368     [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ] && extra_config+=("--disable-libstdcxx-pch")
   369 
   370     if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
   371         extra_config+=("--with-system-zlib")
   372     fi
   373 
   374     # Some versions of gcc have a deffective --enable-multilib.
   375     # Since that's the default, only pass --disable-multilib.
   376     if [ "${CT_MULTILIB}" != "y" ]; then
   377         extra_config+=("--disable-multilib")
   378     fi
   379 
   380     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   381 
   382     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   383     CT_DoExecLog CFG                                \
   384     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   385     CFLAGS="${cflags}"                              \
   386     CXXFLAGS="${cflags}"                            \
   387     LDFLAGS="${core_LDFLAGS[*]}"                    \
   388     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   389         --build=${CT_BUILD}                         \
   390         --host=${host}                              \
   391         --target=${CT_TARGET}                       \
   392         --prefix="${prefix}"                        \
   393         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   394         --disable-libmudflap                        \
   395         ${CC_CORE_SYSROOT_ARG}                      \
   396         "${extra_config[@]}"                        \
   397         --enable-languages="${lang_list}"           \
   398         "${extra_user_config[@]}"
   399 
   400     if [ "${build_libgcc}" = "yes" ]; then
   401         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   402         # gcc/config/t-libunwind so -lc is removed from the link for
   403         # libgcc_s.so, as we do not have a target -lc yet.
   404         # This is not as ugly as it appears to be ;-) All symbols get resolved
   405         # during the glibc build, and we provide a proper libgcc_s.so for the
   406         # cross toolchain during the final gcc build.
   407         #
   408         # As we cannot modify the source tree, nor override SHLIB_LC itself
   409         # during configure or make, we have to edit the resultant
   410         # gcc/libgcc.mk itself to remove -lc from the link.
   411         # This causes us to have to jump through some hoops...
   412         #
   413         # To produce libgcc.mk to edit we firstly require libiberty.a,
   414         # so we configure then build it.
   415         # Next we have to configure gcc, create libgcc.mk then edit it...
   416         # So much easier if we just edit the source tree, but hey...
   417         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   418             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libiberty
   419             CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
   420             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp
   421             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
   422         else
   423             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp configure-build-libiberty
   424             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
   425         fi
   426         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   427         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   428             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libdecnumber
   429             CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
   430         fi
   431         # HACK: gcc-4.8 uses libbacktrace to make libgcc.mvars, so make it here.
   432         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libbacktrace" ]; then
   433             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libbacktrace
   434             CT_DoExecLog ALL make ${JOBSFLAGS} -C libbacktrace
   435         fi
   436 
   437         # Starting with GCC 4.3, libgcc.mk is no longer built,
   438         # and libgcc.mvars is used instead.
   439 
   440         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   441             libgcc_rule="libgcc.mvars"
   442             core_targets=( gcc target-libgcc )
   443         else
   444             libgcc_rule="libgcc.mk"
   445             core_targets=( gcc )
   446         fi
   447 
   448         # On bare metal and canadian build the host-compiler is used when
   449         # actually the build-system compiler is required. Choose the correct
   450         # compilers for canadian build and use the defaults on other
   451         # configurations.
   452         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   453             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   454                        CXX_FOR_BUILD=${CT_BUILD}-g++ \
   455                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   456         else
   457             repair_cc=""
   458         fi
   459 
   460         CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
   461                               ${repair_cc}
   462         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   463     else # build_libgcc
   464         core_targets=( gcc )
   465     fi   # ! build libgcc
   466     if [    "${build_libstdcxx}" = "yes"    \
   467          -a "${CT_CC_LANG_CXX}"  = "y"      \
   468        ]; then
   469         core_targets+=( target-libstdc++-v3 )
   470     fi
   471 
   472     if [    "${build_libgfortran}" = "yes"    \
   473          -a "${CT_CC_LANG_FORTRAN}"  = "y"    \
   474        ]; then
   475         core_targets+=( target-libgfortran )
   476     fi
   477 
   478     CT_DoLog EXTRA "Building gcc"
   479     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
   480 
   481     CT_DoLog EXTRA "Installing gcc"
   482     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/install-}"
   483 
   484     if [ "${build_manuals}" = "yes" ]; then
   485         CT_DoLog EXTRA "Building the GCC manuals"
   486         CT_DoExecLog ALL make pdf html
   487         CT_DoLog EXTRA "Installing the GCC manuals"
   488         CT_DoExecLog ALL make install-{pdf,html}-gcc
   489     fi
   490 
   491     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   492     # to call the C compiler with the same, somewhat canonical name.
   493     # check whether compiler has an extension
   494     file="$( ls -1 "${prefix}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   495     [ -z "${file}" ] || ext=".${file##*.}"
   496     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}"
   497 
   498     if [ "${CT_MULTILIB}" = "y" ]; then
   499         if [ "${CT_CANADIAN}" = "y" -a "${mode}" = "baremetal" \
   500              -a "${host}" = "${CT_HOST}" ]; then
   501             CT_DoLog WARN "Canadian Cross unable to confirm multilibs configured correctly"
   502         else
   503             multilibs=( $( "${prefix}/bin/${CT_TARGET}-gcc" -print-multi-lib   \
   504                            |tail -n +2 ) )
   505             if [ ${#multilibs[@]} -ne 0 ]; then
   506                 CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
   507                 for i in "${multilibs[@]}"; do
   508                     dir="${i%%;*}"
   509                     flags="${i#*;}"
   510                     CT_DoLog EXTRA "   ${flags//@/ -}  -->  ${dir}/"
   511                 done
   512             else
   513                 CT_DoLog WARN "gcc configured for multilib, but none available"
   514            fi
   515         fi
   516     fi
   517 }
   518 
   519 #------------------------------------------------------------------------------
   520 # Build complete gcc to run on build
   521 do_cc_for_build() {
   522     local -a build_final_opts
   523     local build_final_backend
   524 
   525     # In case we're canadian or cross-native, it seems that a
   526     # real, complete compiler is needed?!? WTF? Sigh...
   527     # Otherwise, there is nothing to do.
   528     case "${CT_TOOLCHAIN_TYPE}" in
   529         native|cross)   return 0;;
   530     esac
   531 
   532     build_final_opts+=( "host=${CT_BUILD}" )
   533     build_final_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
   534     build_final_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
   535     build_final_opts+=( "lang_list=$( cc_gcc_lang_list )" )
   536     if [ "${CT_BARE_METAL}" = "y" ]; then
   537         # In the tests I've done, bare-metal was not impacted by the
   538         # lack of such a compiler, but better safe than sorry...
   539         build_final_opts+=( "mode=baremetal" )
   540         build_final_opts+=( "build_libgcc=yes" )
   541         build_final_opts+=( "build_libstdcxx=yes" )
   542         build_final_opts+=( "build_libgfortran=yes" )
   543         if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   544             build_final_opts+=( "build_staticlinked=yes" )
   545         fi
   546         build_final_backend=do_cc_core_backend
   547     else
   548         build_final_backend=do_cc_backend
   549     fi
   550 
   551     CT_DoStep INFO "Installing final compiler for build"
   552     CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final-build-${CT_BUILD}"
   553 
   554     "${build_final_backend}" "${build_final_opts[@]}"
   555 
   556     CT_Popd
   557     CT_EndStep
   558 }
   559 
   560 #------------------------------------------------------------------------------
   561 # Build final gcc to run on host
   562 do_cc_for_host() {
   563     local -a final_opts
   564     local final_backend
   565 
   566     final_opts+=( "host=${CT_HOST}" )
   567     final_opts+=( "prefix=${CT_PREFIX_DIR}" )
   568     final_opts+=( "complibs=${CT_HOST_COMPLIBS_DIR}" )
   569     final_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
   570     final_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
   571     final_opts+=( "lang_list=$( cc_gcc_lang_list )" )
   572     if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   573         final_opts+=( "build_manuals=yes" )
   574     fi
   575     if [ "${CT_BARE_METAL}" = "y" ]; then
   576         final_opts+=( "mode=baremetal" )
   577         final_opts+=( "build_libgcc=yes" )
   578         final_opts+=( "build_libstdcxx=yes" )
   579         final_opts+=( "build_libgfortran=yes" )
   580         if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   581             final_opts+=( "build_staticlinked=yes" )
   582         fi
   583         final_backend=do_cc_core_backend
   584     else
   585         final_backend=do_cc_backend
   586     fi
   587 
   588     CT_DoStep INFO "Installing final compiler"
   589     CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final"
   590 
   591     "${final_backend}" "${final_opts[@]}"
   592 
   593     CT_Popd
   594     CT_EndStep
   595 }
   596 
   597 #------------------------------------------------------------------------------
   598 # Build the final gcc
   599 # Usage: do_cc_backend param=value [...]
   600 #   Parameter     : Definition                          : Type      : Default
   601 #   host          : the host we run onto                : tuple     : (none)
   602 #   prefix        : the runtime prefix                  : dir       : (none)
   603 #   complibs      : the companion libraries prefix      : dir       : (none)
   604 #   cflags        : cflags to use                       : string    : (empty)
   605 #   ldflags       : ldflags to use                      : string    : (empty)
   606 #   lang_list     : the list of languages to build      : string    : (empty)
   607 #   build_manuals : whether to build manuals or not     : bool      : no
   608 do_cc_backend() {
   609     local host
   610     local prefix
   611     local complibs
   612     local cflags
   613     local ldflags
   614     local lang_list
   615     local build_manuals
   616     local -a host_libstdcxx_flags
   617     local -a extra_config
   618     local -a final_LDFLAGS
   619     local tmp
   620     local arg
   621 
   622     for arg in "$@"; do
   623         eval "${arg// /\\ }"
   624     done
   625 
   626     CT_DoLog EXTRA "Configuring gcc"
   627 
   628     # Enable selected languages
   629     extra_config+=("--enable-languages=${lang_list}")
   630 
   631     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   632         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   633         if [ -n "${tmp}" ]; then
   634             extra_config+=("${tmp}")
   635         fi
   636     done
   637 
   638     [ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared")
   639     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   640         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   641         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   642     fi
   643     case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
   644         y)  extra_config+=("--enable-sjlj-exceptions");;
   645         m)  ;;
   646         "") extra_config+=("--disable-sjlj-exceptions");;
   647     esac
   648     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   649         extra_config+=("--enable-__cxa_atexit")
   650     else
   651         extra_config+=("--disable-__cxa_atexit")
   652     fi
   653     if [ -n "${CT_CC_ENABLE_CXX_FLAGS}" ]; then
   654         extra_config+=("--enable-cxx-flags=${CT_CC_ENABLE_CXX_FLAGS}")
   655     fi
   656     if [ "${CT_CC_GCC_4_8_or_later}" = "y" ]; then
   657         if [ "${CT_THREADS}" = "none" ]; then
   658             extra_config+=(--disable-libatomic)
   659         fi
   660         if [ "${CT_THREADS}" != "nptl" ]; then
   661             extra_config+=(--disable-libsanitizer)
   662         fi
   663     fi
   664     if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
   665         extra_config+=(--enable-libmudflap)
   666     else
   667         extra_config+=(--disable-libmudflap)
   668     fi
   669     if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
   670         extra_config+=(--enable-libgomp)
   671     else
   672         extra_config+=(--disable-libgomp)
   673     fi
   674     if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
   675         extra_config+=(--enable-libssp)
   676     else
   677         extra_config+=(--disable-libssp)
   678     fi
   679     if [ "${CT_CC_GCC_HAS_LIBQUADMATH}" = "y" ]; then
   680         if [ "${CT_CC_GCC_LIBQUADMATH}" = "y" ]; then
   681             extra_config+=(--enable-libquadmath)
   682             extra_config+=(--enable-libquadmath-support)
   683         else
   684             extra_config+=(--disable-libquadmath)
   685             extra_config+=(--disable-libquadmath-support)
   686         fi
   687     fi
   688 
   689     final_LDFLAGS+=("${ldflags}")
   690 
   691     # *** WARNING ! ***
   692     # Keep this full if-else-if-elif-fi-fi block in sync
   693     # with the same block in do_cc_core, above.
   694     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   695         final_LDFLAGS+=("-static")
   696         host_libstdcxx_flags+=("-static-libgcc")
   697         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   698         host_libstdcxx_flags+=("-lm")
   699         # Companion libraries are build static (eg !shared), so
   700         # the libstdc++ is not pulled automatically, although it
   701         # is needed. Shoe-horn it in our LDFLAGS
   702         # Ditto libm on some Fedora boxen
   703         final_LDFLAGS+=("-lstdc++")
   704         final_LDFLAGS+=("-lm")
   705     else
   706         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   707             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   708             # build script
   709             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   710             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   711             host_libstdcxx_flags+=("-static-libgcc")
   712             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   713             host_libstdcxx_flags+=("-lm")
   714         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   715             # When companion libraries are build static (eg !shared),
   716             # the libstdc++ is not pulled automatically, although it
   717             # is needed. Shoe-horn it in our LDFLAGS
   718             # Ditto libm on some Fedora boxen
   719             final_LDFLAGS+=("-lstdc++")
   720             final_LDFLAGS+=("-lm")
   721         fi
   722     fi
   723 
   724     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   725         extra_config+=("--with-gmp=${complibs}")
   726         extra_config+=("--with-mpfr=${complibs}")
   727     fi
   728     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   729         extra_config+=("--with-mpc=${complibs}")
   730     fi
   731     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   732         if [ "${CT_PPL}" = "y" ]; then
   733             extra_config+=("--with-ppl=${complibs}")
   734             # With PPL 0.11+, also pull libpwl if needed
   735             if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   736                 host_libstdcxx_flags+=("-L${complibs}/lib")
   737                 host_libstdcxx_flags+=("-lpwl")
   738             fi
   739         fi
   740         if [ "${CT_ISL}" = "y" ]; then
   741             extra_config+=("--with-isl=${complibs}")
   742         fi
   743         extra_config+=("--with-cloog=${complibs}")
   744     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   745         extra_config+=("--with-ppl=no")
   746         extra_config+=("--with-isl=no")
   747         extra_config+=("--with-cloog=no")
   748     fi
   749     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   750         extra_config+=("--with-libelf=${complibs}")
   751     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   752         extra_config+=("--with-libelf=no")
   753     fi
   754 
   755     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   756         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   757     fi
   758 
   759     if [ "${CT_THREADS}" = "none" ]; then
   760         extra_config+=("--disable-threads")
   761         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   762             CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
   763             extra_config+=("--disable-libgomp")
   764         fi
   765     else
   766         if [ "${CT_THREADS}" = "win32" ]; then
   767             extra_config+=("--enable-threads=win32")
   768             extra_config+=("--disable-win32-registry")
   769         else
   770             extra_config+=("--enable-threads=posix")
   771         fi
   772     fi
   773 
   774     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   775         extra_config+=("--enable-target-optspace")
   776     fi
   777     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   778         extra_config+=("--disable-libstdcxx-pch")
   779     fi
   780 
   781     case "${CT_CC_GCC_LDBL_128}" in
   782         y)  extra_config+=("--with-long-double-128");;
   783         m)  ;;
   784         "") extra_config+=("--without-long-double-128");;
   785     esac
   786 
   787     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   788         extra_config+=( --enable-linker-build-id )
   789     fi
   790 
   791     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   792         "") ;;
   793         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   794     esac
   795 
   796     case "${CT_CC_GCC_DEC_FLOATS}" in
   797         "") ;;
   798         *)  extra_config+=( "--enable-decimal-float=${CT_CC_GCC_DEC_FLOATS}" );;
   799     esac
   800 
   801     if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
   802         extra_config+=( --enable-plugin )
   803     fi
   804     if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
   805         extra_config+=( --enable-gold )
   806     fi
   807 
   808     case "${CT_ARCH}" in
   809         mips)
   810             case "${CT_CC_GCC_mips_llsc}" in
   811                 y)  extra_config+=( --with-llsc );;
   812                 m)  ;;
   813                 *)  extra_config+=( --without-llsc );;
   814             esac
   815             case "${CT_CC_GCC_mips_synci}" in
   816                 y)  extra_config+=( --with-synci );;
   817                 m)  ;;
   818                 *)  extra_config+=( --without-synci );;
   819             esac
   820             if [ "${CT_CC_GCC_mips_plt}" ]; then
   821                 extra_config+=( --with-mips-plt )
   822             fi
   823             ;; # ARCH is mips
   824     esac
   825 
   826     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   827 
   828     if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
   829         extra_config+=("--with-system-zlib")
   830     fi
   831 
   832     if [ "${CT_MULTILIB}" = "y" ]; then
   833         extra_config+=("--enable-multilib")
   834     else
   835         extra_config+=("--disable-multilib")
   836     fi
   837 
   838     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   839 
   840     CT_DoExecLog CFG                                \
   841     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   842     CFLAGS="${cflags}"                              \
   843     CXXFLAGS="${cflags}"                            \
   844     LDFLAGS="${final_LDFLAGS[*]}"                   \
   845     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   846     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   847     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   848     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   849         --build=${CT_BUILD}                         \
   850         --host=${host}                              \
   851         --target=${CT_TARGET}                       \
   852         --prefix="${prefix}"                        \
   853         ${CC_SYSROOT_ARG}                           \
   854         "${extra_config[@]}"                        \
   855         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   856         --enable-c99                                \
   857         --enable-long-long                          \
   858         "${CT_CC_EXTRA_CONFIG_ARRAY[@]}"
   859 
   860     if [ "${CT_CANADIAN}" = "y" ]; then
   861         CT_DoLog EXTRA "Building libiberty"
   862         CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
   863     fi
   864 
   865     CT_DoLog EXTRA "Building gcc"
   866     CT_DoExecLog ALL make ${JOBSFLAGS} all
   867 
   868     CT_DoLog EXTRA "Installing gcc"
   869     CT_DoExecLog ALL make ${JOBSFLAGS} install
   870 
   871     if [ "${build_manuals}" = "yes" ]; then
   872         CT_DoLog EXTRA "Building the GCC manuals"
   873         CT_DoExecLog ALL make pdf html
   874         CT_DoLog EXTRA "Installing the GCC manuals"
   875         CT_DoExecLog ALL make install-{pdf,html}-gcc
   876     fi
   877 
   878     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   879     # to call the C compiler with the same, somewhat canonical name.
   880     # check whether compiler has an extension
   881     file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   882     [ -z "${file}" ] || ext=".${file##*.}"
   883     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   884 
   885     if [ "${CT_MULTILIB}" = "y" ]; then
   886         if [ "${CT_CANADIAN}" = "y" ]; then
   887             CT_DoLog WARN "Canadian Cross unable to confirm multilibs configured correctly"
   888         else
   889             multilibs=( $( "${prefix}/bin/${CT_TARGET}-gcc" -print-multi-lib \
   890                            |tail -n +2 ) )
   891             if [ ${#multilibs[@]} -ne 0 ]; then
   892                 CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
   893                 for i in "${multilibs[@]}"; do
   894                     dir="${i%%;*}"
   895                     flags="${i#*;}"
   896                     CT_DoLog EXTRA "   ${flags//@/ -}  -->  ${dir}/"
   897                 done
   898             else
   899                 CT_DoLog WARN "gcc configured for multilib, but none available"
   900             fi
   901         fi
   902     fi
   903 }