# Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/sys-libs/glibc/files/eblits/common.eblit,v 1.10 2009/12/01 04:57:04 vapier Exp $ # We need to be able to set alternative headers for # compiling for non-native platform # Will also become useful for testing kernel-headers without screwing up # the whole system. # note: intentionally undocumented. alt_headers() { if [[ -z ${ALT_HEADERS} ]] ; then if is_crosscompile ; then ALT_HEADERS="/usr/${CTARGET}/usr/include" else ALT_HEADERS="/usr/include" fi fi echo "${ALT_HEADERS}" } alt_build_headers() { if [[ -z ${ALT_BUILD_HEADERS} ]] ; then ALT_BUILD_HEADERS=$(alt_headers) if tc-is-cross-compiler ; then ALT_BUILD_HEADERS=${ROOT}$(alt_headers) if [[ ! -e ${ALT_BUILD_HEADERS}/linux/version.h ]] ; then local header_path=$(echo '#include ' | $(tc-getCPP ${CTARGET}) ${CFLAGS} 2>&1 | grep -o '[^"]*linux/version.h') ALT_BUILD_HEADERS=${header_path%/linux/version.h} fi fi fi echo "${ALT_BUILD_HEADERS}" } alt_usrlibdir() { if is_crosscompile ; then echo /usr/${CTARGET}/usr/$(get_libdir) else echo /usr/$(get_libdir) fi } setup_flags() { # Make sure host make.conf doesn't pollute us if is_crosscompile || tc-is-cross-compiler ; then CHOST=${CTARGET} strip-unsupported-flags fi # Store our CFLAGS because it's changed depending on which CTARGET # we are building when pulling glibc on a multilib profile CFLAGS_BASE=${CFLAGS_BASE-${CFLAGS}} CFLAGS=${CFLAGS_BASE} CXXFLAGS_BASE=${CXXFLAGS_BASE-${CXXFLAGS}} CXXFLAGS=${CXXFLAGS_BASE} ASFLAGS_BASE=${ASFLAGS_BASE-${ASFLAGS}} ASFLAGS=${ASFLAGS_BASE} # Over-zealous CFLAGS can often cause problems. What may work for one # person may not work for another. To avoid a large influx of bugs # relating to failed builds, we strip most CFLAGS out to ensure as few # problems as possible. strip-flags strip-unsupported-flags filter-flags -m32 -m64 -mabi=* unset CBUILD_OPT CTARGET_OPT if has_multilib_profile ; then CTARGET_OPT=$(get_abi_CTARGET) [[ -z ${CTARGET_OPT} ]] && CTARGET_OPT=$(get_abi_CHOST) fi case $(tc-arch) in x86) # -march needed for #185404 local t=${CTARGET_OPT:-${CTARGET}} t=${t%%-*} if ! echo "" | $(tc-getCC) ${CFLAGS} -E -dD - | grep -qs __${t}__ ; then filter-flags '-march=*' export CFLAGS="-march=${t} ${CFLAGS}" fi ;; amd64) # Punt this when amd64's 2004.3 is removed CFLAGS_x86="-m32" # -march needed for #185404 local t=${CTARGET_OPT:-${CTARGET}} t=${t%%-*} if ! echo "" | $(tc-getCC) ${CFLAGS} ${CFLAGS_x86} -m32 -E -dD - | grep -qs __${t}__ ; then filter-flags '-march=*' export CFLAGS_x86="${CFLAGS_x86} -march=${t}" fi ;; ppc) append-flags "-freorder-blocks" ;; sparc) # Both sparc and sparc64 can use -fcall-used-g6. -g7 is bad, though. filter-flags "-fcall-used-g7" append-flags "-fcall-used-g6" filter-flags "-mvis" GLIBCMAJOR=$(get_version_component_range 1 ${PV}) GLIBCMINOR=$(get_version_component_range 2 ${PV}) # set CTARGET_OPT so glibc can use cpu-specific .S files for better performance # - UltraSPARC T1 (niagara) support requires >= glibc 2.8 # - UltraSPARC T2 (niagara2) support requires >= glibc 2.7 if is_crosscompile || [[ ${PROFILE_ARCH} == "sparc64" ]] || { has_multilib_profile && ! tc-is-cross-compiler; } ; then case ${ABI} in sparc64) filter-flags -Wa,-xarch -Wa,-A if is-flagq "-mcpu=niagara2" && [[ ${GLIBCMAJOR}.${GLIBCMINOR} > 2.7 ]] ; then CTARGET_OPT="sparc64v2-unknown-linux-gnu" append-flags "-Wa,-xarch=v9b" export ASFLAGS="${ASFLAGS} -Wa,-xarch=v9b" elif { is-flagq "-mcpu=niagara" || is-flagq "-mcpu=niagara2" ; } && [[ ${GLIBCMAJOR}.${GLIBCMINOR} > 2.6 ]] ; then CTARGET_OPT="sparc64v-unknown-linux-gnu" append-flags "-Wa,-xarch=v9b" export ASFLAGS="${ASFLAGS} -Wa,-xarch=v9b" elif is-flagq "-mcpu=ultrasparc3" || is-flagq "-mcpu=niagara" || is-flagq "-mcpu=niagara2"; then CTARGET_OPT="sparc64b-unknown-linux-gnu" append-flags "-Wa,-xarch=v9b" export ASFLAGS="${ASFLAGS} -Wa,-xarch=v9b" else CTARGET_OPT="sparc64-unknown-linux-gnu" append-flags "-Wa,-xarch=v9a" export ASFLAGS="${ASFLAGS} -Wa,-xarch=v9a" fi ;; *) if is-flagq "-mcpu=niagara2" && [[ ${GLIBCMAJOR}.${GLIBCMINOR} > 2.7 ]] ; then CTARGET_OPT="sparcv9v2-unknown-linux-gnu" elif { is-flagq "-mcpu=niagara" || is-flagq "-mcpu=niagara2" ; } && [[ ${GLIBCMAJOR}.${GLIBCMINOR} > 2.6 ]] ; then CTARGET_OPT="sparcv9v-unknown-linux-gnu" elif is-flagq "-mcpu=ultrasparc3" || is-flagq "-mcpu=niagara" || is-flagq "-mcpu=niagara2"; then CTARGET_OPT="sparcv9b-unknown-linux-gnu" else CTARGET_OPT="sparcv9-unknown-linux-gnu" fi ;; esac else if is-flagq "-mcpu=niagara2" && [[ ${GLIBCMAJOR}.${GLIBCMINOR} > 2.7 ]] ; then CTARGET_OPT="sparcv9v2-unknown-linux-gnu" elif { is-flagq "-mcpu=niagara" || is-flagq "-mcpu=niagara2" ; } && [[ ${GLIBCMAJOR}.${GLIBCMINOR} > 2.6 ]] ; then CTARGET_OPT="sparcv9v-unknown-linux-gnu" elif is-flagq "-mcpu=ultrasparc3" || is-flagq "-mcpu=niagara" || is-flagq "-mcpu=niagara2"; then CTARGET_OPT="sparcv9b-unknown-linux-gnu" elif { is_crosscompile && want_nptl; } || is-flagq "-mcpu=ultrasparc2" || is-flagq "-mcpu=ultrasparc"; then CTARGET_OPT="sparcv9-unknown-linux-gnu" fi fi ;; esac if [[ -n ${CTARGET_OPT} && ${CBUILD} == ${CHOST} ]] && ! is_crosscompile; then CBUILD_OPT=${CTARGET_OPT} fi # Lock glibc at -O2 -- linuxthreads needs it and we want to be # conservative here. -fno-strict-aliasing is to work around #155906 filter-flags -O? append-flags -O2 -fno-strict-aliasing # Cant build glibc itself with fortify code append-cppflags -U_FORTIFY_SOURCE # building glibc with SSP is fraught with difficulty, especially # due to __stack_chk_fail_local which would mean significant changes # to the glibc build process. See bug #94325 filter-flags -fstack-protector if use hardened && gcc-specs-pie ; then # Force PIC macro definition for all compilations since they're all # either -fPIC or -fPIE with the default-PIE compiler. append-cppflags -DPIC else # Don't build -fPIE without the default-PIE compiler and the # hardened-pie patch filter-flags -fPIE fi } want_nptl() { [[ -z ${LT_VER} ]] && return 0 want_tls || return 1 use nptl || return 1 # Only list the arches that cannot do NPTL case $(tc-arch) in m68k) return 1;; sparc) # >= v9 is needed for nptl. [[ ${PROFILE_ARCH} == "sparc" ]] && return 1 ;; esac return 0 } want_linuxthreads() { [[ -z ${LT_VER} ]] && return 1 ! use nptlonly && return 0 want_nptl || return 0 return 1 } want_tls() { # Archs that can use TLS (Thread Local Storage) case $(tc-arch) in sparc) # 2.3.6 should have tls support on sparc64 # when using newer binutils case ${CTARGET/-*} in sparc64*) return 1 ;; *) return 0 ;; esac ;; x86) # requires i486 or better #106556 [[ ${CTARGET} == i[4567]86* ]] && return 0 return 1 ;; esac return 0 } want__thread() { want_tls || return 1 # For some reason --with-tls --with__thread is causing segfaults on sparc32. [[ ${PROFILE_ARCH} == "sparc" ]] && return 1 [[ -n ${WANT__THREAD} ]] && return ${WANT__THREAD} # only test gcc -- cant test linking yet tc-has-tls -c ${CTARGET} WANT__THREAD=$? return ${WANT__THREAD} } use_multilib() { case ${CTARGET} in sparc*|mips64*|x86_64*|powerpc64*|s390x*) has_multilib_profile || use multilib ;; *) false ;; esac } # Setup toolchain variables that would be defined in the profiles for these archs. setup_env() { # silly users unset LD_RUN_PATH if is_crosscompile || tc-is-cross-compiler ; then multilib_env ${CTARGET} if ! use multilib ; then MULTILIB_ABIS=${DEFAULT_ABI} else MULTILIB_ABIS=${MULTILIB_ABIS:-${DEFAULT_ABI}} fi # If the user has CFLAGS_ in their make.conf, use that, # and fall back on CFLAGS. local VAR=CFLAGS_${CTARGET//[-.]/_} CFLAGS=${!VAR-${CFLAGS}} fi setup_flags export ABI=${ABI:-${DEFAULT_ABI:-default}} if is_crosscompile || tc-is-cross-compiler ; then local VAR=CFLAGS_${ABI} # We need to export CFLAGS with abi information in them because # glibc's configure script checks CFLAGS for some targets (like mips) export CFLAGS="${!VAR} ${CFLAGS}" fi } just_headers() { is_crosscompile && use crosscompile_opts_headers-only }