scripts/build/cc/gcc.sh
author Johannes Stezenbach <js@sig21.net>
Tue Oct 30 00:22:25 2012 +0000 (2012-10-30)
changeset 3097 5c67476c7342
parent 3088 7f5a3382968f
child 3119 1c56c03b7ed5
permissions -rw-r--r--
scripts/functions: fix endless loop in debug-shell with IO redirection

CT_DEBUG_INTERACTIVE is disabled when stdin, stdout or
stderr are redirected, but the check is only done at
the start of the build and doesn't catch when individual
build commands use redirection. When stdin is redirected
it will cause the debug shell to exit immediately, causing
and endless loop. Thus, save the stdin/our/err file handles
and restore them before invoking the debug shell.

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