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@2932: # This function builds up the set of languages to enable yann@2932: # No argument expected, returns the comma-separated language list on stdout yann@2932: cc_gcc_lang_list() { yann@2932: local lang_list yann@2932: yann@2932: lang_list="c" yann@2932: [ "${CT_CC_LANG_CXX}" = "y" ] && lang_list+=",c++" yann@2932: [ "${CT_CC_LANG_FORTRAN}" = "y" ] && lang_list+=",fortran" yann@2932: [ "${CT_CC_LANG_ADA}" = "y" ] && lang_list+=",ada" yann@2932: [ "${CT_CC_LANG_JAVA}" = "y" ] && lang_list+=",java" yann@2932: [ "${CT_CC_LANG_OBJC}" = "y" ] && lang_list+=",objc" yann@2932: [ "${CT_CC_LANG_OBJCXX}" = "y" ] && lang_list+=",obj-c++" yann@2932: lang_list+="${CT_CC_LANG_OTHERS:+,${CT_CC_LANG_OTHERS}}" yann@2932: yann@2932: printf "%s" "${lang_list}" yann@2932: } yann@2932: yann@2932: #------------------------------------------------------------------------------ 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@2930: # Do nothing for canadian-crosses, we already have a target compiler. yann@2930: # We only need a pass-1 core gcc if the threading model is NPTL. yann@2930: # For all other cases, it is not used. yann@2930: case "${CT_CANADIAN},${CT_THREADS}" in yann@2930: y,*) yann@2886: ;; yann@2930: ,nptl) yann@2886: do_core=y yann@2886: core_opts+=( "mode=static" ) yann@2925: core_opts+=( "host=${CT_BUILD}" ) yann@2931: core_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" ) yann@2924: core_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" ) yann@2891: core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" ) yann@2933: core_opts+=( "lang_list=c" ) yann@2886: ;; yann@850: esac yann@2886: yann@2886: if [ "${do_core}" = "y" ]; then yann@2900: CT_DoStep INFO "Installing pass-1 core C compiler" yann@2900: CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-core-pass-1" yann@2900: yann@2887: do_cc_core_backend "${core_opts[@]}" yann@2900: yann@2900: CT_Popd yann@2900: CT_EndStep 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@2930: # Common options: yann@2930: core_opts+=( "host=${CT_BUILD}" ) yann@2924: core_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" ) yann@2931: core_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" ) yann@2930: core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" ) yann@2933: core_opts+=( "lang_list=c" ) yann@2930: yann@2930: # Do nothing for canadian-crosses, we already have a target compiler. yann@2930: # Different conditions are at stake here: yann@2930: # - In case the threading model is NPTL, we need a shared-capable core yann@2930: # gcc; in all other cases, we need a static-only core gcc. yann@2930: # - In case the threading model is NPTL or win32, or gcc is 4.3 or yann@2930: # later, we need to build libgcc yann@2930: case "${CT_CANADIAN},${CT_THREADS}" in yann@2930: y,*) bryanhundven@2212: ;; yann@2930: ,nptl) yann@2886: do_core=y yann@2886: core_opts+=( "mode=shared" ) yann@2886: core_opts+=( "build_libgcc=yes" ) yann@892: ;; yann@2930: ,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@2900: CT_DoStep INFO "Installing pass-2 core C compiler" yann@2900: CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-core-pass-2" yann@2900: yann@2887: do_cc_core_backend "${core_opts[@]}" yann@2900: yann@2900: CT_Popd yann@2900: CT_EndStep yann@2886: fi yann@850: } yann@850: yann@850: #------------------------------------------------------------------------------ yann@850: # Build core gcc yann@2897: # This function is used to build the core C compiler. yann@2897: # Usage: do_cc_core_backend param=value [...] yann@2897: # Parameter : Definition : Type : Default yann@2897: # mode : build a 'static', 'shared' or 'baremetal' : string : (none) yann@2897: # host : the machine the core will run on : tuple : (none) yann@2897: # prefix : dir prefix to install into : dir : (none) yann@2897: # complibs : dir where complibs are isntalled : dir : (none) yann@2933: # lang_list : the list of languages to build : string : (empty) yann@2897: # build_libgcc : build libgcc or not : bool : no yann@2897: # build_libstdcxx : build libstdc++ or not : bool : no yann@2897: # build_staticlinked : build statically linked or not : bool : no yann@2897: # build_manuals : whether to build manuals or not : bool : no yann@2897: # cflags : host CFLAGS to use : string : (empty) 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@2890: local host yann@2889: local prefix yann@2888: local complibs yann@2933: local lang_list yann@2891: local cflags 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@2900: CT_DoLog EXTRA "Configuring core C compiler" yann@2900: yann@850: case "${mode}" in yann@850: static) 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@1479: extra_config+=("--enable-shared") yann@850: copy_headers=y yann@850: ;; yann@850: baremetal) yann@1479: extra_config+=("--with-newlib") yann@1479: extra_config+=("--enable-threads=no") yann@1479: extra_config+=("--disable-shared") 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: 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@2889: CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${prefix}/${CT_TARGET}/include" yann@850: fi 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@2888: extra_config+=("--with-gmp=${complibs}") yann@2888: extra_config+=("--with-mpfr=${complibs}") yann@1893: fi yann@2122: if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then yann@2888: extra_config+=("--with-mpc=${complibs}") yann@2122: fi yann@2122: if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then yann@2888: extra_config+=("--with-ppl=${complibs}") yann@2368: # With PPL 0.11+, also pull libpwl if needed yann@2368: if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then yann@2888: host_libstdcxx_flags+=("-L${complibs}/lib") yann@2368: host_libstdcxx_flags+=("-lpwl") yann@2368: fi yann@2888: extra_config+=("--with-cloog=${complibs}") 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@2888: extra_config+=("--with-libelf=${complibs}") 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@2891: CFLAGS="${cflags}" \ bryanhundven@2212: LDFLAGS="${core_LDFLAGS[*]}" \ yann@1389: "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure" \ yann@1041: --build=${CT_BUILD} \ yann@2890: --host=${host} \ yann@850: --target=${CT_TARGET} \ yann@2889: --prefix="${prefix}" \ yann@850: --with-local-prefix="${CT_SYSROOT_DIR}" \ yann@2043: --disable-libmudflap \ yann@850: ${CC_CORE_SYSROOT_ARG} \ yann@1479: "${extra_config[@]}" \ yann@2933: --enable-languages="${lang_list}" \ 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@2900: CT_DoLog EXTRA "Building core C compiler" yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}" yann@850: yann@2900: CT_DoLog EXTRA "Installing core C compiler" yann@2676: CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/install-}" yann@850: yann@2894: if [ "${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 yann@2889: file="$( ls -1 "${prefix}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )" linux@1924: [ -z "${file}" ] || ext=".${file##*.}" yann@2889: CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}" yann@1269: yann@2818: if [ "${CT_MULTILIB}" = "y" ]; then zhenqiang@2901: multilibs=( $( "${prefix}/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@850: } yann@850: yann@850: #------------------------------------------------------------------------------ yann@2935: # Build complete gcc to run on build yann@2935: do_cc_for_build() { yann@2935: local -a build_final_opts yann@2935: local build_final_backend yann@2935: yann@2935: # In case we're canadian or cross-native, it seems that a yann@2935: # real, complete compiler is needed?!? WTF? Sigh... yann@2935: # Otherwise, there is nothing to do. yann@2935: case "${CT_TOOLCHAIN_TYPE}" in yann@2935: native|cross) return 0;; yann@2935: esac yann@2935: yann@2935: build_final_opts+=( "host=${CT_BUILD}" ) yann@2935: build_final_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" ) yann@2935: build_final_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" ) yann@2935: build_final_opts+=( "lang_list=$( cc_gcc_lang_list )" ) yann@2935: if [ "${CT_BARE_METAL}" = "y" ]; then yann@2935: # In the tests I've done, bare-metal was not impacted by the yann@2935: # lack of such a compiler, but better safe than sorry... yann@2935: build_final_opts+=( "mode=baremetal" ) yann@2935: build_final_opts+=( "build_libgcc=yes" ) yann@2935: build_final_opts+=( "build_libstdcxx=yes" ) yann@2935: if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then yann@2935: build_final_opts+=( "build_staticlinked=yes" ) yann@2935: fi yann@2935: build_final_backend=do_cc_core_backend yann@2935: else yann@2935: build_final_backend=do_cc_backend yann@2935: fi yann@2935: yann@2935: CT_DoStep INFO "Installing final compiler for build" yann@2935: CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final-build-${CT_BUILD}" yann@2935: yann@2935: "${build_final_backend}" "${build_final_opts[@]}" yann@2935: yann@2935: CT_Popd yann@2935: CT_EndStep yann@2935: } yann@2935: yann@2935: #------------------------------------------------------------------------------ yann@2935: # Build final gcc to run on host yann@2935: do_cc_for_host() { yann@2892: local -a final_opts yann@2893: local final_backend yann@2892: yann@2892: final_opts+=( "host=${CT_HOST}" ) yann@2892: final_opts+=( "prefix=${CT_PREFIX_DIR}" ) yann@2931: final_opts+=( "complibs=${CT_HOST_COMPLIBS_DIR}" ) yann@2892: final_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" ) yann@2934: final_opts+=( "lang_list=$( cc_gcc_lang_list )" ) yann@2894: if [ "${CT_BUILD_MANUALS}" = "y" ]; then yann@2894: final_opts+=( "build_manuals=yes" ) yann@2894: fi yann@2893: if [ "${CT_BARE_METAL}" = "y" ]; then yann@2893: final_opts+=( "mode=baremetal" ) yann@2893: final_opts+=( "build_libgcc=yes" ) yann@2893: final_opts+=( "build_libstdcxx=yes" ) yann@2893: if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then yann@2893: final_opts+=( "build_staticlinked=yes" ) yann@2893: fi yann@2893: final_backend=do_cc_core_backend yann@2893: else yann@2893: final_backend=do_cc_backend yann@2893: fi yann@2892: yann@2900: CT_DoStep INFO "Installing final compiler" yann@2900: CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final" yann@2900: yann@2893: "${final_backend}" "${final_opts[@]}" yann@2900: yann@2900: CT_Popd yann@2900: CT_EndStep yann@2892: } yann@2892: yann@2892: #------------------------------------------------------------------------------ yann@2897: # Build the final gcc yann@2897: # Usage: do_cc_backend param=value [...] yann@2892: # Parameter : Definition : Type : Default yann@2892: # host : the host we run onto : tuple : (none) yann@2892: # prefix : the runtime prefix : dir : (none) yann@2892: # complibs : the companion libraries prefix : dir : (none) yann@2892: # cflags : the host CFLAGS : string : (empty) yann@2934: # lang_list : the list of languages to build : string : (empty) yann@2894: # build_manuals : whether to build manuals or not : bool : no yann@2892: do_cc_backend() { yann@2892: local host yann@2892: local prefix yann@2892: local complibs yann@2892: local cflags yann@2934: local lang_list yann@2894: local build_manuals yann@2368: local -a host_libstdcxx_flags yann@1479: local -a extra_config bryanhundven@2211: local -a final_LDFLAGS yann@1479: local tmp yann@2892: local arg yann@1479: yann@2892: for arg in "$@"; do yann@2892: eval "${arg// /\\ }" yann@2892: done yann@2892: yann@850: CT_DoLog EXTRA "Configuring final compiler" yann@850: yann@850: # Enable selected languages yann@2934: extra_config+=("--enable-languages=${lang_list}") 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@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@2892: extra_config+=("--with-gmp=${complibs}") yann@2892: extra_config+=("--with-mpfr=${complibs}") yann@1848: fi yann@2122: if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then yann@2892: extra_config+=("--with-mpc=${complibs}") yann@2122: fi yann@2122: if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then yann@2892: extra_config+=("--with-ppl=${complibs}") yann@2368: # With PPL 0.11+, also pull libpwl if needed yann@2368: if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then yann@2892: host_libstdcxx_flags+=("-L${complibs}/lib") yann@2368: host_libstdcxx_flags+=("-lpwl") yann@2368: fi yann@2892: extra_config+=("--with-cloog=${complibs}") 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@2892: extra_config+=("--with-libelf=${complibs}") 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@2892: CFLAGS="${cflags}" \ 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@2892: --host=${host} \ yann@1122: --target=${CT_TARGET} \ yann@2892: --prefix="${prefix}" \ 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: yann@2894: if [ "${build_manuals}" = "yes" ]; 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@850: }