scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Feb 17 23:50:49 2010 +0100 (2010-02-17)
changeset 1810 e44f67656c5f
parent 1484 c5451809efdb
child 1848 3f54c8d7f3f9
permissions -rw-r--r--
complibs: hide companion libraries for target entry

The companion libraries on the target are required only for internal use by
binutils and gdb. The user should not have to know about this, so hide the
option.
     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     [ -z "${CT_GMP}"    ] || extra_config+=("--with-gmp=${CT_PREFIX_DIR}")
   154     [ -z "${CT_MPFR}"   ] || extra_config+=("--with-mpfr=${CT_PREFIX_DIR}")
   155     [ -z "${CT_PPL}"    ] || extra_config+=("--with-ppl=${CT_PREFIX_DIR}")
   156     [ -z "${CT_CLOOG}"  ] || extra_config+=("--with-cloog=${CT_PREFIX_DIR}")
   157     [ -z "${CT_MPC}"    ] || extra_config+=("--with-mpc=${CT_PREFIX_DIR}")
   158 
   159     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   160 
   161     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
   162     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   163     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   164     CT_DoExecLog ALL                                \
   165     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   166         --build=${CT_BUILD}                         \
   167         --host=${CT_HOST}                           \
   168         --target=${CT_TARGET}                       \
   169         --prefix="${core_prefix_dir}"               \
   170         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   171         --disable-multilib                          \
   172         ${CC_CORE_SYSROOT_ARG}                      \
   173         "${extra_config[@]}"                        \
   174         --disable-nls                               \
   175         --enable-symvers=gnu                        \
   176         --enable-languages="${lang_opt}"            \
   177         --enable-target-optspace                    \
   178         ${CT_CC_CORE_EXTRA_CONFIG}
   179 
   180     if [ "${build_libgcc}" = "yes" ]; then
   181         # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
   182         # gcc/config/t-libunwind so -lc is removed from the link for
   183         # libgcc_s.so, as we do not have a target -lc yet.
   184         # This is not as ugly as it appears to be ;-) All symbols get resolved
   185         # during the glibc build, and we provide a proper libgcc_s.so for the
   186         # cross toolchain during the final gcc build.
   187         #
   188         # As we cannot modify the source tree, nor override SHLIB_LC itself
   189         # during configure or make, we have to edit the resultant
   190         # gcc/libgcc.mk itself to remove -lc from the link.
   191         # This causes us to have to jump through some hoops...
   192         #
   193         # To produce libgcc.mk to edit we firstly require libiberty.a,
   194         # so we configure then build it.
   195         # Next we have to configure gcc, create libgcc.mk then edit it...
   196         # So much easier if we just edit the source tree, but hey...
   197         if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
   198             CT_DoExecLog ALL make configure-libiberty
   199             CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libiberty libiberty.a
   200             CT_DoExecLog ALL make configure-gcc configure-libcpp
   201             CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp
   202         else
   203             CT_DoExecLog ALL make configure-gcc configure-libcpp configure-build-libiberty
   204             CT_DoExecLog ALL make ${PARALLELMFLAGS} all-libcpp all-build-libiberty
   205         fi
   206         # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
   207         if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
   208             CT_DoExecLog ALL make configure-libdecnumber
   209             CT_DoExecLog ALL make ${PARALLELMFLAGS} -C libdecnumber libdecnumber.a
   210         fi
   211 
   212         # Starting with GCC 4.3, libgcc.mk is no longer built,
   213         # and libgcc.mvars is used instead.
   214 
   215         if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
   216             libgcc_rule="libgcc.mvars"
   217             build_rules="all-gcc all-target-libgcc"
   218             install_rules="install-gcc install-target-libgcc"
   219         else
   220             libgcc_rule="libgcc.mk"
   221             build_rules="all-gcc"
   222             install_rules="install-gcc"
   223         fi
   224 
   225         CT_DoExecLog ALL make ${PARALLELMFLAGS} -C gcc ${libgcc_rule}
   226         sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
   227     else # build_libgcc
   228             build_rules="all-gcc"
   229             install_rules="install-gcc"
   230     fi   # ! build libgcc
   231 
   232     if [ "${CT_CANADIAN}" = "y" ]; then
   233         CT_DoLog EXTRA "Building libiberty"
   234         CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
   235     fi
   236 
   237     CT_DoLog EXTRA "Building ${mode} core C compiler"
   238     CT_DoExecLog ALL make ${PARALLELMFLAGS} ${build_rules}
   239 
   240     CT_DoLog EXTRA "Installing ${mode} core C compiler"
   241     CT_DoExecLog ALL make ${install_rules}
   242 
   243     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   244     # to call the C compiler with the same, somewhat canonical name.
   245     CT_DoExecLog ALL ln -sv "${CT_TARGET}"-gcc "${core_prefix_dir}/bin/${CT_TARGET}"-cc
   246 
   247     CT_EndStep
   248 }
   249 
   250 #------------------------------------------------------------------------------
   251 # Build final gcc
   252 do_cc() {
   253     local -a extra_config
   254     local tmp
   255 
   256     # If building for bare metal, nothing to be done here, the static core conpiler is enough!
   257     [ "${CT_BARE_METAL}" = "y" ] && return 0
   258 
   259     CT_DoStep INFO "Installing final compiler"
   260 
   261     mkdir -p "${CT_BUILD_DIR}/build-cc"
   262     cd "${CT_BUILD_DIR}/build-cc"
   263 
   264     CT_DoLog EXTRA "Configuring final compiler"
   265 
   266     # Enable selected languages
   267     lang_opt="c"
   268     [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
   269     [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
   270     [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
   271     [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
   272     [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
   273     [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
   274     CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
   275     CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
   276     CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
   277     CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
   278     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
   279 
   280     extra_config+=("--enable-languages=${lang_opt}")
   281     extra_config+=("--disable-multilib")
   282     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
   283         eval tmp="\${CT_ARCH_WITH_${tmp}}"
   284         if [ -n "${tmp}" ]; then
   285             extra_config+=("${tmp}")
   286         fi
   287     done
   288 
   289     [ "${CT_SHARED_LIBS}" = "y" ]                   || extra_config+=("--disable-shared")
   290     [ -n "${CT_CC_PKGVERSION}" ]                    && extra_config+=("--with-pkgversion=${CT_CC_PKGVERSION}")
   291     [ -n "${CT_CC_BUGURL}" ]                        && extra_config+=("--with-bugurl=${CT_CC_BUGURL}")
   292     [ "${CT_CC_SJLJ_EXCEPTIONS_USE}" = "y" ]        && extra_config+=("--enable-sjlj-exceptions")
   293     [ "${CT_CC_SJLJ_EXCEPTIONS_DONT_USE}" = "y" ]   && extra_config+=("--disable-sjlj-exceptions")
   294     if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
   295         extra_config+=("--enable-__cxa_atexit")
   296     else
   297         extra_config+=("--disable-__cxa_atexit")
   298     fi
   299     if [ -n "${CC_ENABLE_CXX_FLAGS}" ]; then
   300         extra_config+=("--enable-cxx-flags=${CC_ENABLE_CXX_FLAGS}")
   301     fi
   302     [ -z "${CT_GMP}"    ] || extra_config+=("--with-gmp=${CT_PREFIX_DIR}")
   303     [ -z "${CT_MPFR}"   ] || extra_config+=("--with-mpfr=${CT_PREFIX_DIR}")
   304     [ -z "${CT_PPL}"    ] || extra_config+=("--with-ppl=${CT_PREFIX_DIR}")
   305     [ -z "${CT_CLOOG}"  ] || extra_config+=("--with-cloog=${CT_PREFIX_DIR}")
   306     [ -z "${CT_MPC}"    ] || extra_config+=("--with-mpc=${CT_PREFIX_DIR}")
   307 
   308     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   309 
   310     # --enable-symvers=gnu really only needed for sh4 to work around a
   311     # detection problem only matters for gcc-3.2.x and later, I think.
   312     # --disable-nls to work around crash bug on ppc405, but also because
   313     # embedded systems don't really need message catalogs...
   314     CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
   315     CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
   316     CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
   317     CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
   318     LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
   319     CT_DoExecLog ALL                                \
   320     "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
   321         --build=${CT_BUILD}                         \
   322         --host=${CT_HOST}                           \
   323         --target=${CT_TARGET}                       \
   324         --prefix="${CT_PREFIX_DIR}"                 \
   325         ${CC_SYSROOT_ARG}                           \
   326         "${extra_config[@]}"                        \
   327         --with-local-prefix="${CT_SYSROOT_DIR}"     \
   328         --disable-nls                               \
   329         --enable-threads=posix                      \
   330         --enable-symvers=gnu                        \
   331         --enable-c99                                \
   332         --enable-long-long                          \
   333         --enable-target-optspace                    \
   334         ${CT_CC_EXTRA_CONFIG}
   335 
   336     if [ "${CT_CANADIAN}" = "y" ]; then
   337         CT_DoLog EXTRA "Building libiberty"
   338         CT_DoExecLog ALL make ${PARALLELMFLAGS} all-build-libiberty
   339     fi
   340 
   341     CT_DoLog EXTRA "Building final compiler"
   342     CT_DoExecLog ALL make ${PARALLELMFLAGS} all
   343 
   344     CT_DoLog EXTRA "Installing final compiler"
   345     CT_DoExecLog ALL make install
   346 
   347     # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
   348     # to call the C compiler with the same, somewhat canonical name.
   349     CT_DoExecLog ALL ln -sv "${CT_TARGET}"-gcc "${CT_PREFIX_DIR}/bin/${CT_TARGET}"-cc
   350 
   351     CT_EndStep
   352 }