scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 22:43:07 2011 +0200 (2011-07-17)
changeset 2893 a8a65758664f
parent 2892 aa934ec4b4ee
child 2894 7c6f2d990384
permissions -rw-r--r--
cc/gcc: do not use the core pass-2 to build the baremetal compiler

In case we build a baremetal compiler, use the standard passes:
- core_cc is used to build the C library;
- as such, it is meant to run on build, not host;
- the final compiler is meant to run on host;

As the current final compiler step can not build a baremetal compiler,
call the core backend from the final step.

NB: Currently, newlib is built during the start_files pass, so we have
to have a core compiler by then... Once we can build the baremetal
compiler from the final cc step, then we can move the newlib build to
the proper step, and then get rid of the core pass-1 static compiler...

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