scripts/build/cc/gcc.sh
author Michael Hope <michael.hope@linaro.org>
Wed Nov 16 10:06:21 2011 +1300 (2011-11-16)
changeset 2765 6c5658b8b588
parent 2676 af542a04bf69
child 2780 03ab39f149b4
permissions -rw-r--r--
scripts: add support for building manuals

Add support for building the HTML and PDF manuals for the major
components. Implement for binutils, GCC, GDB, and GLIBC.

Always build all manuals and install a subset. Be explicit about the
subset to reduce the clutter and to avoid getting copies of common
manuals like bfd from all of the sourceware based components. Downside of
being explicit is that you need to update it when a new component
comes along.

Build the manuals as part of the last GCC build, namely 'cc' for glibc
based ones and cc_core_pass_2 for baremetal.

An example of the output is at:
http://people.linaro.org/~michaelh/incoming/crosstool-NG/

Signed-off-by: Michael Hope <michael.hope@linaro.org>
[yann.morin.1998@anciens.enib.fr: depends on ! remove docs; gold manual install]
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     # If we're building for bare metal, build the static core gcc,
    59     # with libgcc.
    60     # In case we're not bare metal and building a canadian compiler, do nothing
    61     # In case we're not bare metal, and we're NPTL, build the static core gcc.
    62     # In any other case, do nothing.
    63     case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
    64         y,*,*)  do_cc_core mode=static;;
    65         ,y,*)   ;;
    66         ,,nptl) do_cc_core mode=static;;
    67         *)      ;;
    68     esac
    69 }
    70 
    71 # Core gcc pass 2
    72 do_cc_core_pass_2() {
    73     # In case we're building for bare metal, do nothing, we already have
    74     # our compiler.
    75     # In case we're not bare metal and building a canadian compiler, do nothing
    76     # In case we're NPTL, build the shared core gcc and the target libgcc.
    77     # In any other case, build the static core gcc and, if using gcc-4.3+,
    78     # also build the target libgcc.
    79     case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
    80         y,*,*)
    81             if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
    82                 do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=yes build_staticlinked=yes build_manuals=yes
    83             else
    84                 do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=yes build_manuals=yes
    85             fi
    86             ;;
    87         ,y,*)   ;;
    88         ,,nptl)
    89             do_cc_core mode=shared build_libgcc=yes
    90             ;;
    91         ,,win32)
    92             do_cc_core mode=static build_libgcc=yes
    93             ;;
    94         *)  if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
    95                 do_cc_core mode=static build_libgcc=yes
    96             else
    97                 do_cc_core mode=static
    98             fi
    99             ;;
   100     esac
   101 }
   102 
   103 #------------------------------------------------------------------------------
   104 # Build core gcc
   105 # This function is used to build both the static and the shared core C conpiler,
   106 # with or without the target libgcc. We need to know wether:
   107 #  - we're building static, shared or bare metal: mode=[static|shared|baremetal]
   108 #  - we need to build libgcc or not             : build_libgcc=[yes|no]       (default: no)
   109 #  - we need to build libstdc++ or not          : build_libstdcxx=[yes|no]    (default: no)
   110 #  - we need to build statically linked or not  : build_staticlinked=[yes|no] (default: no)
   111 # Usage: do_cc_core mode=[static|shared|baremetal] build_libgcc=[yes|no] build_staticlinked=[yes|no]
   112 do_cc_core() {
   113     local mode
   114     local build_libgcc=no
   115     local build_libstdcxx=no
   116     local build_staticlinked=no
   117     local build_manuals=no
   118     local core_prefix_dir
   119     local lang_opt
   120     local tmp
   121     local -a host_libstdcxx_flags
   122     local -a extra_config
   123     local -a core_LDFLAGS
   124     local -a core_targets
   125 
   126     while [ $# -ne 0 ]; do
   127         eval "${1// /\\ }"
   128         shift
   129     done
   130 
   131     lang_opt=c
   132     case "${mode}" in
   133         static)
   134             core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
   135             extra_config+=("--with-newlib")
   136             extra_config+=("--enable-threads=no")
   137             extra_config+=("--disable-shared")
   138             copy_headers=y  # For baremetal, as there's no headers to copy,
   139                             # we copy an empty directory. So, who cares?
   140             ;;
   141         shared)
   142             core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
   143             extra_config+=("--enable-shared")
   144             copy_headers=y
   145             ;;
   146         baremetal)
   147             core_prefix_dir="${CT_PREFIX_DIR}"
   148             extra_config+=("--with-newlib")
   149             extra_config+=("--enable-threads=no")
   150             extra_config+=("--disable-shared")
   151             [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
   152             copy_headers=n
   153             ;;
   154         *)
   155             CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
   156             ;;
   157     esac
   158 
   159     CT_DoStep INFO "Installing ${mode} core C compiler"
   160     mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
   161     cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
   162 
   163     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   164         # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
   165         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   166         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   167     fi
   168 
   169     if [ "${copy_headers}" = "y" ]; then
   170         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   171         CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${core_prefix_dir}/${CT_TARGET}/include"
   172     fi
   173 
   174     CT_DoLog EXTRA "Configuring ${mode} core C compiler"
   175 
   176     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   177         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   178         if [ -n "${tmp}" ]; then
   179             extra_config+=("${tmp}")
   180         fi
   181     done
   182     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   183         extra_config+=("--enable-__cxa_atexit")
   184     else
   185         extra_config+=("--disable-__cxa_atexit")
   186     fi
   187 
   188     # *** WARNING ! ***
   189     # Keep this full if-else-if-elif-fi-fi block in sync
   190     # with the same block in do_cc, below.
   191     if [ "${build_staticlinked}" = "yes" ]; then
   192         core_LDFLAGS+=("-static")
   193         host_libstdcxx_flags+=("-static-libgcc")
   194         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   195         host_libstdcxx_flags+=("-lm")
   196         # Companion libraries are build static (eg !shared), so
   197         # the libstdc++ is not pulled automatically, although it
   198         # is needed. Shoe-horn it in our LDFLAGS
   199         # Ditto libm on some Fedora boxen
   200         core_LDFLAGS+=("-lstdc++")
   201         core_LDFLAGS+=("-lm")
   202     else
   203         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   204             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   205             # build script
   206             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   207             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   208             host_libstdcxx_flags+=("-static-libgcc")
   209             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   210             host_libstdcxx_flags+=("-lm")
   211         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   212             # When companion libraries are build static (eg !shared),
   213             # the libstdc++ is not pulled automatically, although it
   214             # is needed. Shoe-horn it in our LDFLAGS
   215             # Ditto libm on some Fedora boxen
   216             core_LDFLAGS+=("-lstdc++")
   217             core_LDFLAGS+=("-lm")
   218         fi
   219     fi
   220 
   221     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   222         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   223         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   224     fi
   225     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   226         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   227     fi
   228     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   229         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   230         # With PPL 0.11+, also pull libpwl if needed
   231         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   232             host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
   233             host_libstdcxx_flags+=("-lpwl")
   234         fi
   235         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   236     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   237         extra_config+=("--with-ppl=no")
   238         extra_config+=("--with-cloog=no")
   239     fi
   240     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   241         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   242         extra_config+=("--enable-lto")
   243     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   244         extra_config+=("--with-libelf=no")
   245         extra_config+=("--disable-lto")
   246     fi
   247 
   248     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   249         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   250     fi
   251 
   252     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   253         extra_config+=("--enable-target-optspace")
   254     fi
   255 
   256     case "${CT_CC_GCC_LDBL_128}" in
   257         y)  extra_config+=("--with-long-double-128");;
   258         m)  ;;
   259         "") extra_config+=("--without-long-double-128");;
   260     esac
   261 
   262     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   263         extra_config+=( --enable-linker-build-id )
   264     fi
   265 
   266     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   267         "") ;;
   268         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   269     esac
   270 
   271     case "${CT_ARCH}" in
   272         mips)
   273             case "${CT_CC_GCC_mips_llsc}" in
   274                 y)  extra_config+=( --with-llsc );;
   275                 m)  ;;
   276                 *)  extra_config+=( --without-llsc );;
   277             esac
   278             case "${CT_CC_GCC_mips_synci}" in
   279                 y)  extra_config+=( --with-synci );;
   280                 m)  ;;
   281                 *)  extra_config+=( --without-synci );;
   282             esac
   283             if [ "${CT_CC_GCC_mips_plt}" ]; then
   284                 extra_config+=( --with-mips-plt )
   285             fi
   286             ;; # ARCH is mips
   287     esac
   288 
   289     extra_config+=(--disable-libgomp)
   290     extra_config+=(--disable-libmudflap)
   291 
   292     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   293 
   294     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   295     CT_DoExecLog CFG                                \
   296     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   297     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   298     LDFLAGS="${core_LDFLAGS[*]}"                    \
   299     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   300         --build=${CT_BUILD}                         \
   301         --host=${CT_HOST}                           \
   302         --target=${CT_TARGET}                       \
   303         --prefix="${core_prefix_dir}"               \
   304         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   305         --disable-multilib                          \
   306         --disable-libmudflap                        \
   307         ${CC_CORE_SYSROOT_ARG}                      \
   308         "${extra_config[@]}"                        \
   309         --disable-nls                               \
   310         --enable-languages="${lang_opt}"            \
   311         "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}"
   312 
   313     if [ "${build_libgcc}" = "yes" ]; then
   314         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   315         # gcc/config/t-libunwind so -lc is removed from the link for
   316         # libgcc_s.so, as we do not have a target -lc yet.
   317         # This is not as ugly as it appears to be ;-) All symbols get resolved
   318         # during the glibc build, and we provide a proper libgcc_s.so for the
   319         # cross toolchain during the final gcc build.
   320         #
   321         # As we cannot modify the source tree, nor override SHLIB_LC itself
   322         # during configure or make, we have to edit the resultant
   323         # gcc/libgcc.mk itself to remove -lc from the link.
   324         # This causes us to have to jump through some hoops...
   325         #
   326         # To produce libgcc.mk to edit we firstly require libiberty.a,
   327         # so we configure then build it.
   328         # Next we have to configure gcc, create libgcc.mk then edit it...
   329         # So much easier if we just edit the source tree, but hey...
   330         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   331             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libiberty
   332             CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
   333             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp
   334             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
   335         else
   336             CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp configure-build-libiberty
   337             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
   338         fi
   339         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   340         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   341             CT_DoExecLog CFG make ${JOBSFLAGS} configure-libdecnumber
   342             CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
   343         fi
   344 
   345         # Starting with GCC 4.3, libgcc.mk is no longer built,
   346         # and libgcc.mvars is used instead.
   347 
   348         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   349             libgcc_rule="libgcc.mvars"
   350             core_targets=( gcc target-libgcc )
   351         else
   352             libgcc_rule="libgcc.mk"
   353             core_targets=( gcc )
   354         fi
   355 
   356         # On bare metal and canadian build the host-compiler is used when
   357         # actually the build-system compiler is required. Choose the correct
   358         # compilers for canadian build and use the defaults on other
   359         # configurations.
   360         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   361             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   362                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   363         else
   364             repair_cc=""
   365         fi
   366 
   367         CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
   368                               ${repair_cc}
   369         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   370     else # build_libgcc
   371         core_targets=( gcc )
   372     fi   # ! build libgcc
   373     if [    "${build_libstdcxx}" = "yes"    \
   374          -a "${CT_CC_LANG_CXX}"  = "y"      \
   375        ]; then
   376         core_targets+=( target-libstdc++-v3 )
   377     fi
   378 
   379     CT_DoLog EXTRA "Building ${mode} core C compiler"
   380     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
   381 
   382     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   383     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/install-}"
   384 
   385     if [ "${CT_BUILD_MANUALS}" = "y" -a "${build_manuals}" = "yes" ]; then
   386         CT_DoLog EXTRA "Building the GCC manuals"
   387         CT_DoExecLog ALL make pdf html
   388         CT_DoLog EXTRA "Installing the GCC manuals"
   389         CT_DoExecLog ALL make install-{pdf,html}-gcc
   390     fi
   391 
   392     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   393     # to call the C compiler with the same, somewhat canonical name.
   394     # check whether compiler has an extension
   395     file="$( ls -1 "${core_prefix_dir}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   396     [ -z "${file}" ] || ext=".${file##*.}"
   397     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${core_prefix_dir}/bin/${CT_TARGET}-cc${ext}"
   398 
   399     CT_EndStep
   400 }
   401 
   402 #------------------------------------------------------------------------------
   403 # Build final gcc
   404 do_cc() {
   405     local -a host_libstdcxx_flags
   406     local -a extra_config
   407     local -a final_LDFLAGS
   408     local tmp
   409 
   410     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   411     [ "${CT_BARE_METAL}" = "y" ] && return 0
   412 
   413     CT_DoStep INFO "Installing final compiler"
   414 
   415     mkdir -p "${CT_BUILD_DIR}/build-cc"
   416     cd "${CT_BUILD_DIR}/build-cc"
   417 
   418     CT_DoLog EXTRA "Configuring final compiler"
   419 
   420     # Enable selected languages
   421     lang_opt="c"
   422     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   423     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   424     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   425     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   426     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   427     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   428     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   429     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   430     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   431     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   432     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   433 
   434     extra_config+=("--enable-languages=${lang_opt}")
   435     extra_config+=("--disable-multilib")
   436     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   437         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   438         if [ -n "${tmp}" ]; then
   439             extra_config+=("${tmp}")
   440         fi
   441     done
   442 
   443     [ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared")
   444     if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   445         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   446         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   447     fi
   448     case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
   449         y)  extra_config+=("--enable-sjlj-exceptions");;
   450         m)  ;;
   451         "") extra_config+=("--disable-sjlj-exceptions");;
   452     esac
   453     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   454         extra_config+=("--enable-__cxa_atexit")
   455     else
   456         extra_config+=("--disable-__cxa_atexit")
   457     fi
   458     if [ -n "${CT_CC_ENABLE_CXX_FLAGS}" ]; then
   459         extra_config+=("--enable-cxx-flags=${CT_CC_ENABLE_CXX_FLAGS}")
   460     fi
   461     if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
   462         extra_config+=(--enable-libmudflap)
   463     else
   464         extra_config+=(--disable-libmudflap)
   465     fi
   466     if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
   467         extra_config+=(--enable-libgomp)
   468     else
   469         extra_config+=(--disable-libgomp)
   470     fi
   471     if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
   472         extra_config+=(--enable-libssp)
   473     else
   474         extra_config+=(--disable-libssp)
   475     fi
   476 
   477     # *** WARNING ! ***
   478     # Keep this full if-else-if-elif-fi-fi block in sync
   479     # with the same block in do_cc_core, above.
   480     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   481         final_LDFLAGS+=("-static")
   482         host_libstdcxx_flags+=("-static-libgcc")
   483         host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
   484         host_libstdcxx_flags+=("-lm")
   485         # Companion libraries are build static (eg !shared), so
   486         # the libstdc++ is not pulled automatically, although it
   487         # is needed. Shoe-horn it in our LDFLAGS
   488         # Ditto libm on some Fedora boxen
   489         final_LDFLAGS+=("-lstdc++")
   490         final_LDFLAGS+=("-lm")
   491     else
   492         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   493             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   494             # build script
   495             # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   496             #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   497             host_libstdcxx_flags+=("-static-libgcc")
   498             host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
   499             host_libstdcxx_flags+=("-lm")
   500         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   501             # When companion libraries are build static (eg !shared),
   502             # the libstdc++ is not pulled automatically, although it
   503             # is needed. Shoe-horn it in our LDFLAGS
   504             # Ditto libm on some Fedora boxen
   505             final_LDFLAGS+=("-lstdc++")
   506             final_LDFLAGS+=("-lm")
   507         fi
   508     fi
   509 
   510     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   511         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   512         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   513     fi
   514     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   515         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   516     fi
   517     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   518         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   519         # With PPL 0.11+, also pull libpwl if needed
   520         if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
   521             host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
   522             host_libstdcxx_flags+=("-lpwl")
   523         fi
   524         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   525     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   526         extra_config+=("--with-ppl=no")
   527         extra_config+=("--with-cloog=no")
   528     fi
   529     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   530         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   531     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   532         extra_config+=("--with-libelf=no")
   533     fi
   534 
   535     if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
   536         extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
   537     fi
   538 
   539     if [ "${CT_THREADS}" = "none" ]; then
   540         extra_config+=("--disable-threads")
   541         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   542             CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
   543             extra_config+=("--disable-libgomp")
   544         fi
   545     else
   546         if [ "${CT_THREADS}" = "win32" ]; then
   547             extra_config+=("--enable-threads=win32")
   548             extra_config+=("--disable-win32-registry")
   549         else
   550             extra_config+=("--enable-threads=posix")
   551         fi
   552     fi
   553 
   554     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   555         extra_config+=("--enable-target-optspace")
   556     fi
   557     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   558         extra_config+=("--disable-libstdcxx-pch")
   559     fi
   560 
   561     case "${CT_CC_GCC_LDBL_128}" in
   562         y)  extra_config+=("--with-long-double-128");;
   563         m)  ;;
   564         "") extra_config+=("--without-long-double-128");;
   565     esac
   566 
   567     if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
   568         extra_config+=( --enable-linker-build-id )
   569     fi
   570 
   571     case "${CT_CC_GCC_LNK_HASH_STYLE}" in
   572         "") ;;
   573         *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
   574     esac
   575 
   576     if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
   577         extra_config+=( --enable-plugin )
   578     fi
   579     if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
   580         extra_config+=( --enable-gold )
   581     fi
   582 
   583     case "${CT_ARCH}" in
   584         mips)
   585             case "${CT_CC_GCC_mips_llsc}" in
   586                 y)  extra_config+=( --with-llsc );;
   587                 m)  ;;
   588                 *)  extra_config+=( --without-llsc );;
   589             esac
   590             case "${CT_CC_GCC_mips_synci}" in
   591                 y)  extra_config+=( --with-synci );;
   592                 m)  ;;
   593                 *)  extra_config+=( --without-synci );;
   594             esac
   595             if [ "${CT_CC_GCC_mips_plt}" ]; then
   596                 extra_config+=( --with-mips-plt )
   597             fi
   598             ;; # ARCH is mips
   599     esac
   600 
   601     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   602 
   603     # --disable-nls to work around crash bug on ppc405, but also because
   604     # embedded systems don't really need message catalogs...
   605     CT_DoExecLog CFG                                \
   606     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   607     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   608     LDFLAGS="${final_LDFLAGS[*]}"                   \
   609     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   610     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   611     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   612     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   613         --build=${CT_BUILD}                         \
   614         --host=${CT_HOST}                           \
   615         --target=${CT_TARGET}                       \
   616         --prefix="${CT_PREFIX_DIR}"                 \
   617         ${CC_SYSROOT_ARG}                           \
   618         "${extra_config[@]}"                        \
   619         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   620         --disable-nls                               \
   621         --enable-c99                                \
   622         --enable-long-long                          \
   623         "${CT_CC_EXTRA_CONFIG_ARRAY[@]}"
   624 
   625     if [ "${CT_CANADIAN}" = "y" ]; then
   626         CT_DoLog EXTRA "Building libiberty"
   627         CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
   628     fi
   629 
   630     CT_DoLog EXTRA "Building final compiler"
   631     CT_DoExecLog ALL make ${JOBSFLAGS} all
   632 
   633     CT_DoLog EXTRA "Installing final compiler"
   634     CT_DoExecLog ALL make ${JOBSFLAGS} install
   635 
   636     if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   637         CT_DoLog EXTRA "Building the GCC manuals"
   638         CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
   639         CT_DoLog EXTRA "Installing the GCC manuals"
   640         CT_DoExecLog ALL make install-{pdf,html}-gcc
   641     fi
   642 
   643     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   644     # to call the C compiler with the same, somewhat canonical name.
   645     # check whether compiler has an extension
   646     file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   647     [ -z "${file}" ] || ext=".${file##*.}"
   648     CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   649 
   650     CT_EndStep
   651 }