scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Sun Nov 25 18:22:38 2012 +0100 (2012-11-25)
changeset 3133 36aa2ae92c29
parent 3131 bd172b161ff8
child 3209 33f265e3e79d
permissions -rw-r--r--
cc/gcc: do not print 'core' or 'final'

In gcc-'s core and final passes, do not print 'core' or 'final' in
log messages. We already print it in step messages.

Also, as we use the core backend to build the bare-metal final gcc,
it can be disturbing to read 'core' while we're in fact in 'final'.

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