scripts/build/cc/gcc.sh
author Remy Bohmer <linux@bohmer.net>
Sun Jul 11 22:23:34 2010 +0200 (2010-07-11)
changeset 2021 3e52a1510f87
parent 2014 cd9322b076d7
child 2031 3917f2dafed1
permissions -rw-r--r--
debug/gdb: Fix compilation for Mingw hosts

GDB requires PDcurses instead of ncurses while running on Windows.
So, do not always compile ncurses in case GDB needs to build.

PDcurses is provided by an earlier build step and is not described in
this file.

Signed-off-by: Remy Bohmer <linux@bohmer.net>
[yann.morin.1998@anciense.nib.fr: we already have a way to detect ncurses usage]
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     # Ah! gcc folks are kind of 'different': they store the tarballs in
     8     # subdirectories of the same name! That's because gcc is such /crap/ that
     9     # it is such /big/ that it needs being splitted for distribution! Sad. :-(
    10     # Arrgghh! Some of those versions does not follow this convention:
    11     # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
    12     # subdirectory! You bastard!
    13     CT_GetFile "gcc-${CT_CC_VERSION}"                                                       \
    14                {ftp,http}://ftp.gnu.org/gnu/gcc{,{,/releases}/gcc-${CT_CC_VERSION}}         \
    15                ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-${CT_CC_VERSION} \
    16                ftp://ftp.uvsq.fr/pub/gcc/snapshots/${CT_CC_VERSION}
    17 
    18     # Starting with GCC 4.3, ecj is used for Java, and will only be
    19     # built if the configure script finds ecj.jar at the top of the
    20     # GCC source tree, which will not be there unless we get it and
    21     # put it there ourselves
    22     if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y" ]; then
    23         CT_GetFile ecj-latest .jar ftp://gcc.gnu.org/pub/java   \
    24                                    ftp://sourceware.org/pub/java
    25     fi
    26 }
    27 
    28 # Extract gcc
    29 do_cc_extract() {
    30     CT_Extract "gcc-${CT_CC_VERSION}"
    31     CT_Patch "gcc" "${CT_CC_VERSION}"
    32 
    33     # Copy ecj-latest.jar to ecj.jar at the top of the GCC source tree
    34     if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y"                     \
    35          -a ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"   \
    36        ]; then
    37         CT_DoExecLog ALL cp -v "${CT_TARBALLS_DIR}/ecj-latest.jar" "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"
    38     fi
    39 }
    40 
    41 #------------------------------------------------------------------------------
    42 # Core gcc pass 1
    43 do_cc_core_pass_1() {
    44     # If we're building for bare metal, build the static core gcc,
    45     # with libgcc.
    46     # In case we're not bare metal and building a canadian compiler, do nothing
    47     # In case we're not bare metal, and we're NPTL, build the static core gcc.
    48     # In any other case, do nothing.
    49     case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
    50         y,*,*)  do_cc_core mode=static;;
    51         ,y,*)   ;;
    52         ,,nptl) do_cc_core mode=static;;
    53         *)      ;;
    54     esac
    55 }
    56 
    57 # Core gcc pass 2
    58 do_cc_core_pass_2() {
    59     # In case we're building for bare metal, do nothing, we already have
    60     # our compiler.
    61     # In case we're not bare metal and building a canadian compiler, do nothing
    62     # In case we're NPTL, build the shared core gcc and the target libgcc.
    63     # In any other case, build the static core gcc and, if using gcc-4.3+,
    64     # also build the target libgcc.
    65     case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
    66         y,*,*)  do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=yes;;
    67         ,y,*)   ;;
    68         ,,nptl)
    69             do_cc_core mode=shared build_libgcc=yes
    70             ;;
    71         ,,win32) do_cc_core mode=static build_libgcc=yes
    72             ;;
    73         *)  if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
    74                 do_cc_core mode=static build_libgcc=yes
    75             else
    76                 do_cc_core mode=static
    77             fi
    78             ;;
    79     esac
    80 }
    81 
    82 #------------------------------------------------------------------------------
    83 # Build core gcc
    84 # This function is used to build both the static and the shared core C conpiler,
    85 # with or without the target libgcc. We need to know wether:
    86 #  - we're building static, shared or bare metal: mode=[static|shared|baremetal]
    87 #  - we need to build libgcc or not             : build_libgcc=[yes|no]     (default: no)
    88 #  - we need to build libstdc++ or not          : build_libstdcxx=[yes|no]  (default: no)
    89 # Usage: do_cc_core_static mode=[static|shared|baremetal] build_libgcc=[yes|no]
    90 do_cc_core() {
    91     local mode
    92     local build_libgcc=no
    93     local build_libstdcxx=no
    94     local core_prefix_dir
    95     local lang_opt
    96     local tmp
    97     local -a extra_config
    98     local core_LDFLAGS
    99     local -a core_targets
   100 
   101     while [ $# -ne 0 ]; do
   102         eval "${1}"
   103         shift
   104     done
   105 
   106     lang_opt=c
   107     case "${mode}" in
   108         static)
   109             core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
   110             extra_config+=("--with-newlib")
   111             extra_config+=("--enable-threads=no")
   112             extra_config+=("--disable-shared")
   113             copy_headers=y  # For baremetal, as there's no headers to copy,
   114                             # we copy an empty directory. So, who cares?
   115             ;;
   116         shared)
   117             core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
   118             extra_config+=("--enable-shared")
   119             copy_headers=y
   120             ;;
   121         baremetal)
   122             core_prefix_dir="${CT_PREFIX_DIR}"
   123             extra_config+=("--with-newlib")
   124             extra_config+=("--enable-threads=no")
   125             extra_config+=("--disable-shared")
   126             [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
   127             copy_headers=n
   128             ;;
   129         *)
   130             CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
   131             ;;
   132     esac
   133 
   134     CT_DoStep INFO "Installing ${mode} core C compiler"
   135     mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
   136     cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
   137 
   138     # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
   139     [ -n "${CT_CC_BUGURL}" ]     && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   140     [ -n "${CT_CC_PKGVERSION}" ] && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   141 
   142     if [ "${copy_headers}" = "y" ]; then
   143         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   144         CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${core_prefix_dir}/${CT_TARGET}/include"
   145     fi
   146 
   147     CT_DoLog EXTRA "Configuring ${mode} core C compiler"
   148 
   149     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   150         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   151         if [ -n "${tmp}" ]; then
   152             extra_config+=("${tmp}")
   153         fi
   154     done
   155     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   156         extra_config+=("--enable-__cxa_atexit")
   157     else
   158         extra_config+=("--disable-__cxa_atexit")
   159     fi
   160 
   161     # When companion libraries are build static (eg !shared),
   162     # the libstdc++ is not pulled automatically, although it
   163     # is needed. Shoe-horn it in our LDFLAGS
   164     if [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   165         core_LDFLAGS='-lstdc++'
   166     fi
   167     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   168         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   169         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   170     fi
   171     if [ "${CT_CC_GCC_USE_PPL_CLOOG}" = "y" ]; then
   172         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   173         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   174     fi
   175     if [ "${CT_CC_GCC_USE_MPC_LIBELF}" = "y" ]; then
   176         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   177         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   178     fi
   179 
   180     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   181         extra_config+=("--enable-target-optspace")
   182     fi
   183 
   184     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   185 
   186     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   187     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   188     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   189     LDFLAGS="${core_LDFLAGS}"                       \
   190     CT_DoExecLog ALL                                \
   191     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   192         --build=${CT_BUILD}                         \
   193         --host=${CT_HOST}                           \
   194         --target=${CT_TARGET}                       \
   195         --prefix="${core_prefix_dir}"               \
   196         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   197         --disable-multilib                          \
   198         ${CC_CORE_SYSROOT_ARG}                      \
   199         "${extra_config[@]}"                        \
   200         --disable-nls                               \
   201         --enable-symvers=gnu                        \
   202         --enable-languages="${lang_opt}"            \
   203         ${CT_CC_CORE_EXTRA_CONFIG}
   204 
   205     if [ "${build_libgcc}" = "yes" ]; then
   206         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   207         # gcc/config/t-libunwind so -lc is removed from the link for
   208         # libgcc_s.so, as we do not have a target -lc yet.
   209         # This is not as ugly as it appears to be ;-) All symbols get resolved
   210         # during the glibc build, and we provide a proper libgcc_s.so for the
   211         # cross toolchain during the final gcc build.
   212         #
   213         # As we cannot modify the source tree, nor override SHLIB_LC itself
   214         # during configure or make, we have to edit the resultant
   215         # gcc/libgcc.mk itself to remove -lc from the link.
   216         # This causes us to have to jump through some hoops...
   217         #
   218         # To produce libgcc.mk to edit we firstly require libiberty.a,
   219         # so we configure then build it.
   220         # Next we have to configure gcc, create libgcc.mk then edit it...
   221         # So much easier if we just edit the source tree, but hey...
   222         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   223             CT_DoExecLog ALL make configure-libiberty
   224             CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libiberty libiberty.a
   225             CT_DoExecLog ALL make configure-gcc configure-libcpp
   226             CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp
   227         else
   228             CT_DoExecLog ALL make configure-gcc configure-libcpp configure-build-libiberty
   229             CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp all-build-libiberty
   230         fi
   231         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   232         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   233             CT_DoExecLog ALL make configure-libdecnumber
   234             CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libdecnumber libdecnumber.a
   235         fi
   236 
   237         # Starting with GCC 4.3, libgcc.mk is no longer built,
   238         # and libgcc.mvars is used instead.
   239 
   240         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   241             libgcc_rule="libgcc.mvars"
   242             core_targets=( gcc target-libgcc )
   243         else
   244             libgcc_rule="libgcc.mk"
   245             core_targets=( gcc )
   246         fi
   247 
   248         # On bare metal and canadian build the host-compiler is used when
   249         # actually the build-system compiler is required. Choose the correct
   250         # compilers for canadian build and use the defaults on other
   251         # configurations.
   252         if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
   253             repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
   254                        GCC_FOR_TARGET=${CT_TARGET}-gcc"
   255         else
   256             repair_cc=""
   257         fi
   258 
   259         CT_DoExecLog ALL make ${PARALLELMFLAGS} -C gcc ${libgcc_rule} \
   260                               ${repair_cc}
   261         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   262     else # build_libgcc
   263         core_targets=( gcc )
   264     fi   # ! build libgcc
   265     if [    "${build_libstdcxx}" = "yes"    \
   266          -a "${CT_CC_LANG_CXX}"  = "y"      \
   267        ]; then
   268         core_targets+=( target-libstdc++-v3 )
   269     fi
   270 
   271     CT_DoLog EXTRA "Building ${mode} core C compiler"
   272     CT_DoExecLog ALL make ${PARALLELMFLAGS} "${core_targets[@]/#/all-}"
   273 
   274     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   275     CT_DoExecLog ALL make "${core_targets[@]/#/install-}"
   276 
   277     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   278     # to call the C compiler with the same, somewhat canonical name.
   279     # check whether compiler has an extension
   280     file="$( ls -1 "${core_prefix_dir}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   281     [ -z "${file}" ] || ext=".${file##*.}"
   282     CT_DoExecLog ALL ln -sv "${CT_TARGET}-gcc${ext}" "${core_prefix_dir}/bin/${CT_TARGET}-cc${ext}"
   283 
   284     CT_EndStep
   285 }
   286 
   287 #------------------------------------------------------------------------------
   288 # Build final gcc
   289 do_cc() {
   290     local -a extra_config
   291     local tmp
   292     local final_LDFLAGS
   293 
   294     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   295     [ "${CT_BARE_METAL}" = "y" ] && return 0
   296 
   297     CT_DoStep INFO "Installing final compiler"
   298 
   299     mkdir -p "${CT_BUILD_DIR}/build-cc"
   300     cd "${CT_BUILD_DIR}/build-cc"
   301 
   302     CT_DoLog EXTRA "Configuring final compiler"
   303 
   304     # Enable selected languages
   305     lang_opt="c"
   306     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   307     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   308     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   309     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   310     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   311     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   312     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   313     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   314     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   315     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   316     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   317 
   318     extra_config+=("--enable-languages=${lang_opt}")
   319     extra_config+=("--disable-multilib")
   320     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   321         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   322         if [ -n "${tmp}" ]; then
   323             extra_config+=("${tmp}")
   324         fi
   325     done
   326 
   327     [ "${CT_SHARED_LIBS}" = "y" ]                   || extra_config+=("--disable-shared")
   328     [ -n "${CT_CC_PKGVERSION}" ]                    && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   329     [ -n "${CT_CC_BUGURL}" ]                        && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   330     [ "${CT_CC_SJLJ_EXCEPTIONS_USE}" = "y" ]        && extra_config+=("--enable-sjlj-exceptions")
   331     [ "${CT_CC_SJLJ_EXCEPTIONS_DONT_USE}" = "y" ]   && extra_config+=("--disable-sjlj-exceptions")
   332     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   333         extra_config+=("--enable-__cxa_atexit")
   334     else
   335         extra_config+=("--disable-__cxa_atexit")
   336     fi
   337     if [ -n "${CC_ENABLE_CXX_FLAGS}" ]; then
   338         extra_config+=("--enable-cxx-flags=${CC_ENABLE_CXX_FLAGS}")
   339     fi
   340 
   341     # When companion libraries are build static (eg !shared),
   342     # the libstdc++ is not pulled automatically, although it
   343     # is needed. Shoe-horn it in our LDFLAGS
   344     if [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
   345         final_LDFLAGS='-lstdc++'
   346     fi
   347     if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
   348         extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
   349         extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
   350     fi
   351     if [ "${CT_CC_GCC_USE_PPL_CLOOG}" = "y" ]; then
   352         extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
   353         extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
   354     fi
   355     if [ "${CT_CC_GCC_USE_MPC_LIBELF}" = "y" ]; then
   356         extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
   357         extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
   358     fi
   359 
   360     if [ "${CT_THREADS}" = "none" ]; then
   361         extra_config+=("--disable-threads")
   362         if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
   363             extra_config+=("--disable-libgomp")
   364         fi
   365     else
   366         if [ "${CT_THREADS}" = "win32" ]; then
   367             extra_config+=("--enable-threads=win32")
   368             extra_config+=("--disable-win32-registry")
   369         else
   370             extra_config+=("--enable-threads=posix")
   371         fi
   372     fi
   373 
   374     if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
   375         extra_config+=("--enable-target-optspace")
   376     fi
   377     if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
   378         extra_config+=("--disable-libstdcxx-pch")
   379     fi
   380 
   381     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   382 
   383     # --enable-symvers=gnu really only needed for sh4 to work around a
   384     # detection problem only matters for gcc-3.2.x and later, I think.
   385     # --disable-nls to work around crash bug on ppc405, but also because
   386     # embedded systems don't really need message catalogs...
   387     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   388     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   389     LDFLAGS="${final_LDFLAGS}"                      \
   390     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   391     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   392     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   393     CT_DoExecLog ALL                                \
   394     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   395         --build=${CT_BUILD}                         \
   396         --host=${CT_HOST}                           \
   397         --target=${CT_TARGET}                       \
   398         --prefix="${CT_PREFIX_DIR}"                 \
   399         ${CC_SYSROOT_ARG}                           \
   400         "${extra_config[@]}"                        \
   401         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   402         --disable-nls                               \
   403         --enable-symvers=gnu                        \
   404         --enable-c99                                \
   405         --enable-long-long                          \
   406         ${CT_CC_EXTRA_CONFIG}
   407 
   408     if [ "${CT_CANADIAN}" = "y" ]; then
   409         CT_DoLog EXTRA "Building libiberty"
   410         CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
   411     fi
   412 
   413     CT_DoLog EXTRA "Building final compiler"
   414     CT_DoExecLog ALL make ${PARALLELMFLAGS} all
   415 
   416     CT_DoLog EXTRA "Installing final compiler"
   417     CT_DoExecLog ALL make install
   418 
   419     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   420     # to call the C compiler with the same, somewhat canonical name.
   421     # check whether compiler has an extension
   422     file="$( ls -1 "${CT_TARGET}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
   423     [ -z "${file}" ] || ext=".${file##*.}"
   424     CT_DoExecLog ALL ln -sv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
   425 
   426     CT_EndStep
   427 }