yann@1: # This file adds the function to build the final gcc C compiler yann@1: # Copyright 2007 Yann E. MORIN yann@1: # Licensed under the GPL v2. See COPYING in the root of this package yann@1: yann@161: do_print_filename() { yann@161: [ "${CT_CC}" = "gcc" ] || return 0 yann@164: echo "gcc-${CT_CC_VERSION}" yann@161: } yann@161: yann@63: # Download final gcc yann@63: do_cc_get() { yann@63: # Ah! gcc folks are kind of 'different': they store the tarballs in yann@63: # subdirectories of the same name! That's because gcc is such /crap/ that yann@63: # it is such /big/ that it needs being splitted for distribution! Sad. :-( yann@63: # Arrgghh! Some of those versions does not follow this convention: yann@63: # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a yann@63: # subdirectory! You bastard! yann@63: CT_GetFile "${CT_CC_FILE}" \ yann@63: ftp://ftp.gnu.org/gnu/gcc/${CT_CC_FILE} \ yann@63: ftp://ftp.gnu.org/gnu/gcc/releases/${CT_CC_FILE} \ yann@63: ftp://ftp.gnu.org/gnu/gcc yann@63: } yann@63: yann@63: # Extract final gcc yann@63: do_cc_extract() { yann@63: CT_ExtractAndPatch "${CT_CC_FILE}" yann@63: } yann@63: yann@63: # Build final gcc yann@1: do_cc() { yann@48: CT_DoStep INFO "Installing final compiler" yann@1: yann@1: mkdir -p "${CT_BUILD_DIR}/build-cc" yann@1: cd "${CT_BUILD_DIR}/build-cc" yann@1: yann@50: CT_DoLog EXTRA "Configuring final compiler" yann@1: yann@1: # Enable selected languages yann@1: lang_opt="c" yann@1: [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++" yann@1: [ "${CT_CC_LANG_FORTRAN}" = "y" ] && lang_opt="${lang_opt},fortran" yann@1: [ "${CT_CC_LANG_ADA}" = "y" ] && lang_opt="${lang_opt},ada" yann@1: [ "${CT_CC_LANG_JAVA}" = "y" ] && lang_opt="${lang_opt},java" yann@1: [ "${CT_CC_LANG_OBJC}" = "y" ] && lang_opt="${lang_opt},objc" yann@1: [ "${CT_CC_LANG_OBJCXX}" = "y" ] && lang_opt="${lang_opt},obj-c++" yann@1: CT_Test "Building Fortran language is not yet supported. Will try..." "${CT_CC_LANG_FORTRAN}" = "y" yann@1: CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y" yann@1: CT_Test "Building Java language is not yet supported. Will try..." "${CT_CC_LANG_JAVA}" = "y" yann@1: CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y" yann@1: CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y" yann@1: CT_Test "Building ${CT_CC_LANG_OTHERS} language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}" yann@48: lang_opt=`echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;'` yann@1: yann@1: extra_config="--enable-languages=${lang_opt}" yann@1: [ "${CT_ARCH_FLOAT_SW}" = "y" ] && extra_config="${extra_config} --with-float=soft" yann@1: [ "${CT_SHARED_LIBS}" = "y" ] || extra_config="${extra_config} --disable-shared" yann@45: [ -n "${CT_ARCH_ABI}" ] && extra_config="${extra_config} --with-abi=${CT_ARCH_ABI}" yann@1: [ -n "${CT_ARCH_CPU}" ] && extra_config="${extra_config} --with-cpu=${CT_ARCH_CPU}" yann@1: [ -n "${CT_ARCH_TUNE}" ] && extra_config="${extra_config} --with-tune=${CT_ARCH_TUNE}" yann@1: [ -n "${CT_ARCH_ARCH}" ] && extra_config="${extra_config} --with-arch=${CT_ARCH_ARCH}" yann@1: [ -n "${CT_ARCH_FPU}" ] && extra_config="${extra_config} --with-fpu=${CT_ARCH_FPU}" yann@1: if [ "${CT_TARGET_MULTILIB}" = "y" ]; then yann@1: extra_config="${extra_config} --enable-multilib" yann@1: else yann@1: extra_config="${extra_config} --disable-multilib" yann@1: fi yann@20: [ "${CT_CC_CXA_ATEXIT}" == "y" ] && extra_config="${extra_config} --enable-__cxa_atexit" yann@1: yann@1: CT_DoLog DEBUG "Extra config passed: \"${extra_config}\"" yann@1: yann@1: # --enable-symvers=gnu really only needed for sh4 to work around a yann@1: # detection problem only matters for gcc-3.2.x and later, I think. yann@1: # --disable-nls to work around crash bug on ppc405, but also because yann@1: # embedded systems don't really need message catalogs... yann@1: CFLAGS="${CT_CFLAGS_FOR_HOST}" \ yann@1: "${CT_SRC_DIR}/${CT_CC_FILE}/configure" \ yann@1: ${CT_CANADIAN_OPT} \ yann@1: --target=${CT_TARGET} --host=${CT_HOST} \ yann@1: --prefix="${CT_PREFIX_DIR}" \ yann@1: ${CC_SYSROOT_ARG} \ yann@1: ${extra_config} \ yann@1: --with-local-prefix="${CT_SYSROOT_DIR}" \ yann@1: --disable-nls \ yann@1: --enable-threads=posix \ yann@1: --enable-symvers=gnu \ yann@1: --enable-c99 \ yann@1: --enable-long-long \ yann@78: ${CT_CC_EXTRA_CONFIG} 2>&1 |CT_DoLog ALL yann@1: yann@131: if [ "${CT_CANADIAN}" = "y" ]; then yann@1: CT_DoLog EXTRA "Building libiberty" yann@78: make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL yann@1: fi yann@1: yann@1: yann@1: # Idea from : yann@1: # Fix lib/lib64 confusion for GCC 3.3.3 on PowerPC64 and x86_64. yann@1: # GCC 3.4.0 and up don't suffer from this confusion, and don't need this yann@1: # kludge. yann@1: # FIXME: we should patch gcc's source rather than uglify crosstool.sh. yann@1: # FIXME: is this needed for gcc-3.3.[56]? yann@1: case "${CT_CC_FILE}" in yann@1: gcc-3.3.[34]) yann@1: case "${CT_TARGET}" in yann@1: powerpc64-unknown-linux-gnu|x86_64-unknown-linux-gnu) yann@1: for d in `find "${CT_SYSROOT_DIR}" -name lib -type d -empty`; do yann@1: if [ -d `dirname "${d}"`/lib64 ] ; then yann@1: rm -rf "${d}" yann@1: ln -s `dirname "${d}"`/lib64 "${d}" yann@1: fi yann@1: done ;; yann@1: *) ;; yann@1: esac ;; yann@1: esac yann@1: yann@50: CT_DoLog EXTRA "Building final compiler" yann@78: make ${PARALLELMFLAGS} all 2>&1 |CT_DoLog ALL yann@1: yann@50: CT_DoLog EXTRA "Installing final compiler" yann@78: make install 2>&1 |CT_DoLog ALL yann@1: yann@1: # FIXME: shouldn't people who want this just --disable-multilib in final gcc yann@1: # and be done with it? yann@1: # This code should probably be deleted, it was written long ago and hasn't yann@1: # been tested in ages. yann@1: # kludge: If the chip does not have a floating point unit yann@1: # (i.e. if GLIBC_EXTRA_CONFIG contains --without-fp), yann@1: # and there are shared libraries in /lib/nof, copy them to /lib yann@1: # so they get used by default. yann@1: # FIXME: only rs6000/powerpc seem to use nof. See MULTILIB_DIRNAMES yann@1: # in $GCC_DIR/gcc/config/$TARGET/* to see what your arch calls it. yann@1: #case "${CT_LIBC_EXTRA_CONFIG}" in yann@1: # *--without-fp*) yann@1: # if test -d "${CT_SYSROOT_DIR}/lib/nof"; then yann@1: # cp -af "${CT_SYSROOT_DIR}/lib/nof/"*.so* "${CT_SYSROOT_DIR}/lib" || true yann@1: # fi yann@1: # ;; yann@1: #esac yann@1: yann@217: # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able yann@217: # to call the C compiler with the same, somewhat canonical name. yann@235: ln "${CT_PREFIX_DIR}/bin/${CT_TARGET}"-{g,}cc yann@217: yann@1: CT_EndStep yann@1: }