scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Sep 30 18:19:18 2008 +0000 (2008-09-30)
changeset 892 187d34a9adf4
parent 887 0a8cc9d782de
child 1007 ed04e10c2d76
permissions -rw-r--r--
Better handle the second pass core gcc build, differentiating between gcc prior to 4.3 with gcc from 4.3.
Simplify detecting wether gcc is 4.3 and later, or older than 4.3 (we already know from .config).

/trunk/scripts/build/cc/gcc.sh | 22 13 9 0 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
     1 # This file adds the function to build the gcc C compiler
     2         ${extra_config}                         \
     3 # Copyright 2007 Yann E. MORIN
     4 # Licensed under the GPL v2. See COPYING in the root of this package
     5 
     6 do_print_filename() {
     7     [ "${CT_CC}" = "gcc" ] || return 0
     8     echo "gcc-${CT_CC_VERSION}"
     9 }
    10 
    11 # Download gcc
    12 do_cc_get() {
    13     # Ah! gcc folks are kind of 'different': they store the tarballs in
    14     # subdirectories of the same name! That's because gcc is such /crap/ that
    15     # it is such /big/ that it needs being splitted for distribution! Sad. :-(
    16     # Arrgghh! Some of those versions does not follow this convention:
    17     # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
    18     # subdirectory! You bastard!
    19     CT_GetFile "${CT_CC_FILE}"  \
    20                {ftp,http}://ftp.gnu.org/gnu/gcc{,{,/releases}/${CT_CC_FILE}}
    21 }
    22 
    23 # Extract gcc
    24 do_cc_extract() {
    25     CT_ExtractAndPatch "${CT_CC_FILE}"
    26 }
    27 
    28 #------------------------------------------------------------------------------
    29 # Core gcc pass 1
    30 do_cc_core_pass_1() {
    31     # If we're building for bare metal, build the static core gcc,
    32     # with libgcc.
    33     # In case we're not bare metal, and we're NPTL, build the static core gcc.
    34     # In any other case, do nothing.
    35     case "${CT_BARE_METAL},${CT_THREADS}" in
    36         y,*)    do_cc_core mode=baremetal build_libgcc=yes;;
    37         ,nptl)  do_cc_core mode=static build_libgcc=no;;
    38         *)      ;;
    39     esac
    40 }
    41 
    42 # Core gcc pass 2
    43 do_cc_core_pass_2() {
    44     # In case we're building for bare metal, do nothing, we already have
    45     # our compiler.
    46     # In case we're NPTL, build the shared core gcc and the target libgcc.
    47     # In any other case, build the static core gcc and, if using gcc-4.3+,
    48     # also build the target libgcc.
    49     case "${CT_BARE_METAL},${CT_THREADS}" in
    50         y,*)    ;;
    51         ,nptl)
    52             do_cc_core mode=shared build_libgcc=yes
    53             ;;
    54         *)  if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
    55                 do_cc_core mode=static build_libgcc=yes
    56             else
    57                 do_cc_core mode=static build_libgcc=no
    58             fi
    59             ;;
    60     esac
    61 }
    62 
    63 #------------------------------------------------------------------------------
    64 # Build core gcc
    65 # This function is used to build both the static and the shared core C conpiler,
    66 # with or without the target libgcc. We need to know wether:
    67 #  - we're building static, shared or bare metal: mode=[static|shared|baremetal]
    68 #  - we need to build libgcc or not             : build_libgcc=[yes|no]
    69 # Usage: do_cc_core_static mode=[static|shared|baremetal] build_libgcc=[yes|no]
    70 do_cc_core() {
    71     local mode
    72     local build_libgcc
    73     local core_prefix_dir
    74     local extra_config
    75 
    76     eval $1
    77     eval $2
    78     CT_TestOrAbort "Internal Error: 'mode' must either 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'" "${mode}" = "static" -o "${mode}" = "shared" -o "${mode}" = "baremetal"
    79     CT_TestOrAbort "Internal Error: 'build_libgcc' must be either 'yes' or 'no', not '${build_libgcc:-(empty)}'" "${build_libgcc}" = "yes" -o "${build_libgcc}" = "no"
    80     # In normal conditions, ( "${mode}" = "shared" ) implies
    81     # ( "${build_libgcc}" = "yes" ), but I won't check for that
    82 
    83     mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
    84     cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
    85 
    86     CT_DoStep INFO "Installing ${mode} core C compiler"
    87     case "${mode}" in
    88         static)
    89             core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
    90             extra_config="${extra_config} --with-newlib --enable-threads=no --disable-shared"
    91             copy_headers=y
    92             ;;
    93         shared)
    94             core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
    95             extra_config="${extra_config} --enable-shared"
    96             copy_headers=y
    97             ;;
    98         baremetal)
    99             core_prefix_dir="${CT_PREFIX_DIR}"
   100             extra_config="${extra_config} --with-newlib --enable-threads=no --disable-shared"
   101             copy_headers=n
   102             ;;
   103     esac
   104 
   105     if [ "${copy_headers}" = "y" ]; then
   106         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   107         CT_DoExecLog ALL mkdir -p "${core_prefix_dir}/${CT_TARGET}/include"
   108         CT_DoExecLog ALL cp -r "${CT_HEADERS_DIR}"/* "${core_prefix_dir}/${CT_TARGET}/include"
   109     fi
   110 
   111     CT_DoLog EXTRA "Configuring ${mode} core C compiler"
   112 
   113     extra_config="${extra_config} ${CT_ARCH_WITH_ARCH}"
   114     extra_config="${extra_config} ${CT_ARCH_WITH_ABI}"
   115     extra_config="${extra_config} ${CT_ARCH_WITH_CPU}"
   116     extra_config="${extra_config} ${CT_ARCH_WITH_TUNE}"
   117     extra_config="${extra_config} ${CT_ARCH_WITH_FPU}"
   118     extra_config="${extra_config} ${CT_ARCH_WITH_FLOAT}"
   119     [ "${CT_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
   120     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   121         extra_config="${extra_config} --enable-__cxa_atexit"
   122     else
   123         extra_config="${extra_config} --disable-__cxa_atexit"
   124     fi
   125 
   126     CT_DoLog DEBUG "Extra config passed: '${extra_config}'"
   127 
   128     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   129     CC_FOR_BUILD="${CT_CC_NATIVE}"                  \
   130     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   131     CT_DoExecLog ALL                                \
   132     "${CT_SRC_DIR}/${CT_CC_FILE}/configure"         \
   133         ${CT_CANADIAN_OPT}                          \
   134         --host=${CT_HOST}                           \
   135         --target=${CT_TARGET}                       \
   136         --prefix="${core_prefix_dir}"               \
   137         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   138         --disable-multilib                          \
   139         ${CC_CORE_SYSROOT_ARG}                      \
   140         ${extra_config}                             \
   141         --disable-nls                               \
   142         --enable-symvers=gnu                        \
   143         --enable-languages=c                        \
   144         --enable-target-optspace                    \
   145         ${CT_CC_CORE_EXTRA_CONFIG}
   146 
   147     if [ "${build_libgcc}" = "yes" ]; then
   148         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   149         # gcc/config/t-libunwind so -lc is removed from the link for
   150         # libgcc_s.so, as we do not have a target -lc yet.
   151         # This is not as ugly as it appears to be ;-) All symbols get resolved
   152         # during the glibc build, and we provide a proper libgcc_s.so for the
   153         # cross toolchain during the final gcc build.
   154         #
   155         # As we cannot modify the source tree, nor override SHLIB_LC itself
   156         # during configure or make, we have to edit the resultant
   157         # gcc/libgcc.mk itself to remove -lc from the link.
   158         # This causes us to have to jump through some hoops...
   159         #
   160         # To produce libgcc.mk to edit we firstly require libiberty.a,
   161         # so we configure then build it.
   162         # Next we have to configure gcc, create libgcc.mk then edit it...
   163         # So much easier if we just edit the source tree, but hey...
   164         if [ ! -f "${CT_SRC_DIR}/${CT_CC_FILE}/gcc/BASE-VER" ]; then
   165             CT_DoExecLog ALL make configure-libiberty
   166             CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libiberty libiberty.a
   167             CT_DoExecLog ALL make configure-gcc configure-libcpp
   168             CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp
   169         else
   170             CT_DoExecLog ALL make configure-gcc configure-libcpp configure-build-libiberty
   171             CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp all-build-libiberty
   172         fi
   173         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   174         if [ -d "${CT_SRC_DIR}/${CT_CC_FILE}/libdecnumber" ]; then
   175             CT_DoExecLog ALL make configure-libdecnumber
   176             CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libdecnumber libdecnumber.a
   177         fi
   178 
   179         # Starting with GCC 4.3, libgcc.mk is no longer built,
   180         # and libgcc.mvars is used instead.
   181 
   182         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   183             libgcc_rule="libgcc.mvars"
   184             build_rules="all-gcc all-target-libgcc"
   185             install_rules="install-gcc install-target-libgcc"
   186         else
   187             libgcc_rule="libgcc.mk"
   188             build_rules="all-gcc"
   189             install_rules="install-gcc"
   190         fi
   191 
   192         CT_DoExecLog ALL make ${PARALLELMFLAGS} -C gcc ${libgcc_rule}
   193         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   194     else # build_libgcc
   195             build_rules="all-gcc"
   196             install_rules="install-gcc"
   197     fi   # ! build libgcc
   198 
   199     if [ "${CT_CANADIAN}" = "y" ]; then
   200         CT_DoLog EXTRA "Building libiberty"
   201         CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
   202     fi
   203 
   204     CT_DoLog EXTRA "Building ${mode} core C compiler"
   205     CT_DoExecLog ALL make ${PARALLELMFLAGS} ${build_rules}
   206 
   207     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   208     CT_DoExecLog ALL make ${install_rules}
   209 
   210     CT_EndStep
   211 }
   212 
   213 #------------------------------------------------------------------------------
   214 # Build final gcc
   215 do_cc() {
   216     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   217     [ "${CT_BARE_METAL}" = "y" ] && return 0
   218 
   219     CT_DoStep INFO "Installing final compiler"
   220 
   221     mkdir -p "${CT_BUILD_DIR}/build-cc"
   222     cd "${CT_BUILD_DIR}/build-cc"
   223 
   224     CT_DoLog EXTRA "Configuring final compiler"
   225 
   226     # Enable selected languages
   227     lang_opt="c"
   228     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   229     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   230     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   231     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   232     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   233     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   234     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   235     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   236     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   237     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   238     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   239 
   240     extra_config="--enable-languages=${lang_opt}"
   241     extra_config="${extra_config} --disable-multilib"
   242     extra_config="${extra_config} ${CT_ARCH_WITH_ARCH}"
   243     extra_config="${extra_config} ${CT_ARCH_WITH_ABI}"
   244     extra_config="${extra_config} ${CT_ARCH_WITH_CPU}"
   245     extra_config="${extra_config} ${CT_ARCH_WITH_TUNE}"
   246     extra_config="${extra_config} ${CT_ARCH_WITH_FPU}"
   247     extra_config="${extra_config} ${CT_ARCH_WITH_FLOAT}"
   248     [ "${CT_SHARED_LIBS}" = "y" ]                   || extra_config="${extra_config} --disable-shared"
   249     [ "${CT_GMP_MPFR}" = "y" ]                      && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
   250     [ -n "${CT_CC_PKGVERSION}" ]                    && extra_config="${extra_config} --with-pkgversion=${CT_CC_PKGVERSION}"
   251     [ -n "${CT_CC_BUGURL}" ]                        && extra_config="${extra_config} --with-bugurl=${CT_CC_BUGURL}"
   252     [ "${CT_CC_SJLJ_EXCEPTIONS_USE}" = "y" ]        && extra_config="${extra_config} --enable-sjlj-exceptions"
   253     [ "${CT_CC_SJLJ_EXCEPTIONS_DONT_USE}" = "y" ]   && extra_config="${extra_config} --disable-sjlj-exceptions"
   254     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   255         extra_config="${extra_config} --enable-__cxa_atexit"
   256     else
   257         extra_config="${extra_config} --disable-__cxa_atexit"
   258     fi
   259 
   260     CT_DoLog DEBUG "Extra config passed: '${extra_config}'"
   261 
   262     # --enable-symvers=gnu really only needed for sh4 to work around a
   263     # detection problem only matters for gcc-3.2.x and later, I think.
   264     # --disable-nls to work around crash bug on ppc405, but also because
   265     # embedded systems don't really need message catalogs...
   266     CC_FOR_BUILD="${CT_CC_NATIVE}"              \
   267     CFLAGS="${CT_CFLAGS_FOR_HOST}"              \
   268     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"     \
   269     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"   \
   270     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"   \
   271     CT_DoExecLog ALL                            \
   272     "${CT_SRC_DIR}/${CT_CC_FILE}/configure"     \
   273         ${CT_CANADIAN_OPT}                      \
   274         --target=${CT_TARGET} --host=${CT_HOST} \
   275         --prefix="${CT_PREFIX_DIR}"             \
   276         ${CC_SYSROOT_ARG}                       \
   277         ${extra_config}                         \
   278         --with-local-prefix="${CT_SYSROOT_DIR}" \
   279         --disable-nls                           \
   280         --enable-threads=posix                  \
   281         --enable-symvers=gnu                    \
   282         --enable-c99                            \
   283         --enable-long-long                      \
   284         --enable-target-optspace                \
   285         ${CT_CC_EXTRA_CONFIG}
   286 
   287     if [ "${CT_CANADIAN}" = "y" ]; then
   288         CT_DoLog EXTRA "Building libiberty"
   289         CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
   290     fi
   291 
   292     CT_DoLog EXTRA "Building final compiler"
   293     CT_DoExecLog ALL make ${PARALLELMFLAGS} all
   294 
   295     CT_DoLog EXTRA "Installing final compiler"
   296     CT_DoExecLog ALL make install
   297 
   298     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   299     # to call the C compiler with the same, somewhat canonical name.
   300     ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}"-{g,}cc 2>&1 |CT_DoLog ALL
   301 
   302     CT_EndStep
   303 }