scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Jan 22 23:20:18 2011 +0100 (2011-01-22)
changeset 2305 2ed26c646568
parent 2287 61608c9365ab
child 2355 e216439317bc
permissions -rw-r--r--
scripts: create the makeinfo wrapper before we set PATH

If we set PATH to the tools wrappers before we create the
makeinfo wrapper, then we may well wrap an existing wrapper
from a previous run.

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
    83             else
    84                 do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=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 core_prefix_dir
   118     local lang_opt
   119     local tmp
   120     local -a extra_config
   121     local -a core_LDFLAGS
   122     local -a core_targets
   123 
   124     while [ $# -ne 0 ]; do
   125         eval "${1}"
   126         shift
   127     done
   128 
   129     lang_opt=c
   130     case "${mode}" in
   131         static)
   132             core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
   133             extra_config+=("--with-newlib")
   134             extra_config+=("--enable-threads=no")
   135             extra_config+=("--disable-shared")
   136             copy_headers=y  # For baremetal, as there's no headers to copy,
   137                             # we copy an empty directory. So, who cares?
   138             ;;
   139         shared)
   140             core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
   141             extra_config+=("--enable-shared")
   142             copy_headers=y
   143             ;;
   144         baremetal)
   145             core_prefix_dir="${CT_PREFIX_DIR}"
   146             extra_config+=("--with-newlib")
   147             extra_config+=("--enable-threads=no")
   148             extra_config+=("--disable-shared")
   149             [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
   150             copy_headers=n
   151             ;;
   152         *)
   153             CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
   154             ;;
   155     esac
   156 
   157     CT_DoStep INFO "Installing ${mode} core C compiler"
   158     mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
   159     cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
   160 
   161     # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
   162     [ -n "${CT_CC_BUGURL}" ]     && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   163     [ -n "${CT_CC_PKGVERSION}" ] && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   164 
   165     if [ "${copy_headers}" = "y" ]; then
   166         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   167         CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${core_prefix_dir}/${CT_TARGET}/include"
   168     fi
   169 
   170     CT_DoLog EXTRA "Configuring ${mode} core C compiler"
   171 
   172     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   173         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   174         if [ -n "${tmp}" ]; then
   175             extra_config+=("${tmp}")
   176         fi
   177     done
   178     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   179         extra_config+=("--enable-__cxa_atexit")
   180     else
   181         extra_config+=("--disable-__cxa_atexit")
   182     fi
   183 
   184     # *** WARNING ! ***
   185     # Keep this full if-else-if-elif-fi-fi block in sync
   186     # with the same block in do_cc, below.
   187     if [ "${build_staticlinked}" = "yes" ]; then
   188         core_LDFLAGS+=("-static")
   189         extra_config+=("--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++ -lm")
   190         # Companion libraries are build static (eg !shared), so
   191         # the libstdc++ is not pulled automatically, although it
   192         # is needed. Shoe-horn it in our LDFLAGS
   193         # Ditto libm on some Fedora boxen
   194         final_LDFLAGS+=("-lstdc++")
   195         final_LDFLAGS+=("-lm")
   196     else
   197         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   198             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   199             # build script
   200             # FIXME: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   201             # see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   202             extra_config+=("--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm")
   203         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   204             # When companion libraries are build static (eg !shared),
   205             # the libstdc++ is not pulled automatically, although it
   206             # is needed. Shoe-horn it in our LDFLAGS
   207             # Ditto libm on some Fedora boxen
   208             core_LDFLAGS+=("-lstdc++")
   209             core_LDFLAGS+=("-lm")
   210         fi
   211     fi
   212 
   213     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   214         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   215         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   216     fi
   217     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   218         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   219     fi
   220     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   221         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   222         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   223     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   224         extra_config+=("--with-ppl=no")
   225         extra_config+=("--with-cloog=no")
   226     fi
   227     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   228         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   229         extra_config+=("--enable-lto")
   230     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   231         extra_config+=("--with-libelf=no")
   232         extra_config+=("--disable-lto")
   233     fi
   234 
   235     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   236         extra_config+=("--enable-target-optspace")
   237     fi
   238 
   239     case "${CT_CC_GCC_LDBL_128}" in
   240         y)  extra_config+=("--with-long-double-128");;
   241         m)  ;;
   242         "") extra_config+=("--without-long-double-128");;
   243     esac
   244 
   245     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   246 
   247     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   248     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   249     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   250     LDFLAGS="${core_LDFLAGS[*]}"                    \
   251     CT_DoExecLog CFG                                \
   252     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   253         --build=${CT_BUILD}                         \
   254         --host=${CT_HOST}                           \
   255         --target=${CT_TARGET}                       \
   256         --prefix="${core_prefix_dir}"               \
   257         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   258         --disable-multilib                          \
   259         --disable-libmudflap                        \
   260         ${CC_CORE_SYSROOT_ARG}                      \
   261         "${extra_config[@]}"                        \
   262         --disable-nls                               \
   263         --enable-symvers=gnu                        \
   264         --enable-languages="${lang_opt}"            \
   265         ${CT_CC_CORE_EXTRA_CONFIG}
   266 
   267     if [ "${build_libgcc}" = "yes" ]; then
   268         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   269         # gcc/config/t-libunwind so -lc is removed from the link for
   270         # libgcc_s.so, as we do not have a target -lc yet.
   271         # This is not as ugly as it appears to be ;-) All symbols get resolved
   272         # during the glibc build, and we provide a proper libgcc_s.so for the
   273         # cross toolchain during the final gcc build.
   274         #
   275         # As we cannot modify the source tree, nor override SHLIB_LC itself
   276         # during configure or make, we have to edit the resultant
   277         # gcc/libgcc.mk itself to remove -lc from the link.
   278         # This causes us to have to jump through some hoops...
   279         #
   280         # To produce libgcc.mk to edit we firstly require libiberty.a,
   281         # so we configure then build it.
   282         # Next we have to configure gcc, create libgcc.mk then edit it...
   283         # So much easier if we just edit the source tree, but hey...
   284         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   285             CT_DoExecLog CFG make configure-libiberty
   286             CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
   287             CT_DoExecLog CFG make configure-gcc configure-libcpp
   288             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
   289         else
   290             CT_DoExecLog CFG make configure-gcc configure-libcpp configure-build-libiberty
   291             CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
   292         fi
   293         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   294         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   295             CT_DoExecLog CFG make configure-libdecnumber
   296             CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
   297         fi
   298 
   299         # Starting with GCC 4.3, libgcc.mk is no longer built,
   300         # and libgcc.mvars is used instead.
   301 
   302         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   303             libgcc_rule="libgcc.mvars"
   304             core_targets=( gcc target-libgcc )
   305         else
   306             libgcc_rule="libgcc.mk"
   307             core_targets=( gcc )
   308         fi
   309 
   310         # On bare metal and canadian build the host-compiler is used when
   311         # actually the build-system compiler is required. Choose the correct
   312         # compilers for canadian build and use the defaults on other
   313         # configurations.
   314         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   315             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   316                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   317         else
   318             repair_cc=""
   319         fi
   320 
   321         CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
   322                               ${repair_cc}
   323         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   324     else # build_libgcc
   325         core_targets=( gcc )
   326     fi   # ! build libgcc
   327     if [    "${build_libstdcxx}" = "yes"    \
   328          -a "${CT_CC_LANG_CXX}"  = "y"      \
   329        ]; then
   330         core_targets+=( target-libstdc++-v3 )
   331     fi
   332 
   333     CT_DoLog EXTRA "Building ${mode} core C compiler"
   334     CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
   335 
   336     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   337     CT_DoExecLog ALL make "${core_targets[@]/#/install-}"
   338 
   339     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   340     # to call the C compiler with the same, somewhat canonical name.
   341     # check whether compiler has an extension
   342     file="$( ls -1 "${core_prefix_dir}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   343     [ -z "${file}" ] || ext=".${file##*.}"
   344     CT_DoExecLog ALL ln -sv "${CT_TARGET}-gcc${ext}" "${core_prefix_dir}/bin/${CT_TARGET}-cc${ext}"
   345 
   346     CT_EndStep
   347 }
   348 
   349 #------------------------------------------------------------------------------
   350 # Build final gcc
   351 do_cc() {
   352     local -a extra_config
   353     local -a final_LDFLAGS
   354     local tmp
   355 
   356     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   357     [ "${CT_BARE_METAL}" = "y" ] && return 0
   358 
   359     CT_DoStep INFO "Installing final compiler"
   360 
   361     mkdir -p "${CT_BUILD_DIR}/build-cc"
   362     cd "${CT_BUILD_DIR}/build-cc"
   363 
   364     CT_DoLog EXTRA "Configuring final compiler"
   365 
   366     # Enable selected languages
   367     lang_opt="c"
   368     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   369     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   370     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   371     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   372     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   373     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   374     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   375     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   376     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   377     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   378     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   379 
   380     extra_config+=("--enable-languages=${lang_opt}")
   381     extra_config+=("--disable-multilib")
   382     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   383         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   384         if [ -n "${tmp}" ]; then
   385             extra_config+=("${tmp}")
   386         fi
   387     done
   388 
   389     [ "${CT_SHARED_LIBS}" = "y" ]                   || extra_config+=("--disable-shared")
   390     [ -n "${CT_CC_PKGVERSION}" ]                    && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   391     [ -n "${CT_CC_BUGURL}" ]                        && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   392     case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
   393         y)  extra_config+=("--enable-sjlj-exceptions");;
   394         m)  ;;
   395         "") extra_config+=("--disable-sjlj-exceptions");;
   396     esac
   397     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   398         extra_config+=("--enable-__cxa_atexit")
   399     else
   400         extra_config+=("--disable-__cxa_atexit")
   401     fi
   402     if [ -n "${CC_ENABLE_CXX_FLAGS}" ]; then
   403         extra_config+=("--enable-cxx-flags=${CC_ENABLE_CXX_FLAGS}")
   404     fi
   405     if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
   406         extra_config+=(--enable-libmudflap)
   407     else
   408         extra_config+=(--disable-libmudflap)
   409     fi
   410     if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
   411         extra_config+=(--enable-libgomp)
   412     else
   413         extra_config+=(--disable-libgomp)
   414     fi
   415     if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
   416         extra_config+=(--enable-libssp)
   417     else
   418         extra_config+=(--disable-libssp)
   419     fi
   420 
   421     # *** WARNING ! ***
   422     # Keep this full if-else-if-elif-fi-fi block in sync
   423     # with the same block in do_cc_core, above.
   424     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   425         final_LDFLAGS+=("-static")
   426         extra_config+=("--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++ -lm")
   427         # Companion libraries are build static (eg !shared), so
   428         # the libstdc++ is not pulled automatically, although it
   429         # is needed. Shoe-horn it in our LDFLAGS
   430         # Ditto libm on some Fedora boxen
   431         final_LDFLAGS+=("-lstdc++")
   432         final_LDFLAGS+=("-lm")
   433     else
   434         if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
   435             # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
   436             # build script
   437             # FIXME: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
   438             # see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
   439             extra_config+=("--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm")
   440         elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   441             # When companion libraries are build static (eg !shared),
   442             # the libstdc++ is not pulled automatically, although it
   443             # is needed. Shoe-horn it in our LDFLAGS
   444             # Ditto libm on some Fedora boxen
   445             final_LDFLAGS+=("-lstdc++")
   446             final_LDFLAGS+=("-lm")
   447         fi
   448     fi
   449 
   450     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   451         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   452         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   453     fi
   454     if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
   455         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   456     fi
   457     if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
   458         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   459         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   460     elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
   461         extra_config+=("--with-ppl=no")
   462         extra_config+=("--with-cloog=no")
   463     fi
   464     if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
   465         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   466     elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
   467         extra_config+=("--with-libelf=no")
   468     fi
   469 
   470     if [ "${CT_THREADS}" = "none" ]; then
   471         extra_config+=("--disable-threads")
   472         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   473             CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
   474             extra_config+=("--disable-libgomp")
   475         fi
   476     else
   477         if [ "${CT_THREADS}" = "win32" ]; then
   478             extra_config+=("--enable-threads=win32")
   479             extra_config+=("--disable-win32-registry")
   480         else
   481             extra_config+=("--enable-threads=posix")
   482         fi
   483     fi
   484 
   485     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   486         extra_config+=("--enable-target-optspace")
   487     fi
   488     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   489         extra_config+=("--disable-libstdcxx-pch")
   490     fi
   491 
   492     case "${CT_CC_GCC_LDBL_128}" in
   493         y)  extra_config+=("--with-long-double-128");;
   494         m)  ;;
   495         "") extra_config+=("--without-long-double-128");;
   496     esac
   497 
   498     if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
   499         extra_config+=( --enable-plugin )
   500     fi
   501     if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
   502         extra_config+=( --enable-gold )
   503     fi
   504 
   505     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   506 
   507     # --enable-symvers=gnu really only needed for sh4 to work around a
   508     # detection problem only matters for gcc-3.2.x and later, I think.
   509     # --disable-nls to work around crash bug on ppc405, but also because
   510     # embedded systems don't really need message catalogs...
   511     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   512     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   513     LDFLAGS="${final_LDFLAGS[*]}"                   \
   514     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   515     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   516     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   517     CT_DoExecLog CFG                                \
   518     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   519         --build=${CT_BUILD}                         \
   520         --host=${CT_HOST}                           \
   521         --target=${CT_TARGET}                       \
   522         --prefix="${CT_PREFIX_DIR}"                 \
   523         ${CC_SYSROOT_ARG}                           \
   524         "${extra_config[@]}"                        \
   525         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   526         --disable-nls                               \
   527         --enable-symvers=gnu                        \
   528         --enable-c99                                \
   529         --enable-long-long                          \
   530         ${CT_CC_EXTRA_CONFIG}
   531 
   532     if [ "${CT_CANADIAN}" = "y" ]; then
   533         CT_DoLog EXTRA "Building libiberty"
   534         CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
   535     fi
   536 
   537     CT_DoLog EXTRA "Building final compiler"
   538     CT_DoExecLog ALL make ${JOBSFLAGS} all
   539 
   540     CT_DoLog EXTRA "Installing final compiler"
   541     CT_DoExecLog ALL make install
   542 
   543     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   544     # to call the C compiler with the same, somewhat canonical name.
   545     # check whether compiler has an extension
   546     file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   547     [ -z "${file}" ] || ext=".${file##*.}"
   548     CT_DoExecLog ALL ln -sv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   549 
   550     CT_EndStep
   551 }