yann@850: # This file adds the function to build the gcc C compiler yann@850: # Copyright 2007 Yann E. MORIN yann@850: # Licensed under the GPL v2. See COPYING in the root of this package yann@850: yann@850: # Download gcc yann@850: do_cc_get() { yann@2302: local linaro_version yann@2302: local linaro_series yann@2302: local linaro_base_url="http://launchpad.net/gcc-linaro" yann@2302: yann@2302: yann@2302: # Account for the Linaro versioning yann@2302: linaro_version="$( echo "${CT_CC_VERSION}" \ yann@2302: |sed -r -e 's/^linaro-//;' \ yann@2302: )" yann@2302: linaro_series="$( echo "${linaro_version}" \ yann@2302: |sed -r -e 's/-.*//;' \ yann@2302: )" yann@2302: yann@850: # Ah! gcc folks are kind of 'different': they store the tarballs in yann@850: # subdirectories of the same name! That's because gcc is such /crap/ that yann@850: # it is such /big/ that it needs being splitted for distribution! Sad. :-( yann@850: # Arrgghh! Some of those versions does not follow this convention: yann@850: # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a yann@850: # subdirectory! You bastard! yann@1389: CT_GetFile "gcc-${CT_CC_VERSION}" \ yann@1389: {ftp,http}://ftp.gnu.org/gnu/gcc{,{,/releases}/gcc-${CT_CC_VERSION}} \ yann@1389: ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-${CT_CC_VERSION} \ yann@2302: ftp://ftp.uvsq.fr/pub/gcc/snapshots/${CT_CC_VERSION} \ yann@2302: "${linaro_base_url}/${linaro_series}/${linaro_version}/+download" yann@1268: yann@1129: # Starting with GCC 4.3, ecj is used for Java, and will only be yann@1129: # built if the configure script finds ecj.jar at the top of the yann@1129: # GCC source tree, which will not be there unless we get it and yann@1129: # put it there ourselves yann@1129: if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y" ]; then yann@1129: CT_GetFile ecj-latest .jar ftp://gcc.gnu.org/pub/java \ yann@1129: ftp://sourceware.org/pub/java yann@1129: fi yann@850: } yann@850: yann@850: # Extract gcc yann@850: do_cc_extract() { yann@1389: CT_Extract "gcc-${CT_CC_VERSION}" yann@1901: CT_Patch "gcc" "${CT_CC_VERSION}" yann@1268: yann@1129: # Copy ecj-latest.jar to ecj.jar at the top of the GCC source tree yann@1389: if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y" \ yann@1389: -a ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar" \ yann@1259: ]; then yann@1389: CT_DoExecLog ALL cp -v "${CT_TARBALLS_DIR}/ecj-latest.jar" "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar" yann@1129: fi yann@850: } yann@850: yann@850: #------------------------------------------------------------------------------ yann@850: # Core gcc pass 1 yann@850: do_cc_core_pass_1() { yann@2886: local -a core_opts yann@2886: local do_core yann@2886: yann@850: # If we're building for bare metal, build the static core gcc, yann@850: # with libgcc. linux@1925: # In case we're not bare metal and building a canadian compiler, do nothing yann@850: # In case we're not bare metal, and we're NPTL, build the static core gcc. yann@850: # In any other case, do nothing. linux@1925: case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in yann@2886: y,*,*) yann@2886: do_core=y yann@2886: core_opts+=( "mode=static" ) yann@2886: ;; yann@2886: ,y,*) yann@2886: ;; yann@2886: ,,nptl) yann@2886: do_core=y yann@2886: core_opts+=( "mode=static" ) yann@2886: ;; yann@2886: *) yann@2886: ;; yann@850: esac yann@2886: yann@2886: if [ "${do_core}" = "y" ]; then yann@2887: do_cc_core_backend "${core_opts[@]}" yann@2886: fi yann@850: } yann@850: yann@850: # Core gcc pass 2 yann@850: do_cc_core_pass_2() { yann@2886: local -a core_opts yann@2886: local do_core yann@2886: yann@850: # In case we're building for bare metal, do nothing, we already have yann@850: # our compiler. linux@1925: # In case we're not bare metal and building a canadian compiler, do nothing yann@892: # In case we're NPTL, build the shared core gcc and the target libgcc. yann@892: # In any other case, build the static core gcc and, if using gcc-4.3+, yann@892: # also build the target libgcc. linux@1925: case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in bryanhundven@2212: y,*,*) yann@2886: do_core=y yann@2886: core_opts+=( "mode=baremetal" ) yann@2886: core_opts+=( "build_libgcc=yes" ) yann@2886: core_opts+=( "build_libstdcxx=yes" ) bryanhundven@2212: if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then yann@2886: core_opts+=( "build_staticlinked=yes" ) bryanhundven@2212: fi yann@2886: core_opts+=( "build_manuals=yes" ) bryanhundven@2212: ;; yann@1983: ,y,*) ;; linux@1925: ,,nptl) yann@2886: do_core=y yann@2886: core_opts+=( "mode=shared" ) yann@2886: core_opts+=( "build_libgcc=yes" ) yann@892: ;; bryanhundven@2212: ,,win32) yann@2886: do_core=y yann@2886: core_opts+=( "mode=static" ) yann@2886: core_opts+=( "build_libgcc=yes" ) bartvdrmeulen@2017: ;; yann@2886: *) yann@2886: do_core=y yann@2886: core_opts+=( "mode=static" ) yann@2886: if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then yann@2886: core_opts+=( "build_libgcc=yes" ) yann@892: fi yann@892: ;; yann@850: esac yann@2886: yann@2886: if [ "${do_core}" = "y" ]; then yann@2887: do_cc_core_backend "${core_opts[@]}" yann@2886: fi yann@850: } yann@850: yann@850: #------------------------------------------------------------------------------ yann@850: # Build core gcc yann@2886: # This function is used to build both the static and the shared core C compiler, yann@850: # with or without the target libgcc. We need to know wether: yann@850: # - we're building static, shared or bare metal: mode=[static|shared|baremetal] bryanhundven@2212: # - we need to build libgcc or not : build_libgcc=[yes|no] (default: no) bryanhundven@2212: # - we need to build libstdc++ or not : build_libstdcxx=[yes|no] (default: no) bryanhundven@2212: # - we need to build statically linked or not : build_staticlinked=[yes|no] (default: no) yann@2887: # Usage: do_cc_core_backend mode=[static|shared|baremetal] build_libgcc=[yes|no] build_staticlinked=[yes|no] yann@2887: do_cc_core_backend() { yann@850: local mode yann@1980: local build_libgcc=no yann@1983: local build_libstdcxx=no bryanhundven@2212: local build_staticlinked=no michael@2765: local build_manuals=no yann@850: local core_prefix_dir yann@1107: local lang_opt yann@1479: local tmp yann@2368: local -a host_libstdcxx_flags yann@1479: local -a extra_config bryanhundven@2212: local -a core_LDFLAGS yann@1981: local -a core_targets yann@2884: local arg yann@850: yann@2884: for arg in "$@"; do yann@2884: eval "${arg// /\\ }" yann@1980: done yann@850: yann@1107: lang_opt=c yann@850: case "${mode}" in yann@850: static) yann@850: core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}" yann@1479: extra_config+=("--with-newlib") yann@1479: extra_config+=("--enable-threads=no") yann@1479: extra_config+=("--disable-shared") yann@1983: copy_headers=y # For baremetal, as there's no headers to copy, yann@1983: # we copy an empty directory. So, who cares? yann@850: ;; yann@850: shared) yann@850: core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}" yann@1479: extra_config+=("--enable-shared") yann@850: copy_headers=y yann@850: ;; yann@850: baremetal) yann@850: core_prefix_dir="${CT_PREFIX_DIR}" yann@1479: extra_config+=("--with-newlib") yann@1479: extra_config+=("--enable-threads=no") yann@1479: extra_config+=("--disable-shared") yann@1107: [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++" yann@850: copy_headers=n yann@850: ;; yann@1980: *) yann@1980: CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'" yann@1980: ;; yann@850: esac yann@850: yann@1980: CT_DoStep INFO "Installing ${mode} core C compiler" yann@1980: mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}" yann@1980: cd "${CT_BUILD_DIR}/build-cc-core-${mode}" yann@1980: benoit@2487: if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then benoit@2487: # Bare metal delivers the core compiler as final compiler, so add version info and bugurl benoit@2503: extra_config+=("--with-pkgversion=${CT_PKGVERSION}") benoit@2503: [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}") benoit@2487: fi linux@1898: yann@850: if [ "${copy_headers}" = "y" ]; then yann@850: CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2" yann@1979: CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${core_prefix_dir}/${CT_TARGET}/include" yann@850: fi yann@850: yann@850: CT_DoLog EXTRA "Configuring ${mode} core C compiler" yann@850: yann@1479: for tmp in ARCH ABI CPU TUNE FPU FLOAT; do yann@1479: eval tmp="\${CT_ARCH_WITH_${tmp}}" yann@1479: if [ -n "${tmp}" ]; then yann@1479: extra_config+=("${tmp}") yann@1479: fi yann@1479: done yann@850: if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then yann@1479: extra_config+=("--enable-__cxa_atexit") yann@850: else yann@1479: extra_config+=("--disable-__cxa_atexit") yann@850: fi yann@850: bryanhundven@2212: # *** WARNING ! *** bryanhundven@2212: # Keep this full if-else-if-elif-fi-fi block in sync bryanhundven@2212: # with the same block in do_cc, below. bryanhundven@2212: if [ "${build_staticlinked}" = "yes" ]; then bryanhundven@2212: core_LDFLAGS+=("-static") yann@2368: host_libstdcxx_flags+=("-static-libgcc") yann@2368: host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++") yann@2368: host_libstdcxx_flags+=("-lm") bryanhundven@2212: # Companion libraries are build static (eg !shared), so bryanhundven@2212: # the libstdc++ is not pulled automatically, although it bryanhundven@2212: # is needed. Shoe-horn it in our LDFLAGS bryanhundven@2212: # Ditto libm on some Fedora boxen yann@2360: core_LDFLAGS+=("-lstdc++") yann@2360: core_LDFLAGS+=("-lm") bryanhundven@2212: else bryanhundven@2212: if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then bryanhundven@2212: # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2 bryanhundven@2212: # build script yann@2491: # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++, yann@2491: # see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html yann@2368: host_libstdcxx_flags+=("-static-libgcc") yann@2368: host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic") yann@2368: host_libstdcxx_flags+=("-lm") bryanhundven@2212: elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then bryanhundven@2212: # When companion libraries are build static (eg !shared), bryanhundven@2212: # the libstdc++ is not pulled automatically, although it bryanhundven@2212: # is needed. Shoe-horn it in our LDFLAGS bryanhundven@2212: # Ditto libm on some Fedora boxen bryanhundven@2212: core_LDFLAGS+=("-lstdc++") bryanhundven@2212: core_LDFLAGS+=("-lm") bryanhundven@2212: fi yann@1892: fi bryanhundven@2212: yann@1893: if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then yann@1893: extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}") yann@1893: extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}") yann@1893: fi yann@2122: if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then yann@2122: extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}") yann@2122: fi yann@2122: if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then yann@1893: extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}") yann@2368: # With PPL 0.11+, also pull libpwl if needed yann@2368: if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then yann@2368: host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib") yann@2368: host_libstdcxx_flags+=("-lpwl") yann@2368: fi yann@1893: extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}") yann@2123: elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then yann@2123: extra_config+=("--with-ppl=no") yann@2123: extra_config+=("--with-cloog=no") yann@2014: fi yann@2122: if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then yann@1920: extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}") yann@2142: extra_config+=("--enable-lto") yann@2123: elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then yann@2123: extra_config+=("--with-libelf=no") yann@2142: extra_config+=("--disable-lto") yann@1920: fi yann@1893: yann@2368: if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then yann@2368: extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}") yann@2368: fi yann@2368: titus@1972: if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then titus@1972: extra_config+=("--enable-target-optspace") titus@1972: fi titus@1972: yann@2143: case "${CT_CC_GCC_LDBL_128}" in yann@2153: y) extra_config+=("--with-long-double-128");; yann@2153: m) ;; yann@2143: "") extra_config+=("--without-long-double-128");; yann@2143: esac yann@2143: yann@2521: if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then yann@2521: extra_config+=( --enable-linker-build-id ) yann@2521: fi yann@2521: yann@2522: case "${CT_CC_GCC_LNK_HASH_STYLE}" in yann@2522: "") ;; yann@2522: *) extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );; yann@2522: esac yann@2522: yann@2532: case "${CT_ARCH}" in yann@2532: mips) yann@2532: case "${CT_CC_GCC_mips_llsc}" in yann@2532: y) extra_config+=( --with-llsc );; yann@2532: m) ;; yann@2532: *) extra_config+=( --without-llsc );; yann@2532: esac yann@2532: case "${CT_CC_GCC_mips_synci}" in yann@2532: y) extra_config+=( --with-synci );; yann@2532: m) ;; yann@2532: *) extra_config+=( --without-synci );; yann@2532: esac yann@2532: if [ "${CT_CC_GCC_mips_plt}" ]; then yann@2532: extra_config+=( --with-mips-plt ) yann@2532: fi yann@2532: ;; # ARCH is mips yann@2523: esac yann@2523: yann@2545: extra_config+=(--disable-libgomp) yann@2545: extra_config+=(--disable-libmudflap) yann@2545: zhenqiang@2780: [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls") zhenqiang@2780: zhenqiang@2782: [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ] && extra_config+=("--disable-libstdcxx-pch") zhenqiang@2782: yann@2814: if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then yann@2814: extra_config+=("--with-system-zlib") yann@2814: fi yann@2814: yann@2817: if [ "${CT_MULTILIB}" = "y" ]; then yann@2817: extra_config+=("--enable-multilib") yann@2817: else yann@2817: extra_config+=("--disable-multilib") yann@2817: fi yann@2817: yann@1893: CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'" yann@1892: yann@850: # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532) yann@2355: CT_DoExecLog CFG \ yann@1041: CC_FOR_BUILD="${CT_BUILD}-gcc" \ yann@850: CFLAGS="${CT_CFLAGS_FOR_HOST}" \ bryanhundven@2212: LDFLAGS="${core_LDFLAGS[*]}" \ yann@1389: "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure" \ yann@1041: --build=${CT_BUILD} \ yann@850: --host=${CT_HOST} \ yann@850: --target=${CT_TARGET} \ yann@850: --prefix="${core_prefix_dir}" \ yann@850: --with-local-prefix="${CT_SYSROOT_DIR}" \ yann@2043: --disable-libmudflap \ yann@850: ${CC_CORE_SYSROOT_ARG} \ yann@1479: "${extra_config[@]}" \ yann@1107: --enable-languages="${lang_opt}" \ yann@2467: "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}" yann@850: yann@850: if [ "${build_libgcc}" = "yes" ]; then yann@850: # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or yann@850: # gcc/config/t-libunwind so -lc is removed from the link for yann@850: # libgcc_s.so, as we do not have a target -lc yet. yann@850: # This is not as ugly as it appears to be ;-) All symbols get resolved yann@850: # during the glibc build, and we provide a proper libgcc_s.so for the yann@850: # cross toolchain during the final gcc build. yann@850: # yann@850: # As we cannot modify the source tree, nor override SHLIB_LC itself yann@850: # during configure or make, we have to edit the resultant yann@850: # gcc/libgcc.mk itself to remove -lc from the link. yann@850: # This causes us to have to jump through some hoops... yann@850: # yann@850: # To produce libgcc.mk to edit we firstly require libiberty.a, yann@850: # so we configure then build it. yann@850: # Next we have to configure gcc, create libgcc.mk then edit it... yann@850: # So much easier if we just edit the source tree, but hey... yann@1389: if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then yann@2676: CT_DoExecLog CFG make ${JOBSFLAGS} configure-libiberty yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a yann@2676: CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp yann@850: else yann@2676: CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp configure-build-libiberty yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty yann@850: fi yann@850: # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here. yann@1389: if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then yann@2676: CT_DoExecLog CFG make ${JOBSFLAGS} configure-libdecnumber yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a yann@850: fi yann@850: yann@850: # Starting with GCC 4.3, libgcc.mk is no longer built, yann@850: # and libgcc.mvars is used instead. yann@850: yann@892: if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then yann@850: libgcc_rule="libgcc.mvars" yann@1981: core_targets=( gcc target-libgcc ) yann@850: else yann@850: libgcc_rule="libgcc.mk" yann@1981: core_targets=( gcc ) yann@850: fi yann@850: linux@1926: # On bare metal and canadian build the host-compiler is used when linux@1926: # actually the build-system compiler is required. Choose the correct linux@1926: # compilers for canadian build and use the defaults on other linux@1926: # configurations. linux@1926: if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then linux@1926: repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \ linux@1926: GCC_FOR_TARGET=${CT_TARGET}-gcc" linux@1926: else linux@1926: repair_cc="" linux@1926: fi linux@1926: yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \ linux@1926: ${repair_cc} yann@850: sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule} yann@850: else # build_libgcc yann@1981: core_targets=( gcc ) yann@850: fi # ! build libgcc yann@1983: if [ "${build_libstdcxx}" = "yes" \ yann@1983: -a "${CT_CC_LANG_CXX}" = "y" \ yann@1983: ]; then yann@1983: core_targets+=( target-libstdc++-v3 ) yann@1983: fi yann@850: yann@850: CT_DoLog EXTRA "Building ${mode} core C compiler" yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}" yann@850: yann@850: CT_DoLog EXTRA "Installing ${mode} core C compiler" yann@2676: CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/install-}" yann@850: michael@2765: if [ "${CT_BUILD_MANUALS}" = "y" -a "${build_manuals}" = "yes" ]; then michael@2765: CT_DoLog EXTRA "Building the GCC manuals" michael@2765: CT_DoExecLog ALL make pdf html michael@2765: CT_DoLog EXTRA "Installing the GCC manuals" michael@2765: CT_DoExecLog ALL make install-{pdf,html}-gcc michael@2765: fi michael@2765: yann@1269: # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able yann@1269: # to call the C compiler with the same, somewhat canonical name. linux@1924: # check whether compiler has an extension linux@1924: file="$( ls -1 "${core_prefix_dir}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )" linux@1924: [ -z "${file}" ] || ext=".${file##*.}" yann@2550: CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${core_prefix_dir}/bin/${CT_TARGET}-cc${ext}" yann@1269: yann@2818: if [ "${CT_MULTILIB}" = "y" ]; then yann@2818: multilibs=( $( "${core_prefix_dir}/bin/${CT_TARGET}-gcc" -print-multi-lib \ yann@2818: |tail -n +2 ) ) yann@2818: if [ ${#multilibs[@]} -ne 0 ]; then yann@2818: CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):" yann@2818: for i in "${multilibs[@]}"; do yann@2818: dir="${i%%;*}" yann@2818: flags="${i#*;}" yann@2818: CT_DoLog EXTRA " ${flags//@/ -} --> ${dir}/" yann@2818: done yann@2818: else yann@2818: CT_DoLog WARN "gcc configured for multilib, but none available" yann@2818: fi yann@2818: fi yann@2818: yann@850: CT_EndStep yann@850: } yann@850: yann@850: #------------------------------------------------------------------------------ yann@850: # Build final gcc yann@850: do_cc() { yann@2368: local -a host_libstdcxx_flags yann@1479: local -a extra_config bryanhundven@2211: local -a final_LDFLAGS yann@1479: local tmp yann@1479: yann@850: # If building for bare metal, nothing to be done here, the static core conpiler is enough! yann@850: [ "${CT_BARE_METAL}" = "y" ] && return 0 yann@850: yann@850: CT_DoStep INFO "Installing final compiler" yann@850: yann@850: mkdir -p "${CT_BUILD_DIR}/build-cc" yann@850: cd "${CT_BUILD_DIR}/build-cc" yann@850: yann@850: CT_DoLog EXTRA "Configuring final compiler" yann@850: yann@850: # Enable selected languages yann@850: lang_opt="c" yann@850: [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++" yann@850: [ "${CT_CC_LANG_FORTRAN}" = "y" ] && lang_opt="${lang_opt},fortran" yann@850: [ "${CT_CC_LANG_ADA}" = "y" ] && lang_opt="${lang_opt},ada" yann@850: [ "${CT_CC_LANG_JAVA}" = "y" ] && lang_opt="${lang_opt},java" yann@850: [ "${CT_CC_LANG_OBJC}" = "y" ] && lang_opt="${lang_opt},objc" yann@850: [ "${CT_CC_LANG_OBJCXX}" = "y" ] && lang_opt="${lang_opt},obj-c++" yann@850: CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y" yann@850: CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y" yann@850: CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y" yann@850: CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}" yann@850: lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;') yann@850: yann@1479: extra_config+=("--enable-languages=${lang_opt}") yann@1479: for tmp in ARCH ABI CPU TUNE FPU FLOAT; do yann@1479: eval tmp="\${CT_ARCH_WITH_${tmp}}" yann@1479: if [ -n "${tmp}" ]; then yann@1479: extra_config+=("${tmp}") yann@1479: fi yann@1479: done yann@1479: benoit@2487: [ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared") benoit@2487: if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then benoit@2503: extra_config+=("--with-pkgversion=${CT_PKGVERSION}") benoit@2503: [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}") benoit@2487: fi yann@2042: case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in yann@2042: y) extra_config+=("--enable-sjlj-exceptions");; yann@2042: m) ;; yann@2042: "") extra_config+=("--disable-sjlj-exceptions");; yann@2042: esac yann@850: if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then yann@1479: extra_config+=("--enable-__cxa_atexit") yann@850: else yann@1479: extra_config+=("--disable-__cxa_atexit") yann@850: fi benoit@2475: if [ -n "${CT_CC_ENABLE_CXX_FLAGS}" ]; then benoit@2475: extra_config+=("--enable-cxx-flags=${CT_CC_ENABLE_CXX_FLAGS}") yann@1484: fi yann@2043: if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then yann@2043: extra_config+=(--enable-libmudflap) yann@2043: else yann@2043: extra_config+=(--disable-libmudflap) yann@2043: fi yann@2145: if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then yann@2145: extra_config+=(--enable-libgomp) yann@2145: else yann@2145: extra_config+=(--disable-libgomp) yann@2145: fi yann@2146: if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then yann@2146: extra_config+=(--enable-libssp) yann@2146: else yann@2146: extra_config+=(--disable-libssp) yann@2146: fi yann@1893: bryanhundven@2212: # *** WARNING ! *** bryanhundven@2212: # Keep this full if-else-if-elif-fi-fi block in sync bryanhundven@2212: # with the same block in do_cc_core, above. bryanhundven@2211: if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then bryanhundven@2211: final_LDFLAGS+=("-static") yann@2368: host_libstdcxx_flags+=("-static-libgcc") yann@2368: host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++") yann@2368: host_libstdcxx_flags+=("-lm") bryanhundven@2211: # Companion libraries are build static (eg !shared), so js@2045: # the libstdc++ is not pulled automatically, although it js@2045: # is needed. Shoe-horn it in our LDFLAGS dwatkins@2070: # Ditto libm on some Fedora boxen bryanhundven@2211: final_LDFLAGS+=("-lstdc++") bryanhundven@2211: final_LDFLAGS+=("-lm") bryanhundven@2211: else bryanhundven@2211: if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then bryanhundven@2211: # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2 bryanhundven@2211: # build script yann@2491: # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++, yann@2491: # see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html yann@2368: host_libstdcxx_flags+=("-static-libgcc") yann@2368: host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic") yann@2368: host_libstdcxx_flags+=("-lm") bryanhundven@2211: elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then bryanhundven@2211: # When companion libraries are build static (eg !shared), bryanhundven@2211: # the libstdc++ is not pulled automatically, although it bryanhundven@2211: # is needed. Shoe-horn it in our LDFLAGS bryanhundven@2211: # Ditto libm on some Fedora boxen bryanhundven@2211: final_LDFLAGS+=("-lstdc++") bryanhundven@2211: final_LDFLAGS+=("-lm") bryanhundven@2211: fi yann@1893: fi bryanhundven@2211: lacombar@1880: if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then yann@1893: extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}") yann@1893: extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}") yann@1848: fi yann@2122: if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then yann@2122: extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}") yann@2122: fi yann@2122: if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then yann@1893: extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}") yann@2368: # With PPL 0.11+, also pull libpwl if needed yann@2368: if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then yann@2368: host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib") yann@2368: host_libstdcxx_flags+=("-lpwl") yann@2368: fi yann@1893: extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}") yann@2123: elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then yann@2123: extra_config+=("--with-ppl=no") yann@2123: extra_config+=("--with-cloog=no") yann@2014: fi yann@2122: if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then yann@1920: extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}") yann@2123: elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then yann@2123: extra_config+=("--with-libelf=no") yann@1920: fi yann@850: yann@2368: if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then yann@2368: extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}") yann@2368: fi yann@2368: lacombar@1881: if [ "${CT_THREADS}" = "none" ]; then lacombar@1881: extra_config+=("--disable-threads") lacombar@1881: if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then yann@2145: CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y" lacombar@1881: extra_config+=("--disable-libgomp") lacombar@1881: fi lacombar@1881: else bartvdrmeulen@2017: if [ "${CT_THREADS}" = "win32" ]; then bartvdrmeulen@2017: extra_config+=("--enable-threads=win32") bartvdrmeulen@2017: extra_config+=("--disable-win32-registry") bartvdrmeulen@2017: else bartvdrmeulen@2017: extra_config+=("--enable-threads=posix") bartvdrmeulen@2017: fi lacombar@1881: fi lacombar@1881: titus@1972: if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then titus@1972: extra_config+=("--enable-target-optspace") titus@1972: fi yann@1991: if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then yann@1991: extra_config+=("--disable-libstdcxx-pch") yann@1991: fi titus@1972: yann@2143: case "${CT_CC_GCC_LDBL_128}" in yann@2153: y) extra_config+=("--with-long-double-128");; yann@2153: m) ;; yann@2143: "") extra_config+=("--without-long-double-128");; yann@2143: esac yann@2143: yann@2521: if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then yann@2521: extra_config+=( --enable-linker-build-id ) yann@2521: fi yann@2521: yann@2522: case "${CT_CC_GCC_LNK_HASH_STYLE}" in yann@2522: "") ;; yann@2522: *) extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );; yann@2522: esac yann@2522: yann@2287: if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then yann@2287: extra_config+=( --enable-plugin ) yann@2287: fi yann@2287: if [ "${CT_CC_GCC_GOLD}" = "y" ]; then yann@2248: extra_config+=( --enable-gold ) yann@2248: fi yann@2248: yann@2532: case "${CT_ARCH}" in yann@2532: mips) yann@2532: case "${CT_CC_GCC_mips_llsc}" in yann@2532: y) extra_config+=( --with-llsc );; yann@2532: m) ;; yann@2532: *) extra_config+=( --without-llsc );; yann@2532: esac yann@2532: case "${CT_CC_GCC_mips_synci}" in yann@2532: y) extra_config+=( --with-synci );; yann@2532: m) ;; yann@2532: *) extra_config+=( --without-synci );; yann@2532: esac yann@2532: if [ "${CT_CC_GCC_mips_plt}" ]; then yann@2532: extra_config+=( --with-mips-plt ) yann@2532: fi yann@2532: ;; # ARCH is mips yann@2532: esac yann@2532: zhenqiang@2780: [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls") zhenqiang@2780: yann@2814: if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then yann@2814: extra_config+=("--with-system-zlib") yann@2814: fi yann@2814: yann@2817: if [ "${CT_MULTILIB}" = "y" ]; then yann@2817: extra_config+=("--enable-multilib") yann@2817: else yann@2817: extra_config+=("--disable-multilib") yann@2817: fi yann@2817: yann@1479: CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'" yann@850: yann@2355: CT_DoExecLog CFG \ yann@1122: CC_FOR_BUILD="${CT_BUILD}-gcc" \ yann@1122: CFLAGS="${CT_CFLAGS_FOR_HOST}" \ bryanhundven@2211: LDFLAGS="${final_LDFLAGS[*]}" \ yann@1122: CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \ yann@1122: CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \ yann@1122: LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}" \ yann@1389: "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure" \ yann@1122: --build=${CT_BUILD} \ yann@1122: --host=${CT_HOST} \ yann@1122: --target=${CT_TARGET} \ yann@1122: --prefix="${CT_PREFIX_DIR}" \ yann@1122: ${CC_SYSROOT_ARG} \ yann@1479: "${extra_config[@]}" \ yann@1122: --with-local-prefix="${CT_SYSROOT_DIR}" \ yann@1122: --enable-c99 \ yann@1122: --enable-long-long \ yann@2467: "${CT_CC_EXTRA_CONFIG_ARRAY[@]}" yann@850: yann@850: if [ "${CT_CANADIAN}" = "y" ]; then yann@850: CT_DoLog EXTRA "Building libiberty" yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty yann@850: fi yann@850: yann@850: CT_DoLog EXTRA "Building final compiler" yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} all yann@850: yann@850: CT_DoLog EXTRA "Installing final compiler" yann@2676: CT_DoExecLog ALL make ${JOBSFLAGS} install yann@850: michael@2765: if [ "${CT_BUILD_MANUALS}" = "y" ]; then michael@2765: CT_DoLog EXTRA "Building the GCC manuals" michael@2765: CT_DoExecLog ALL make ${JOBSFLAGS} pdf html michael@2765: CT_DoLog EXTRA "Installing the GCC manuals" michael@2765: CT_DoExecLog ALL make install-{pdf,html}-gcc michael@2765: fi michael@2765: yann@850: # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able yann@850: # to call the C compiler with the same, somewhat canonical name. linux@1924: # check whether compiler has an extension bartvdrmeulen@2031: file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )" linux@1924: [ -z "${file}" ] || ext=".${file##*.}" yann@2550: CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}" yann@850: yann@2818: if [ "${CT_MULTILIB}" = "y" ]; then yann@2818: multilibs=( $( "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc" -print-multi-lib \ yann@2818: |tail -n +2 ) ) yann@2818: if [ ${#multilibs[@]} -ne 0 ]; then yann@2818: CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):" yann@2818: for i in "${multilibs[@]}"; do yann@2818: dir="${i%%;*}" yann@2818: flags="${i#*;}" yann@2818: CT_DoLog EXTRA " ${flags//@/ -} --> ${dir}/" yann@2818: done yann@2818: else yann@2818: CT_DoLog WARN "gcc configured for multilib, but none available" yann@2818: fi yann@2818: fi yann@2818: yann@850: CT_EndStep yann@850: }