scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Aug 30 00:57:40 2009 +0200 (2009-08-30)
changeset 1495 2542421e3321
parent 1479 70a68892831e
child 1808 a1370757e6a1
child 1931 875abab986ac
permissions -rw-r--r--
tools wrapper: introduce the silent WRAPPER_NEEDED config option

Add the WRAPPER_NEEDED silent config option, that can be selected by
components that require it (companion libs so far).
Rely on this config option when deciding to install the wrapper,
instead of checking GMP/MPFR or PPL/CLoog/MPC.
     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 a canadian compiler no use to build the CC
    45     # core compiler, we're not using it
    46     [ -n "${CT_CANADIAN}" ] && return 0
    47 
    48     # If we're building for bare metal, build the static core gcc,
    49     # with libgcc.
    50     # In case we're not bare metal, and we're NPTL, build the static core gcc.
    51     # In any other case, do nothing.
    52     case "${CT_BARE_METAL},${CT_THREADS}" in
    53         y,*)    do_cc_core mode=baremetal build_libgcc=yes;;
    54         ,nptl)  do_cc_core mode=static build_libgcc=no;;
    55         *)      ;;
    56     esac
    57 }
    58 
    59 # Core gcc pass 2
    60 do_cc_core_pass_2() {
    61     # If we're building a canadian compiler no use to build the CC
    62     # core compiler, we're not using it
    63     [ -n "${CT_CANADIAN}" ] && return 0
    64 
    65     # In case we're building for bare metal, do nothing, we already have
    66     # our compiler.
    67     # In case we're NPTL, build the shared core gcc and the target libgcc.
    68     # In any other case, build the static core gcc and, if using gcc-4.3+,
    69     # also build the target libgcc.
    70     case "${CT_BARE_METAL},${CT_THREADS}" in
    71         y,*)    ;;
    72         ,nptl)
    73             do_cc_core mode=shared build_libgcc=yes
    74             ;;
    75         *)  if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
    76                 do_cc_core mode=static build_libgcc=yes
    77             else
    78                 do_cc_core mode=static build_libgcc=no
    79             fi
    80             ;;
    81     esac
    82 }
    83 
    84 #------------------------------------------------------------------------------
    85 # Build core gcc
    86 # This function is used to build both the static and the shared core C conpiler,
    87 # with or without the target libgcc. We need to know wether:
    88 #  - we're building static, shared or bare metal: mode=[static|shared|baremetal]
    89 #  - we need to build libgcc or not             : build_libgcc=[yes|no]
    90 # Usage: do_cc_core_static mode=[static|shared|baremetal] build_libgcc=[yes|no]
    91 do_cc_core() {
    92     local mode
    93     local build_libgcc
    94     local core_prefix_dir
    95     local lang_opt
    96     local tmp
    97     local -a extra_config
    98 
    99     eval $1
   100     eval $2
   101     CT_TestOrAbort "Internal Error: 'mode' must either 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'" "${mode}" = "static" -o "${mode}" = "shared" -o "${mode}" = "baremetal"
   102     CT_TestOrAbort "Internal Error: 'build_libgcc' must be either 'yes' or 'no', not '${build_libgcc:-(empty)}'" "${build_libgcc}" = "yes" -o "${build_libgcc}" = "no"
   103     # In normal conditions, ( "${mode}" = "shared" ) implies
   104     # ( "${build_libgcc}" = "yes" ), but I won't check for that
   105 
   106     CT_DoStep INFO "Installing ${mode} core C compiler"
   107     mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
   108     cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
   109 
   110     lang_opt=c
   111     case "${mode}" in
   112         static)
   113             core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
   114             extra_config+=("--with-newlib")
   115             extra_config+=("--enable-threads=no")
   116             extra_config+=("--disable-shared")
   117             copy_headers=y
   118             ;;
   119         shared)
   120             core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
   121             extra_config+=("--enable-shared")
   122             copy_headers=y
   123             ;;
   124         baremetal)
   125             core_prefix_dir="${CT_PREFIX_DIR}"
   126             extra_config+=("--with-newlib")
   127             extra_config+=("--enable-threads=no")
   128             extra_config+=("--disable-shared")
   129             [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
   130             copy_headers=n
   131             ;;
   132     esac
   133 
   134     if [ "${copy_headers}" = "y" ]; then
   135         CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
   136         CT_DoExecLog ALL mkdir -p "${core_prefix_dir}/${CT_TARGET}/include"
   137         CT_DoExecLog ALL cp -r "${CT_HEADERS_DIR}"/* "${core_prefix_dir}/${CT_TARGET}/include"
   138     fi
   139 
   140     CT_DoLog EXTRA "Configuring ${mode} core C compiler"
   141 
   142     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   143         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   144         if [ -n "${tmp}" ]; then
   145             extra_config+=("${tmp}")
   146         fi
   147     done
   148     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   149         extra_config+=("--enable-__cxa_atexit")
   150     else
   151         extra_config+=("--disable-__cxa_atexit")
   152     fi
   153     if [ "${CT_GMP_MPFR}" = "y" ]; then
   154         extra_config+=("--with-gmp=${CT_PREFIX_DIR}")
   155         extra_config+=("--with-mpfr=${CT_PREFIX_DIR}")
   156     fi
   157     if [ "${CT_PPL_CLOOG_MPC}" = "y" ]; then
   158         extra_config+=("--with-ppl=${CT_PREFIX_DIR}")
   159         extra_config+=("--with-cloog=${CT_PREFIX_DIR}")
   160         extra_config+=("--with-mpc=${CT_PREFIX_DIR}")
   161     fi
   162 
   163     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   164 
   165     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   166     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   167     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   168     CT_DoExecLog ALL                                \
   169     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   170         --build=${CT_BUILD}                         \
   171         --host=${CT_HOST}                           \
   172         --target=${CT_TARGET}                       \
   173         --prefix="${core_prefix_dir}"               \
   174         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   175         --disable-multilib                          \
   176         ${CC_CORE_SYSROOT_ARG}                      \
   177         "${extra_config[@]}"                        \
   178         --disable-nls                               \
   179         --enable-symvers=gnu                        \
   180         --enable-languages="${lang_opt}"            \
   181         --enable-target-optspace                    \
   182         ${CT_CC_CORE_EXTRA_CONFIG}
   183 
   184     if [ "${build_libgcc}" = "yes" ]; then
   185         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   186         # gcc/config/t-libunwind so -lc is removed from the link for
   187         # libgcc_s.so, as we do not have a target -lc yet.
   188         # This is not as ugly as it appears to be ;-) All symbols get resolved
   189         # during the glibc build, and we provide a proper libgcc_s.so for the
   190         # cross toolchain during the final gcc build.
   191         #
   192         # As we cannot modify the source tree, nor override SHLIB_LC itself
   193         # during configure or make, we have to edit the resultant
   194         # gcc/libgcc.mk itself to remove -lc from the link.
   195         # This causes us to have to jump through some hoops...
   196         #
   197         # To produce libgcc.mk to edit we firstly require libiberty.a,
   198         # so we configure then build it.
   199         # Next we have to configure gcc, create libgcc.mk then edit it...
   200         # So much easier if we just edit the source tree, but hey...
   201         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   202             CT_DoExecLog ALL make configure-libiberty
   203             CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libiberty libiberty.a
   204             CT_DoExecLog ALL make configure-gcc configure-libcpp
   205             CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp
   206         else
   207             CT_DoExecLog ALL make configure-gcc configure-libcpp configure-build-libiberty
   208             CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp all-build-libiberty
   209         fi
   210         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   211         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   212             CT_DoExecLog ALL make configure-libdecnumber
   213             CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libdecnumber libdecnumber.a
   214         fi
   215 
   216         # Starting with GCC 4.3, libgcc.mk is no longer built,
   217         # and libgcc.mvars is used instead.
   218 
   219         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   220             libgcc_rule="libgcc.mvars"
   221             build_rules="all-gcc all-target-libgcc"
   222             install_rules="install-gcc install-target-libgcc"
   223         else
   224             libgcc_rule="libgcc.mk"
   225             build_rules="all-gcc"
   226             install_rules="install-gcc"
   227         fi
   228 
   229         CT_DoExecLog ALL make ${PARALLELMFLAGS} -C gcc ${libgcc_rule}
   230         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   231     else # build_libgcc
   232             build_rules="all-gcc"
   233             install_rules="install-gcc"
   234     fi   # ! build libgcc
   235 
   236     if [ "${CT_CANADIAN}" = "y" ]; then
   237         CT_DoLog EXTRA "Building libiberty"
   238         CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
   239     fi
   240 
   241     CT_DoLog EXTRA "Building ${mode} core C compiler"
   242     CT_DoExecLog ALL make ${PARALLELMFLAGS} ${build_rules}
   243 
   244     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   245     CT_DoExecLog ALL make ${install_rules}
   246 
   247     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   248     # to call the C compiler with the same, somewhat canonical name.
   249     CT_DoExecLog ALL ln -sv "${CT_TARGET}"-gcc "${core_prefix_dir}/bin/${CT_TARGET}"-cc
   250 
   251     CT_EndStep
   252 }
   253 
   254 #------------------------------------------------------------------------------
   255 # Build final gcc
   256 do_cc() {
   257     local -a extra_config
   258     local tmp
   259 
   260     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   261     [ "${CT_BARE_METAL}" = "y" ] && return 0
   262 
   263     CT_DoStep INFO "Installing final compiler"
   264 
   265     mkdir -p "${CT_BUILD_DIR}/build-cc"
   266     cd "${CT_BUILD_DIR}/build-cc"
   267 
   268     CT_DoLog EXTRA "Configuring final compiler"
   269 
   270     # Enable selected languages
   271     lang_opt="c"
   272     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   273     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   274     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   275     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   276     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   277     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   278     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   279     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   280     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   281     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   282     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   283 
   284     extra_config+=("--enable-languages=${lang_opt}")
   285     extra_config+=("--disable-multilib")
   286     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   287         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   288         if [ -n "${tmp}" ]; then
   289             extra_config+=("${tmp}")
   290         fi
   291     done
   292 
   293     [ "${CT_SHARED_LIBS}" = "y" ]                   || extra_config+=("--disable-shared")
   294     [ -n "${CT_CC_PKGVERSION}" ]                    && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   295     [ -n "${CT_CC_BUGURL}" ]                        && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   296     [ "${CT_CC_SJLJ_EXCEPTIONS_USE}" = "y" ]        && extra_config+=("--enable-sjlj-exceptions")
   297     [ "${CT_CC_SJLJ_EXCEPTIONS_DONT_USE}" = "y" ]   && extra_config+=("--disable-sjlj-exceptions")
   298     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   299         extra_config+=("--enable-__cxa_atexit")
   300     else
   301         extra_config+=("--disable-__cxa_atexit")
   302     fi
   303     if [ "${CT_GMP_MPFR}" = "y" ]; then
   304         extra_config+=("--with-gmp=${CT_PREFIX_DIR}")
   305         extra_config+=("--with-mpfr=${CT_PREFIX_DIR}")
   306     fi
   307     if [ "${CT_PPL_CLOOG_MPC}" = "y" ]; then
   308         extra_config+=("--with-ppl=${CT_PREFIX_DIR}")
   309         extra_config+=("--with-cloog=${CT_PREFIX_DIR}")
   310         extra_config+=("--with-mpc=${CT_PREFIX_DIR}")
   311     fi
   312     if [ -n "${CC_ENABLE_CXX_FLAGS}" ]; then
   313         extra_config+=("--enable-cxx-flags=${CC_ENABLE_CXX_FLAGS}")
   314     fi
   315 
   316     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   317 
   318     # --enable-symvers=gnu really only needed for sh4 to work around a
   319     # detection problem only matters for gcc-3.2.x and later, I think.
   320     # --disable-nls to work around crash bug on ppc405, but also because
   321     # embedded systems don't really need message catalogs...
   322     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   323     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   324     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   325     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   326     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   327     CT_DoExecLog ALL                                \
   328     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   329         --build=${CT_BUILD}                         \
   330         --host=${CT_HOST}                           \
   331         --target=${CT_TARGET}                       \
   332         --prefix="${CT_PREFIX_DIR}"                 \
   333         ${CC_SYSROOT_ARG}                           \
   334         "${extra_config[@]}"                        \
   335         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   336         --disable-nls                               \
   337         --enable-threads=posix                      \
   338         --enable-symvers=gnu                        \
   339         --enable-c99                                \
   340         --enable-long-long                          \
   341         --enable-target-optspace                    \
   342         ${CT_CC_EXTRA_CONFIG}
   343 
   344     if [ "${CT_CANADIAN}" = "y" ]; then
   345         CT_DoLog EXTRA "Building libiberty"
   346         CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
   347     fi
   348 
   349     CT_DoLog EXTRA "Building final compiler"
   350     CT_DoExecLog ALL make ${PARALLELMFLAGS} all
   351 
   352     CT_DoLog EXTRA "Installing final compiler"
   353     CT_DoExecLog ALL make install
   354 
   355     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   356     # to call the C compiler with the same, somewhat canonical name.
   357     CT_DoExecLog ALL ln -sv "${CT_TARGET}"-gcc "${CT_PREFIX_DIR}/bin/${CT_TARGET}"-cc
   358 
   359     CT_EndStep
   360 }