Hello Little!   
      
   03 Aug 2018 21:14, Little Mikey wrote to Benny Pedersen:   
      
    BP>> i have glibc from truck github if i want to use it, there is no   
    BP>> safe way back if emerged   
      
    LM> Understood. glibc is the trickiest package to upgrade since    
    LM> everything relies on it.   
      
   +1   
      
    LM> That is why special partitions are deployed    
    LM> here for experimenting with glibc.   
      
   how is the layout with it ?   
      
   lvm2 snapshot rollbacks ?   
      
    LM> Having said that, this reply is    
    LM> being entered on a booted rootfs based on glibc-2.28 with a    
    LM> bootstrapped gcc-8.2.0 and at this writing a linux-4.17.11 kernel.    
    LM> The original post you are replying to was also from this same rootfs.   
      
   i could do this on gentoo, i know enough to hack this with gentoo portage, but   
   i dont know how cold it could be on the maunting top :)   
      
    BP>> could you test this ? :)   
    LM> Do you mean the gentoo package?   
      
    ----- glibc-9999.ebuild begins -----   
   # Copyright 1999-2018 Gentoo Foundation   
   # Distributed under the terms of the GNU General Public License v2   
      
   EAPI=6   
      
   inherit prefix eutils versionator toolchain-funcs flag-o-matic gnuconfig \   
    multilib systemd multiprocessing   
      
   DESCRIPTION="GNU libc C library"   
   HOMEPAGE="https://www.gnu.org/software/libc/"   
   LICENSE="LGPL-2.1+ BSD HPND ISC inner-net rc PCRE"   
   RESTRICT="strip" # Strip ourself #46186   
   SLOT="2.2"   
      
   EMULTILIB_PKG="true"   
      
   if [[ ${PV} == 9999* ]]; then   
    EGIT_REPO_URI="https://sourceware.org/git/glibc.git"   
    inherit git-r3   
   else   
    # KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc   
   ~ppc64 ~s390 ~sh ~sparc ~x86"   
    KEYWORDS=""   
    SRC_URI="mirror://gnu/glibc/${P}.tar.xz"   
   fi   
      
   RELEASE_VER=${PV}   
      
   GCC_BOOTSTRAP_VER=20180511   
      
   # Gentoo patchset   
   PATCH_VER=7   
      
   SRC_URI+=" https://dev.gentoo.org/~dilfridge/distfiles/${P}-patc   
   es-${PATCH_VER}.tar.bz2"   
   SRC_URI+=" multilib? ( https://dev.gentoo.org/~dilfridge/distfil   
   s/gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}.tar.xz )"   
      
   IUSE="audit caps cet compile-locales doc gd hardened headers-only +multiarch   
   multilib nscd profile selinux suid systemtap test vanilla"   
      
   # Minimum kernel version that glibc requires   
   MIN_KERN_VER="3.2.0"   
      
   # Here's how the cross-compile logic breaks down ...   
   # CTARGET - machine that will target the binaries   
   # CHOST - machine that will host the binaries   
   # CBUILD - machine that will build the binaries   
   # If CTARGET != CHOST, it means you want a libc for cross-compiling.   
   # If CHOST != CBUILD, it means you want to cross-compile the libc.   
   # CBUILD = CHOST = CTARGET - native build/install   
   # CBUILD != (CHOST = CTARGET) - cross-compile a native build   
   # (CBUILD = CHOST) != CTARGET - libc for cross-compiler   
   # CBUILD != CHOST != CTARGET - cross-compile a libc for a cross-compiler   
   # For install paths:   
   # CHOST = CTARGET - install into /   
   # CHOST != CTARGET - install into /usr/CTARGET/   
   #   
   export CBUILD=${CBUILD:-${CHOST}}   
   export CTARGET=${CTARGET:-${CHOST}}   
   if [[ ${CTARGET} == ${CHOST} ]] ; then   
    if [[ ${CATEGORY} == cross-* ]] ; then   
    export CTARGET=${CATEGORY#cross-}   
    fi   
   fi   
      
   # We need a new-enough binutils/gcc to match upstream baseline.   
   # Also we need to make sure our binutils/gcc supports TLS.   
   COMMON_DEPEND="   
    nscd? ( selinux? (   
    audit? ( sys-process/audit )   
    caps? ( sys-libs/libcap )   
    ) )   
    suid? ( caps? ( sys-libs/libcap ) )   
    selinux? ( sys-libs/libselinux )   
    systemtap? ( dev-util/systemtap )   
   "   
   DEPEND="${COMMON_DEPEND}   
    >=app-misc/pax-utils-0.1.10   
    sys-devel/bison   
    !=net-dns/libidn2-2.0.5 )   
   "   
   RDEPEND="${COMMON_DEPEND}   
    >=net-dns/libidn2-2.0.5   
    sys-apps/gentoo-functions   
    !sys-kernel/ps3-sources   
    !sys-libs/nss-db   
   "   
      
   if [[ ${CATEGORY} == cross-* ]] ; then   
    DEPEND+=" !headers-only? (   
    >=${CATEGORY}/binutils-2.24   
    >=${CATEGORY}/gcc-4.9   
    )"   
    [[ ${CATEGORY} == *-linux* ]] && DEPEND+=" ${CATEGORY}/linux-headers"   
   else   
    DEPEND+="   
    >=sys-devel/binutils-2.24   
    >=sys-devel/gcc-4.9   
    virtual/os-headers   
    "   
    RDEPEND+=" vanilla? ( !sys-libs/timezone-data )"   
    PDEPEND+=" !vanilla? ( sys-libs/timezone-data )"   
   fi   
      
   #   
   # Small helper functions   
   #   
      
   is_crosscompile() {   
    [[ ${CHOST} != ${CTARGET} ]]   
   }   
      
   just_headers() {   
    is_crosscompile && use headers-only   
   }   
      
   alt_prefix() {   
    is_crosscompile && echo /usr/${CTARGET}   
   }   
      
   # 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.   
   alt_headers() {   
    echo ${ALT_HEADERS:=$(alt_prefix)/usr/include}   
   }   
      
   alt_build_headers() {   
    if [[ -z ${ALT_BUILD_HEADERS} ]] ; then   
    ALT_BUILD_HEADERS="${EPREFIX}$(alt_headers)"   
    if tc-is-cross-compiler ; then   
    ALT_BUILD_HEADERS=${SYSROOT}$(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_libdir() {   
    echo $(alt_prefix)/$(get_libdir)   
   }   
   alt_usrlibdir() {   
    echo $(alt_prefix)/usr/$(get_libdir)   
   }   
      
   builddir() {   
    echo "${WORKDIR}/build-${ABI}-${CTARGET}-$1"   
   }   
      
   do_compile_test() {   
    local ret save_cflags=${CFLAGS}   
    CFLAGS+=" $1"   
    shift   
      
    pushd "${T}" >/dev/null   
      
    rm -f glibc-test*   
    printf '%b' "$*" > glibc-test.c   
      
    nonfatal emake -s glibc-test   
    ret=$?   
      
    popd >/dev/null   
      
    CFLAGS=${save_cflags}   
    return ${ret}   
   }   
      
   do_run_test() {   
    local ret   
      
    if [[ ${MERGE_TYPE} == "binary" ]] ; then   
    # ignore build failures when installing a binary package   
   #324685   
    do_compile_test "" "$@" 2>/dev/null || return 0   
    else   
    if ! do_compile_test "" "$@" ; then   
    ewarn "Simple build failed ... assuming this is   
   desired #324685"   
    return 0   
    fi   
    fi   
      
    pushd "${T}" >/dev/null   
      
    ./glibc-test   
    ret=$?   
    rm -f glibc-test*   
      
    popd >/dev/null   
      
    return ${ret}   
   }   
      
   setup_target_flags() {   
    # This largely mucks with compiler flags. None of which should matter   
    # when building up just the headers.   
    just_headers && return 0   
      
    case $(tc-arch) in   
    x86)   
    # -march needed for #185404 #199334   
    # TODO: When creating the first glibc cross-compile,   
   this test will   
    # always fail as it does a full link which in turn   
   requires glibc.   
    # Probably also applies when changing multilib profile   
   settings (e.g.   
    # enabling x86 when the profile was amd64-only   
   previously).   
    # We could change main to _start and pass -nostdlib   
   here so that we   
    # only test the gcc code compilation. Or we could do   
   a compile and   
    # then look for the symbol via scanelf.   
    if ! do_compile_test "" 'void f(int i, void *p) {if   
   (__sync_fetch_and_add(&i, 1)) f(i, p);}\nint main(){return 0;}\n' 2>/dev/null   
   then   
    local t=${CTARGET_OPT:-${CTARGET}}   
    t=${t%%-*}   
    filter-flags '-march=*'   
    export CFLAGS="-march=${t} ${CFLAGS}"   
    einfo "Auto adding -march=${t} to CFLAGS   
   #185404"   
    fi   
    ;;   
    amd64)   
    # -march needed for #185404 #199334   
    # Note: This test only matters when the x86 ABI is   
   enabled, so we could   
    # optimize a bit and elide it.   
    # TODO: See cross-compile issues listed above for x86.   
    if ! do_compile_test "${CFLAGS_x86}" 'void f(int i,   
   void *p) {if (__sync_fetch_and_add(&i, 1)) f(i, p);}\nint main(){return 0;}\n'   
   2>/dev/null ; then   
    local t=${CTARGET_OPT:-${CTARGET}}   
    t=${t%%-*}   
    # Normally the target is x86_64-xxx, so turn   
   that into the -march that   
    # gcc actually accepts. #528708   
    [[ ${t} == "x86_64" ]] && t="x86-64"   
    filter-flags '-march=*'   
    # ugly, ugly, ugly. ugly.   
    CFLAGS_x86=$(CFLAGS=${CFLAGS_x86} filter-flags   
   '-march=*'; echo "${CFLAGS}")   
    export CFLAGS_x86="${CFLAGS_x86} -march=${t}"   
    einfo "Auto adding -march=${t} to CFLAGS_x86   
   #185404"   
    fi   
    ;;   
    mips)   
    # The mips abi cannot support the GNU style hashes.   
   #233233   
    filter-ldflags -Wl,--hash-style=gnu -Wl,   
   -hash-style=both   
    ;;   
    sparc)   
    # Both sparc and sparc64 can use -fcall-used-g6. -g7   
   is bad, though.   
    filter-flags "-fcall-used-g7"   
    append-flags "-fcall-used-g6"   
      
    # If the CHOST is the basic one (e.g. not sparcv9-xxx   
   already),   
    # try to pick a better one so glibc can use   
   cpu-specific .S files.   
    # We key off the CFLAGS to get a good value. Also   
   need to handle   
    # version skew.   
    # We can't force users to set their CHOST to their   
   exact machine   
    # as many of these are not recognized by   
   config.sub/gcc and such :(.   
    # Note: If the mcpu values don't scale, we might try   
   probing CPP defines.   
    # Note: Should we factor in -Wa,-AvXXX flags too ? Or   
   -mvis/etc... ?   
      
    local cpu   
    case ${CTARGET} in   
    sparc64-*)   
    case $(get-flag mcpu) in   
    niagara[234])   
    if version_is_at_least 2.8 ; then   
    cpu="sparc64v2"   
    elif version_is_at_least 2.4 ; then   
    cpu="sparc64v"   
    elif version_is_at_least 2.2.3 ; then   
    cpu="sparc64b"   
    fi   
    ;;   
    niagara)   
    if version_is_at_least 2.4 ; then   
    cpu="sparc64v"   
    elif version_is_at_least 2.2.3 ; then   
    cpu="sparc64b"   
    fi   
    ;;   
    ultrasparc3)   
    cpu="sparc64b"   
    ;;   
    *)   
    # We need to force at least v9a   
   because the base build doesn't   
    # work with just v9.   
    # https://sourceware.org   
   bugzilla/show_bug.cgi?id=19477   
    [[ -z ${cpu} ]] && append-flags   
   "-Wa,-xarch=v9a"   
    ;;   
    esac   
    ;;   
    sparc-*)   
    case $(get-flag mcpu) in   
    niagara[234])   
    if version_is_at_least 2.8 ; then   
    cpu="sparcv9v2"   
    elif version_is_at_least 2.4 ; then   
    cpu="sparcv9v"   
    elif version_is_at_least 2.2.3 ; then   
    cpu="sparcv9b"   
    else   
    cpu="sparcv9"   
    fi   
    ;;   
    niagara)   
    if version_is_at_least 2.4 ; then   
    cpu="sparcv9v"   
    elif version_is_at_least 2.2.3 ; then   
    cpu="sparcv9b"   
    else   
    cpu="sparcv9"   
    fi   
    ;;   
    ultrasparc3)   
    cpu="sparcv9b"   
    ;;   
    v9|ultrasparc)   
    cpu="sparcv9"   
    ;;   
    v8|supersparc|hypersparc|leon|leon3)   
    cpu="sparcv8"   
    ;;   
    esac   
    ;;   
    esac   
    [[ -n ${cpu} ]] && CTARGET_OPT="${cpu}-${CTARGET#*-}"   
    ;;   
    esac   
   }   
      
   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=*'   
      
    # glibc aborts if rpath is set by LDFLAGS   
    filter-ldflags '-Wl,-rpath=*'   
      
    # #492892   
    filter-flags -frecord-gcc-switches   
      
    unset CBUILD_OPT CTARGET_OPT   
    if use multilib ; then   
    CTARGET_OPT=$(get_abi_CTARGET)   
    [[ -z ${CTARGET_OPT} ]] && CTARGET_OPT=$(get_abi_CHOST)   
    fi   
      
    setup_target_flags   
      
    if [[ -n ${CTARGET_OPT} && ${CBUILD} == ${CHOST} ]] && !   
   is_crosscompile; then   
    CBUILD_OPT=${CTARGET_OPT}   
    fi   
      
    # Lock glibc at -O2; we want to be conservative here.   
    # -fno-strict-aliasing is to work around #155906.   
    filter-flags '-O?'   
    append-flags -O2 -fno-strict-aliasing   
      
    filter-flags '-fstack-protector*'   
      
    # Starting with gcc-6 (and fully upstreamed pie patches) we control   
    # default enabled/disabled pie via use flags. So nothing to do   
    # here then. #618160   
    if [[ $(gcc-major-version) -lt 6 ]]; then   
    if use hardened && tc-enables-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   
    fi   
   }   
      
   want_tls() {   
    # Archs that can use TLS (Thread Local Storage)   
    case $(tc-arch) in   
    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 -- can't test linking yet   
    tc-has-tls -c ${CTARGET}   
    WANT__THREAD=$?   
      
    return ${WANT__THREAD}   
   }   
      
   use_multiarch() {   
    # Allow user to disable runtime arch detection in multilib.   
    use multiarch || return 1   
    # Make sure binutils is new enough to support indirect functions,   
    # #336792. This funky sed supports gold and bfd linkers.   
    local bver nver   
    bver=$($(tc-getLD ${CTARGET}) -v | sed -n -r '1{s:[^0-9]   
   ::;s:^([0-9.]*).*:\1:;p}')   
    case $(tc-arch ${CTARGET}) in   
    amd64|x86) nver="2.20" ;;   
    arm) nver="2.22" ;;   
    hppa) nver="2.23" ;;   
    ppc|ppc64) nver="2.20" ;;   
    # ifunc support was added in 2.23, but glibc also needs   
    # machinemode which is in 2.24.   
    s390) nver="2.24" ;;   
    sparc) nver="2.21" ;;   
    *) return 1 ;;   
    esac   
    version_is_at_least ${nver} ${bver}   
   }   
      
   # Setup toolchain variables that had historically been defined in the   
   # profiles for these archs.   
   setup_env() {   
    # silly users   
    unset LD_RUN_PATH   
    unset LD_ASSUME_KERNEL   
      
    if is_crosscompile || tc-is-cross-compiler ; then   
    multilib_env ${CTARGET_OPT:-${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}}   
    einfo " $(printf '%15s' 'Manual CFLAGS:') ${CFLAGS}"   
    fi   
      
    setup_flags   
      
    export ABI=${ABI:-${DEFAULT_ABI:-default}}   
      
    if use headers-only ; then   
    # Avoid mixing host's CC and target's CFLAGS_${ABI}:   
    # At this bootstrap stage we have only binutils for   
    # target but not compiler yet.   
    einfo "Skip CC ABI injection. We can't use (cross-)compiler   
   yet."   
    return 0   
    fi   
    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). Keep   
    # around the original clean value to avoid appending multiple ABIs on   
    # top of each other.   
    : ${__GLIBC_CC:=$(tc-getCC ${CTARGET_OPT:-${CTARGET}})}   
    export __GLIBC_CC CC="${__GLIBC_CC} ${!VAR}"   
    einfo " $(printf '%15s' 'Manual CC:') ${CC}"   
   }   
      
   foreach_abi() {   
    setup_env   
      
    local ret=0   
    local abilist=""   
    if use multilib ; then   
    abilist=$(get_install_abis)   
    else   
    abilist=${DEFAULT_ABI}   
    fi   
    local -x ABI   
    for ABI in ${abilist:-default} ; do   
    setup_env   
    einfo "Running $1 for ABI ${ABI}"   
    $1   
    : $(( ret |= $? ))   
    done   
    return ${ret}   
   }   
      
   glibc_banner() {   
    local b="Gentoo ${PVR}"   
    [[ -n ${PATCH_VER} ]] && ! use vanilla && b+=" p${PATCH_VER}"   
    echo "${b}"   
   }   
      
   check_devpts() {   
    # Make sure devpts is mounted correctly for use w/out setuid pt_chown.   
      
    # If merely building the binary package, then there's nothing to   
   verify.   
    [[ ${MERGE_TYPE} == "buildonly" ]] && return   
      
    # Only sanity check when installing the native glibc.   
    [[ ${ROOT} != "/" ]] && return   
      
    # If they're opting in to the old suid code, then no need to check.   
    use suid && return   
      
    if awk '$3 == "devpts" && $4 ~ /[, ]gid=5[, ]/ { exit 1 }'   
   /proc/mounts ; then   
    eerror "In order to use glibc with USE=-suid, you must make   
   sure that"   
    eerror "you have devpts mounted at /dev/pts with the gid=5   
   option."   
    eerror "Openrc should do this for you, so you should check   
   /etc/fstab"   
    eerror "and make sure you do not have any invalid settings   
   there."   
    die "mount & fix your /dev/pts settings"   
    fi   
   }   
      
   # The following Kernel version handling functions are mostly copied from   
   portage   
   # source. It's better not to use linux-info.eclass here since a) it adds too   
   # much magic, see bug 326693 for some of the arguments, and b) some of the   
   # functions are just not provided.   
      
   g_get_running_KV() {   
    uname -r   
    return $?   
   }   
      
   g_KV_major() {   
    [[ -z $1 ]] && return 1   
    local KV=$@   
    echo "${KV%%.*}"   
   }   
      
   g_KV_minor() {   
    [[ -z $1 ]] && return 1   
    local KV=$@   
    KV=${KV#*.}   
    echo "${KV%%.*}"   
   }   
      
   g_KV_micro() {   
    [[ -z $1 ]] && return 1   
    local KV=$@   
    KV=${KV#*.*.}   
    echo "${KV%%[^[:digit:]]*}"   
   }   
      
   g_KV_to_int() {   
    [[ -z $1 ]] && return 1   
    local KV_MAJOR=$(g_KV_major "$1")   
    local KV_MINOR=$(g_KV_minor "$1")   
    local KV_MICRO=$(g_KV_micro "$1")   
    local KV_int=$(( KV_MAJOR * 65536 + KV_MINOR * 256 + KV_MICRO ))   
      
    # We make version 2.2.0 the minimum version we will handle as   
    # a sanity check ... if its less, we fail ...   
    if [[ ${KV_int} -ge 131584 ]] ; then   
    echo "${KV_int}"   
    return 0   
    fi   
    return 1   
   }   
      
   g_int_to_KV() {   
    local version=$1 major minor micro   
    major=$((version / 65536))   
    minor=$(((version % 65536) / 256))   
    micro=$((version % 256))   
    echo ${major}.${minor}.${micro}   
   }   
      
   eend_KV() {   
    [[ $(g_KV_to_int $1) -ge $(g_KV_to_int $2) ]]   
    eend $?   
   }   
      
   get_kheader_version() {   
    printf '#include \nLINUX_VERSION_CODE\n' | \   
    $(tc-getCPP ${CTARGET}) -I "${EPREFIX}/$(alt_build_headers)" - | \   
    tail -n 1   
   }   
      
   # We collect all sanity checks here. Consistency is not guranteed between   
   # pkg_ and src_ phases, so we call this function both in pkg_pretend and in   
   # src_unpack.   
   sanity_prechecks() {   
    # Make sure devpts is mounted correctly for use w/out setuid pt_chown   
    check_devpts   
      
    # Prevent native builds from downgrading   
    if [[ ${MERGE_TYPE} != "buildonly" ]] && \   
    [[ ${ROOT} == "/" ]] && \   
    [[ ${CBUILD} == ${CHOST} ]] && \   
    [[ ${CHOST} == ${CTARGET} ]] ; then   
      
    # The high rev # is to allow people to downgrade between -r#   
    # versions. We want to block 2.20->2.19, but 2.20-r3->2.20-r2   
    # should be fine. Hopefully we never actually use a r# this   
    # high.   
    if has_version ">${CATEGORY}/${P}-r10000" ; then   
    eerror "Sanity check to keep you from breaking your   
   system:"   
    eerror " Downgrading glibc is not supported and a sure   
   way to destruction."   
    die "Aborting to save your system."   
    fi   
      
    if ! do_run_test '#include \n#include    
   sys/syscall.h>\nint main(){return syscall(1000)!=-1;}\n' ; then   
    eerror "Your old kernel is broken. You need to update   
   it to a newer"   
    eerror "version as syscall() will break. See   
   bug 279260."   
    die "Old and broken kernel."   
    fi   
    fi   
      
    # Users have had a chance to phase themselves, time to give em the boot   
    if [[ -e ${EROOT}/etc/locale.gen ]] && [[ -e ${EROOT}/et   
   /locales.build ]] ; then   
    eerror "You still haven't deleted ${EROOT}/etc/locales.build."   
    eerror "Do so now after making sure ${EROOT}/etc/locale.gen is   
   kosher."   
    die "Lazy upgrader detected"   
    fi   
      
    if [[ ${CTARGET} == i386-* ]] ; then   
    eerror "i386 CHOSTs are no longer supported."   
    eerror "Chances are you don't actually want/need i386."   
    eerror "Please read https://www.gentoo.org/doc/e   
   /change-chost.xml"   
    die "Please fix your CHOST"   
    fi   
      
    if [[ -e /proc/xen ]] && [[ $(tc-arch) == "x86" ]] && ! is-flag   
   -mno-tls-direct-seg-refs ; then   
    ewarn "You are using Xen but don't have -mno-tls   
   direct-seg-refs in your CFLAGS."   
    ewarn "This will result in a 50% performance penalty when   
   running with a 32bit"   
    ewarn "hypervisor, which is probably not what you want."   
    fi   
      
    use hardened && ! tc-enables-pie && \   
    ewarn "PIE hardening not applied, as your compiler doesn't   
   default to PIE"   
      
    # Check for sanity of /etc/nsswitch.conf   
    if [[ -e ${EROOT}/etc/nsswitch.conf ]] ; then   
    local entry   
    for entry in passwd group shadow; do   
    if ! egrep -q "^[ \t]*${entry}:.*files"    
   ${EROOT}"/etc/nsswitch.conf; then   
    eerror "Your ${EROOT}/etc/nsswitch.conf is out   
   of date."   
    eerror "Please make sure you have 'files'   
   entries for"   
    eerror "'passwd:', 'group:' and 'shadow:'   
   databases."   
    eerror "For more details see:"   
    eerror " https://wiki.gentoo.or   
   /wiki/Project:Toolchain/nsswitch.conf_in_glibc-2.26"   
    die "nsswitch.conf has no 'files' provider in   
   '${entry}'."   
    fi   
    done   
    fi   
      
    # ABI-specific checks follow here. Hey, we have a lot more specific   
   conditions that   
    # we test for...   
    if ! is_crosscompile ; then   
    if use amd64 && use multilib && [[ ${MERGE_TYPE} != "binary"   
   ]] ; then   
    ebegin "Checking that IA32 emulation is enabled in the   
   running kernel"   
    echo 'int main(){return 0;}' > "${T}/che   
   k-ia32-emulation.c"   
    local STAT   
    if "${CC-${CHOST}-gcc}" ${CFLAGS_x86} "$   
   T}/check-ia32-emulation.c" -o "${T}/check-ia32-emulation.elf32"; then   
    "${T}/check-ia32-emulation.elf32"   
    STAT=$?   
    else   
    # Don't fail here to allow single->multi ABI   
   switch   
    # or recover from breakage like bug #646424   
    ewarn "Failed to compile the ABI test. Broken   
   host glibc?"   
    STAT=0   
    fi   
    rm -f "${T}/check-ia32-emulation.elf32"   
    eend $STAT   
    [[ $STAT -eq 0 ]] || die "CONFIG_IA32_EMULATION must   
   be enabled in the kernel to compile a multilib glibc."   
    fi   
      
    fi   
      
    # When we actually have to compile something...   
    if ! just_headers ; then   
    ebegin "Checking gcc for __thread support"   
    if ! eend $(want__thread ; echo $?) ; then   
    echo   
    eerror "Could not find a gcc that supports the   
   __thread directive!"   
    eerror "Please update your binutils/gcc and try again."   
    die "No __thread support in gcc!"   
    fi   
      
    if [[ ${CTARGET} == *-linux* ]] ; then   
    local run_kv build_kv want_kv   
      
    run_kv=$(g_get_running_KV)   
    build_kv=$(g_int_to_KV $(get_kheader_version))   
    want_kv=${MIN_KERN_VER}   
      
    if ! is_crosscompile && ! tc-is-cross-compiler ; then   
    # Building fails on an non-supporting kernel   
    ebegin "Checking running kernel version   
   (${run_kv} >= ${want_kv})"   
    if ! eend_KV ${run_kv} ${want_kv} ; then   
    echo   
    eerror "You need a kernel of at least   
   ${want_kv}!"   
    die "Kernel version too low!"   
    fi   
    fi   
      
    ebegin "Checking linux-headers version (${build_kv} >=   
   ${want_kv})"   
    if ! eend_KV ${build_kv} ${want_kv} ; then   
    echo   
    eerror "You need linux-headers of at least   
   ${want_kv}!"   
    die "linux-headers version too low!"   
    fi   
    fi   
    fi   
   }   
      
   #   
   # the phases   
   #   
      
   # pkg_pretend   
      
   pkg_pretend() {   
    # All the checks...   
    einfo "Checking general environment sanity."   
    sanity_prechecks   
   }   
      
   # src_unpack   
      
   src_unpack() {   
    # Consistency is not guaranteed between pkg_ and src_ ...   
    sanity_prechecks   
      
    use multilib && unpack gcc-multilib-bootstrap-${GCC_BOOT   
   TRAP_VER}.tar.xz   
      
    setup_env   
      
    if [[ -n ${EGIT_REPO_URI} ]] ; then   
    git-r3_src_unpack   
    else   
    unpack ${P}.tar.xz   
    fi   
      
    cd "${S}" || die   
    touch locale/C-translit.h || die #185476 #218003   
      
    cd "${WORKDIR}" || die   
    unpack glibc-${RELEASE_VER}-patches-${PATCH_VER}.tar.bz2   
   }   
      
   src_prepare() {   
    if ! use vanilla ; then   
    elog "Applying Gentoo Glibc Patchset ${RELEASE_V   
   R}-${PATCH_VER}"   
    eapply "${WORKDIR}"/patches   
    einfo "Done."   
    fi   
      
    default   
      
    gnuconfig_update   
      
    cd "${WORKDIR}"   
    find . -name configure -exec touch {} +   
      
    eprefixify extra/locale/locale-gen   
      
    # Fix permissions on some of the scripts.   
    chmod u+x "${S}"/scripts/*.sh   
      
    cd "${S}"   
   }   
      
   glibc_do_configure() {   
    # Glibc does not work with gold (for various reasons) #269274.   
    tc-ld-disable-gold   
      
    # CXX isnt handled by the multilib system, so if we dont unset here   
    # we accumulate crap across abis   
    unset CXX   
      
    einfo "Configuring glibc for nptl"   
      
    if use doc ; then   
    export MAKEINFO=makeinfo   
    else   
    export MAKEINFO=/dev/null   
    fi   
      
    local v   
    for v in ABI CBUILD CHOST CTARGET CBUILD_OPT CTARGET_OPT CC CXX LD   
   {AS,C,CPP,CXX,LD}FLAGS MAKEINFO ; do   
    einfo " $(printf '%15s' ${v}:) ${!v}"   
    done   
      
    # CFLAGS can contain ABI-specific flags like -mfpu=neon, see bug   
   #657760   
    # To build .S (assembly) files with the same ABI-specific flags   
    # upstream currently recommends adding CFLAGS to CC/CXX:   
    # https://sourceware.org/PR23273   
    # Note: Passing CFLAGS via CPPFLAGS overrides glibc's arch-specific   
   CFLAGS   
    # and breaks multiarch support. See 659030#c3 for an example.   
    # The glibc configure script doesn't properly use LDFLAGS all the time.   
    export CC="$(tc-getCC ${CTARGET}) ${CFLAGS} ${LDFLAGS}"   
    einfo " $(printf '%15s' 'Manual CC:') ${CC}"   
      
    # Some of the tests are written in C++, so we need to force our   
   multlib abis in, bug 623548   
    export CXX="$(tc-getCXX ${CTARGET}) $(get_abi_CFLAGS) ${CFLAGS}"   
    einfo " $(printf '%15s' 'Manual CXX:') ${CXX}"   
      
    echo   
      
    local myconf=()   
      
    case ${CTARGET} in   
    powerpc-*)   
    # Currently gcc on powerpc32 generates invalid code for   
    # __builtin_return_address(0) calls. Normally programs   
    # don't do that but malloc hooks   
|