scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Sun May 05 00:01:05 2013 +0200 (2013-05-05)
changeset 3218 3709e61ad85b
parent 3215 4c63ce24fccd
child 3244 8ff20760e93b
permissions -rw-r--r--
complibs/cloog: add support for the ISL backend

CLooG 0.18+ will use ISL instead of PPL, so we have to configure
adequately depending of which backend is in use.

The Kconfig entries will decide for us which is selected, so we
can rely on either PPL xor ISL to be selected, not both.

Reported-by: "Plotnikov Dmitry" <leitz@ispras.ru>
[Dmitry did a preliminray patch to add ISL support,
which this patch is inspired from]
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         if [ "${CT_PPL}" = "y" ]; then
   286             extra_config+=("--with-ppl=${complibs}")
   287             # With PPL 0.11+, also pull libpwl if needed
   288             if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   289                 host_libstdcxx_flags+=("-L${complibs}/lib")
   290                 host_libstdcxx_flags+=("-lpwl")
   291             fi
   292         fi
   293         if [ "${CT_ISL}" = "y" ]; then
   294             extra_config+=("--with-isl=${complibs}")
   295         fi
   296         extra_config+=("--with-cloog=${complibs}")
   297     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   298         extra_config+=("--with-ppl=no")
   299         extra_config+=("--with-isl=no")
   300         extra_config+=("--with-cloog=no")
   301     fi
   302     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   303         extra_config+=("--with-libelf=${complibs}")
   304         extra_config+=("--enable-lto")
   305     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   306         extra_config+=("--with-libelf=no")
   307         extra_config+=("--disable-lto")
   308     fi
   309 
   310     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   311         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   312     fi
   313 
   314     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   315         extra_config+=("--enable-target-optspace")
   316     fi
   317 
   318     case "${CT_CC_GCC_LDBL_128}" in
   319         y)  extra_config+=("--with-long-double-128");;
   320         m)  ;;
   321         "") extra_config+=("--without-long-double-128");;
   322     esac
   323 
   324     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   325         extra_config+=( --enable-linker-build-id )
   326     fi
   327 
   328     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   329         "") ;;
   330         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   331     esac
   332 
   333     case "${CT_ARCH}" in
   334         mips)
   335             case "${CT_CC_GCC_mips_llsc}" in
   336                 y)  extra_config+=( --with-llsc );;
   337                 m)  ;;
   338                 *)  extra_config+=( --without-llsc );;
   339             esac
   340             case "${CT_CC_GCC_mips_synci}" in
   341                 y)  extra_config+=( --with-synci );;
   342                 m)  ;;
   343                 *)  extra_config+=( --without-synci );;
   344             esac
   345             if [ "${CT_CC_GCC_mips_plt}" ]; then
   346                 extra_config+=( --with-mips-plt )
   347             fi
   348             ;; # ARCH is mips
   349     esac
   350 
   351     extra_config+=(--disable-libgomp)
   352     extra_config+=(--disable-libmudflap)
   353 
   354     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   355 
   356     [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ] && extra_config+=("--disable-libstdcxx-pch")
   357 
   358     if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
   359         extra_config+=("--with-system-zlib")
   360     fi
   361 
   362     if [ "${CT_MULTILIB}" = "y" ]; then
   363         extra_config+=("--enable-multilib")
   364     else
   365         extra_config+=("--disable-multilib")
   366     fi
   367 
   368     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   369 
   370     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   371     CT_DoExecLog CFG                                \
   372     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   373     CFLAGS="${cflags}"                              \
   374     LDFLAGS="${core_LDFLAGS[*]}"                    \
   375     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   376         --build=${CT_BUILD}                         \
   377         --host=${host}                              \
   378         --target=${CT_TARGET}                       \
   379         --prefix="${prefix}"                        \
   380         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   381         --disable-libmudflap                        \
   382         ${CC_CORE_SYSROOT_ARG}                      \
   383         "${extra_config[@]}"                        \
   384         --enable-languages="${lang_list}"           \
   385         "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}"
   386 
   387     if [ "${build_libgcc}" = "yes" ]; then
   388         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   389         # gcc/config/t-libunwind so -lc is removed from the link for
   390         # libgcc_s.so, as we do not have a target -lc yet.
   391         # This is not as ugly as it appears to be ;-) All symbols get resolved
   392         # during the glibc build, and we provide a proper libgcc_s.so for the
   393         # cross toolchain during the final gcc build.
   394         #
   395         # As we cannot modify the source tree, nor override SHLIB_LC itself
   396         # during configure or make, we have to edit the resultant
   397         # gcc/libgcc.mk itself to remove -lc from the link.
   398         # This causes us to have to jump through some hoops...
   399         #
   400         # To produce libgcc.mk to edit we firstly require libiberty.a,
   401         # so we configure then build it.
   402         # Next we have to configure gcc, create libgcc.mk then edit it...
   403         # So much easier if we just edit the source tree, but hey...
   404         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   405             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libiberty
   406             CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
   407             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp
   408             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
   409         else
   410             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp configure-build-libiberty
   411             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
   412         fi
   413         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   414         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   415             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libdecnumber
   416             CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
   417         fi
   418         # HACK: gcc-4.8 uses libbacktrace to make libgcc.mvars, so make it here.
   419         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libbacktrace" ]; then
   420             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libbacktrace
   421             CT_DoExecLog ALL make ${JOBSFLAGS} -C libbacktrace
   422         fi
   423 
   424         # Starting with GCC 4.3, libgcc.mk is no longer built,
   425         # and libgcc.mvars is used instead.
   426 
   427         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   428             libgcc_rule="libgcc.mvars"
   429             core_targets=( gcc target-libgcc )
   430         else
   431             libgcc_rule="libgcc.mk"
   432             core_targets=( gcc )
   433         fi
   434 
   435         # On bare metal and canadian build the host-compiler is used when
   436         # actually the build-system compiler is required. Choose the correct
   437         # compilers for canadian build and use the defaults on other
   438         # configurations.
   439         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   440             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   441                        CXX_FOR_BUILD=${CT_BUILD}-g++ \
   442                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   443         else
   444             repair_cc=""
   445         fi
   446 
   447         CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
   448                               ${repair_cc}
   449         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   450     else # build_libgcc
   451         core_targets=( gcc )
   452     fi   # ! build libgcc
   453     if [    "${build_libstdcxx}" = "yes"    \
   454          -a "${CT_CC_LANG_CXX}"  = "y"      \
   455        ]; then
   456         core_targets+=( target-libstdc++-v3 )
   457     fi
   458 
   459     CT_DoLog EXTRA "Building gcc"
   460     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
   461 
   462     CT_DoLog EXTRA "Installing gcc"
   463     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/install-}"
   464 
   465     if [ "${build_manuals}" = "yes" ]; then
   466         CT_DoLog EXTRA "Building the GCC manuals"
   467         CT_DoExecLog ALL make pdf html
   468         CT_DoLog EXTRA "Installing the GCC manuals"
   469         CT_DoExecLog ALL make install-{pdf,html}-gcc
   470     fi
   471 
   472     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   473     # to call the C compiler with the same, somewhat canonical name.
   474     # check whether compiler has an extension
   475     file="$( ls -1 "${prefix}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   476     [ -z "${file}" ] || ext=".${file##*.}"
   477     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}"
   478 
   479     if [ "${CT_MULTILIB}" = "y" ]; then
   480         if [ "${CT_CANADIAN}" = "y" -a "${mode}" = "baremetal" \
   481              -a "${host}" = "${CT_HOST}" ]; then
   482             CT_DoLog WARN "Canadian Cross unable to confirm multilibs configured correctly"
   483         else
   484             multilibs=( $( "${prefix}/bin/${CT_TARGET}-gcc" -print-multi-lib   \
   485                            |tail -n +2 ) )
   486             if [ ${#multilibs[@]} -ne 0 ]; then
   487                 CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
   488                 for i in "${multilibs[@]}"; do
   489                     dir="${i%%;*}"
   490                     flags="${i#*;}"
   491                     CT_DoLog EXTRA "   ${flags//@/ -}  -->  ${dir}/"
   492                 done
   493             else
   494                 CT_DoLog WARN "gcc configured for multilib, but none available"
   495            fi
   496         fi
   497     fi
   498 }
   499 
   500 #------------------------------------------------------------------------------
   501 # Build complete gcc to run on build
   502 do_cc_for_build() {
   503     local -a build_final_opts
   504     local build_final_backend
   505 
   506     # In case we're canadian or cross-native, it seems that a
   507     # real, complete compiler is needed?!? WTF? Sigh...
   508     # Otherwise, there is nothing to do.
   509     case "${CT_TOOLCHAIN_TYPE}" in
   510         native|cross)   return 0;;
   511     esac
   512 
   513     build_final_opts+=( "host=${CT_BUILD}" )
   514     build_final_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
   515     build_final_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
   516     build_final_opts+=( "lang_list=$( cc_gcc_lang_list )" )
   517     if [ "${CT_BARE_METAL}" = "y" ]; then
   518         # In the tests I've done, bare-metal was not impacted by the
   519         # lack of such a compiler, but better safe than sorry...
   520         build_final_opts+=( "mode=baremetal" )
   521         build_final_opts+=( "build_libgcc=yes" )
   522         build_final_opts+=( "build_libstdcxx=yes" )
   523         if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   524             build_final_opts+=( "build_staticlinked=yes" )
   525         fi
   526         build_final_backend=do_cc_core_backend
   527     else
   528         build_final_backend=do_cc_backend
   529     fi
   530 
   531     CT_DoStep INFO "Installing final compiler for build"
   532     CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final-build-${CT_BUILD}"
   533 
   534     "${build_final_backend}" "${build_final_opts[@]}"
   535 
   536     CT_Popd
   537     CT_EndStep
   538 }
   539 
   540 #------------------------------------------------------------------------------
   541 # Build final gcc to run on host
   542 do_cc_for_host() {
   543     local -a final_opts
   544     local final_backend
   545 
   546     final_opts+=( "host=${CT_HOST}" )
   547     final_opts+=( "prefix=${CT_PREFIX_DIR}" )
   548     final_opts+=( "complibs=${CT_HOST_COMPLIBS_DIR}" )
   549     final_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
   550     final_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
   551     final_opts+=( "lang_list=$( cc_gcc_lang_list )" )
   552     if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   553         final_opts+=( "build_manuals=yes" )
   554     fi
   555     if [ "${CT_BARE_METAL}" = "y" ]; then
   556         final_opts+=( "mode=baremetal" )
   557         final_opts+=( "build_libgcc=yes" )
   558         final_opts+=( "build_libstdcxx=yes" )
   559         if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   560             final_opts+=( "build_staticlinked=yes" )
   561         fi
   562         final_backend=do_cc_core_backend
   563     else
   564         final_backend=do_cc_backend
   565     fi
   566 
   567     CT_DoStep INFO "Installing final compiler"
   568     CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final"
   569 
   570     "${final_backend}" "${final_opts[@]}"
   571 
   572     CT_Popd
   573     CT_EndStep
   574 }
   575 
   576 #------------------------------------------------------------------------------
   577 # Build the final gcc
   578 # Usage: do_cc_backend param=value [...]
   579 #   Parameter     : Definition                          : Type      : Default
   580 #   host          : the host we run onto                : tuple     : (none)
   581 #   prefix        : the runtime prefix                  : dir       : (none)
   582 #   complibs      : the companion libraries prefix      : dir       : (none)
   583 #   cflags        : cflags to use                       : string    : (empty)
   584 #   ldflags       : ldflags to use                      : string    : (empty)
   585 #   lang_list     : the list of languages to build      : string    : (empty)
   586 #   build_manuals : whether to build manuals or not     : bool      : no
   587 do_cc_backend() {
   588     local host
   589     local prefix
   590     local complibs
   591     local cflags
   592     local ldflags
   593     local lang_list
   594     local build_manuals
   595     local -a host_libstdcxx_flags
   596     local -a extra_config
   597     local -a final_LDFLAGS
   598     local tmp
   599     local arg
   600 
   601     for arg in "$@"; do
   602         eval "${arg// /\\ }"
   603     done
   604 
   605     CT_DoLog EXTRA "Configuring gcc"
   606 
   607     # Enable selected languages
   608     extra_config+=("--enable-languages=${lang_list}")
   609 
   610     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   611         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   612         if [ -n "${tmp}" ]; then
   613             extra_config+=("${tmp}")
   614         fi
   615     done
   616 
   617     [ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared")
   618     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   619         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   620         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   621     fi
   622     case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
   623         y)  extra_config+=("--enable-sjlj-exceptions");;
   624         m)  ;;
   625         "") extra_config+=("--disable-sjlj-exceptions");;
   626     esac
   627     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   628         extra_config+=("--enable-__cxa_atexit")
   629     else
   630         extra_config+=("--disable-__cxa_atexit")
   631     fi
   632     if [ -n "${CT_CC_ENABLE_CXX_FLAGS}" ]; then
   633         extra_config+=("--enable-cxx-flags=${CT_CC_ENABLE_CXX_FLAGS}")
   634     fi
   635     if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
   636         extra_config+=(--enable-libmudflap)
   637     else
   638         extra_config+=(--disable-libmudflap)
   639     fi
   640     if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
   641         extra_config+=(--enable-libgomp)
   642     else
   643         extra_config+=(--disable-libgomp)
   644     fi
   645     if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
   646         extra_config+=(--enable-libssp)
   647     else
   648         extra_config+=(--disable-libssp)
   649     fi
   650     if [ "${CT_CC_GCC_HAS_LIBQUADMATH}" = "y" ]; then
   651         if [ "${CT_CC_GCC_LIBQUADMATH}" = "y" ]; then
   652             extra_config+=(--enable-libquadmath)
   653             extra_config+=(--enable-libquadmath-support)
   654         else
   655             extra_config+=(--disable-libquadmath)
   656             extra_config+=(--disable-libquadmath-support)
   657         fi
   658     fi
   659 
   660     final_LDFLAGS+=("${ldflags}")
   661 
   662     # *** WARNING ! ***
   663     # Keep this full if-else-if-elif-fi-fi block in sync
   664     # with the same block in do_cc_core, above.
   665     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   666         final_LDFLAGS+=("-static")
   667         host_libstdcxx_flags+=("-static-libgcc")
   668         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   669         host_libstdcxx_flags+=("-lm")
   670         # Companion libraries are build static (eg !shared), so
   671         # the libstdc++ is not pulled automatically, although it
   672         # is needed. Shoe-horn it in our LDFLAGS
   673         # Ditto libm on some Fedora boxen
   674         final_LDFLAGS+=("-lstdc++")
   675         final_LDFLAGS+=("-lm")
   676     else
   677         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   678             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   679             # build script
   680             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   681             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   682             host_libstdcxx_flags+=("-static-libgcc")
   683             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   684             host_libstdcxx_flags+=("-lm")
   685         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   686             # When companion libraries are build static (eg !shared),
   687             # the libstdc++ is not pulled automatically, although it
   688             # is needed. Shoe-horn it in our LDFLAGS
   689             # Ditto libm on some Fedora boxen
   690             final_LDFLAGS+=("-lstdc++")
   691             final_LDFLAGS+=("-lm")
   692         fi
   693     fi
   694 
   695     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   696         extra_config+=("--with-gmp=${complibs}")
   697         extra_config+=("--with-mpfr=${complibs}")
   698     fi
   699     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   700         extra_config+=("--with-mpc=${complibs}")
   701     fi
   702     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   703         if [ "${CT_PPL}" = "y" ]; then
   704             extra_config+=("--with-ppl=${complibs}")
   705             # With PPL 0.11+, also pull libpwl if needed
   706             if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   707                 host_libstdcxx_flags+=("-L${complibs}/lib")
   708                 host_libstdcxx_flags+=("-lpwl")
   709             fi
   710         fi
   711         if [ "${CT_ISL}" = "y" ]; then
   712             extra_config+=("--with-isl=${complibs}")
   713         fi
   714         extra_config+=("--with-cloog=${complibs}")
   715     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   716         extra_config+=("--with-ppl=no")
   717         extra_config+=("--with-isl=no")
   718         extra_config+=("--with-cloog=no")
   719     fi
   720     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   721         extra_config+=("--with-libelf=${complibs}")
   722     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   723         extra_config+=("--with-libelf=no")
   724     fi
   725 
   726     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   727         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   728     fi
   729 
   730     if [ "${CT_THREADS}" = "none" ]; then
   731         extra_config+=("--disable-threads")
   732         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   733             CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
   734             extra_config+=("--disable-libgomp")
   735         fi
   736     else
   737         if [ "${CT_THREADS}" = "win32" ]; then
   738             extra_config+=("--enable-threads=win32")
   739             extra_config+=("--disable-win32-registry")
   740         else
   741             extra_config+=("--enable-threads=posix")
   742         fi
   743     fi
   744 
   745     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   746         extra_config+=("--enable-target-optspace")
   747     fi
   748     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   749         extra_config+=("--disable-libstdcxx-pch")
   750     fi
   751 
   752     case "${CT_CC_GCC_LDBL_128}" in
   753         y)  extra_config+=("--with-long-double-128");;
   754         m)  ;;
   755         "") extra_config+=("--without-long-double-128");;
   756     esac
   757 
   758     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   759         extra_config+=( --enable-linker-build-id )
   760     fi
   761 
   762     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   763         "") ;;
   764         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   765     esac
   766 
   767     if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
   768         extra_config+=( --enable-plugin )
   769     fi
   770     if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
   771         extra_config+=( --enable-gold )
   772     fi
   773 
   774     case "${CT_ARCH}" in
   775         mips)
   776             case "${CT_CC_GCC_mips_llsc}" in
   777                 y)  extra_config+=( --with-llsc );;
   778                 m)  ;;
   779                 *)  extra_config+=( --without-llsc );;
   780             esac
   781             case "${CT_CC_GCC_mips_synci}" in
   782                 y)  extra_config+=( --with-synci );;
   783                 m)  ;;
   784                 *)  extra_config+=( --without-synci );;
   785             esac
   786             if [ "${CT_CC_GCC_mips_plt}" ]; then
   787                 extra_config+=( --with-mips-plt )
   788             fi
   789             ;; # ARCH is mips
   790     esac
   791 
   792     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   793 
   794     if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
   795         extra_config+=("--with-system-zlib")
   796     fi
   797 
   798     if [ "${CT_MULTILIB}" = "y" ]; then
   799         extra_config+=("--enable-multilib")
   800     else
   801         extra_config+=("--disable-multilib")
   802     fi
   803 
   804     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   805 
   806     CT_DoExecLog CFG                                \
   807     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   808     CFLAGS="${cflags}"                              \
   809     LDFLAGS="${final_LDFLAGS[*]}"                   \
   810     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   811     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   812     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   813     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   814         --build=${CT_BUILD}                         \
   815         --host=${host}                              \
   816         --target=${CT_TARGET}                       \
   817         --prefix="${prefix}"                        \
   818         ${CC_SYSROOT_ARG}                           \
   819         "${extra_config[@]}"                        \
   820         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   821         --enable-c99                                \
   822         --enable-long-long                          \
   823         "${CT_CC_EXTRA_CONFIG_ARRAY[@]}"
   824 
   825     if [ "${CT_CANADIAN}" = "y" ]; then
   826         CT_DoLog EXTRA "Building libiberty"
   827         CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
   828     fi
   829 
   830     CT_DoLog EXTRA "Building gcc"
   831     CT_DoExecLog ALL make ${JOBSFLAGS} all
   832 
   833     CT_DoLog EXTRA "Installing gcc"
   834     CT_DoExecLog ALL make ${JOBSFLAGS} install
   835 
   836     if [ "${build_manuals}" = "yes" ]; then
   837         CT_DoLog EXTRA "Building the GCC manuals"
   838         CT_DoExecLog ALL make pdf html
   839         CT_DoLog EXTRA "Installing the GCC manuals"
   840         CT_DoExecLog ALL make install-{pdf,html}-gcc
   841     fi
   842 
   843     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   844     # to call the C compiler with the same, somewhat canonical name.
   845     # check whether compiler has an extension
   846     file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   847     [ -z "${file}" ] || ext=".${file##*.}"
   848     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   849 
   850     if [ "${CT_MULTILIB}" = "y" ]; then
   851         if [ "${CT_CANADIAN}" = "y" ]; then
   852             CT_DoLog WARN "Canadian Cross unable to confirm multilibs configured correctly"
   853         else
   854             multilibs=( $( "${prefix}/bin/${CT_TARGET}-gcc" -print-multi-lib \
   855                            |tail -n +2 ) )
   856             if [ ${#multilibs[@]} -ne 0 ]; then
   857                 CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
   858                 for i in "${multilibs[@]}"; do
   859                     dir="${i%%;*}"
   860                     flags="${i#*;}"
   861                     CT_DoLog EXTRA "   ${flags//@/ -}  -->  ${dir}/"
   862                 done
   863             else
   864                 CT_DoLog WARN "gcc configured for multilib, but none available"
   865             fi
   866         fi
   867     fi
   868 }