289 lines
8.5 KiB
Plaintext
289 lines
8.5 KiB
Plaintext
|
# 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.9 2009/01/28 18:11:41 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 <linux/version.h>' | $(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}
|
||
|
|
||
|
echo 'extern __thread int i;' > "${T}"/test-__thread.c
|
||
|
$(tc-getCC ${CTARGET}) -c "${T}"/test-__thread.c -o "${T}"/test-__thread.o &> /dev/null
|
||
|
WANT__THREAD=$?
|
||
|
rm -f "${T}"/test-__thread.[co]
|
||
|
|
||
|
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_<CTARGET> 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
|
||
|
}
|