commit:     81fc154277582961526722e099fb8d38751000fd
Author:     Benda Xu <heroxbd <AT> gentoo <DOT> org>
AuthorDate: Mon May 23 16:14:35 2016 +0000
Commit:     Benda XU <heroxbd <AT> gentoo <DOT> org>
CommitDate: Mon May 23 16:14:35 2016 +0000
URL:        https://gitweb.gentoo.org/dev/heroxbd.git/commit/?id=81fc1542

kernel-2.eclass: track.

Bug: 478436

 eclass/kernel-2.eclass | 1321 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 1321 insertions(+)

diff --git a/eclass/kernel-2.eclass b/eclass/kernel-2.eclass
new file mode 100644
index 0000000..e8cb8f2
--- /dev/null
+++ b/eclass/kernel-2.eclass
@@ -0,0 +1,1321 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/eclass/kernel-2.eclass,v 1.297 2014/11/28 
17:40:20 mpagano Exp $
+
+# Description: kernel.eclass rewrite for a clean base regarding the 2.6
+#              series of kernel with back-compatibility for 2.4
+#
+# Original author: John Mylchreest <jo...@gentoo.org>
+# Maintainer: kernel-m...@gentoo.org
+#
+# Please direct your bugs to the current eclass maintainer :)
+
+# added functionality:
+# unipatch             - a flexible, singular method to extract, add and 
remove patches.
+
+# A Couple of env vars are available to effect usage of this eclass
+# These are as follows:
+#
+# K_USEPV                              - When setting the EXTRAVERSION 
variable, it should
+#                                                add PV to the end.
+#                                                this is useful for thigns 
like wolk. IE:
+#                                                EXTRAVERSION would be 
something like : -wolk-4.19-r1
+# K_NOSETEXTRAVERSION  - if this is set then EXTRAVERSION will not be
+#                                                automatically set within the 
kernel Makefile
+# K_NOUSENAME                  - if this is set then EXTRAVERSION will not 
include the
+#                                                first part of ${PN} in 
EXTRAVERSION
+# K_NOUSEPR                            - if this is set then EXTRAVERSION will 
not include the
+#                                                anything based on ${PR}.
+# K_PREPATCHED                 - if the patchset is prepatched (ie: mm-sources,
+#                                                ck-sources, ac-sources) it 
will use PR (ie: -r5) as
+#                                                the patchset version for
+#                                                and not use it as a true 
package revision
+# K_EXTRAEINFO                 - this is a new-line seperated list of einfo 
displays in
+#                                                postinst and can be used to 
carry additional postinst
+#                                                messages
+# K_EXTRAELOG                  - same as K_EXTRAEINFO except using elog 
instead of einfo
+# K_EXTRAEWARN                 - same as K_EXTRAEINFO except using ewarn 
instead of einfo
+# K_SYMLINK                            - if this is set, then forcably create 
symlink anyway
+#
+# K_DEFCONFIG                  - Allow specifying a different defconfig target.
+#                                                If length zero, defaults to 
"defconfig".
+# K_WANT_GENPATCHES            - Apply genpatches to kernel source. Provide any
+#                                                combination of "base", 
"extras" or "experimental".
+# K_EXP_GENPATCHES_PULL        - If set, we pull "experimental" regardless of 
the USE FLAG
+#                                                but expect the ebuild 
maintainer to use K_EXP_GENPATCHES_LIST.
+# K_EXP_GENPATCHES_NOUSE       - If set, no USE flag will be provided for 
"experimental";
+#                                                as a result the user cannot 
choose to apply those patches.
+# K_EXP_GENPATCHES_LIST        - A list of patches to pick from "experimental" 
to apply when
+#                                                the USE flag is unset and 
K_EXP_GENPATCHES_PULL is set.
+# K_GENPATCHES_VER             - The version of the genpatches tarball(s) to 
apply.
+#                                                A value of "5" would apply 
genpatches-2.6.12-5 to
+#                                                my-sources-2.6.12.ebuild
+# K_SECURITY_UNSUPPORTED- If set, this kernel is unsupported by Gentoo Security
+# K_DEBLOB_AVAILABLE   - A value of "0" will disable all of the optional deblob
+#                                                code. If empty, will be set 
to "1" if deblobbing is
+#                                                possible. Test ONLY for "1".
+# K_PREDEBLOBBED               - This kernel was already deblobbed elsewhere.
+#                                                If false, either optional 
deblobbing will be available
+#                                                or the license will note the 
inclusion of freedist
+#                                                code.
+# K_LONGTERM                   - If set, the eclass will search for the kernel 
source
+#                                                in the long term directories 
on the upstream servers
+#                                                as the location has been 
changed by upstream
+# H_SUPPORTEDARCH              - this should be a space separated list of 
ARCH's which
+#                                                can be supported by the 
headers ebuild
+
+# UNIPATCH_LIST                        - space delimetered list of patches to 
be applied to the
+#                                                kernel
+# UNIPATCH_EXCLUDE             - an addition var to support exlusion based 
completely
+#                                                on "<passedstring>*" and not 
"<passedno#>_*"
+#                                              - this should _NOT_ be used 
from the ebuild as this is
+#                                                reserved for end users 
passing excludes from the cli
+# UNIPATCH_DOCS                        - space delimemeted list of docs to be 
installed to
+#                                                the doc dir
+# UNIPATCH_STRICTORDER - if this is set places patches into directories of
+#                                                order, so they are applied in 
the order passed
+
+# Changing any other variable in this eclass is not supported; you can request
+# for additional variables to be added by contacting the current maintainer.
+# If you do change them, there is a chance that we will not fix resulting bugs;
+# that of course does not mean we're not willing to help.
+
+PYTHON_COMPAT=( python{2_6,2_7} )
+
+inherit eutils toolchain-funcs versionator multilib python-any-r1
+EXPORT_FUNCTIONS pkg_setup src_unpack src_compile src_test src_install 
pkg_preinst pkg_postinst pkg_postrm
+
+# Added by Daniel Ostrow <dost...@gentoo.org>
+# This is an ugly hack to get around an issue with a 32-bit userland on ppc64.
+# I will remove it when I come up with something more reasonable.
+[[ ${PROFILE_ARCH} == "ppc64" ]] && CHOST="powerpc64-${CHOST#*-}"
+
+export CTARGET=${CTARGET:-${CHOST}}
+if [[ ${CTARGET} == ${CHOST} && ${CATEGORY/cross-} != ${CATEGORY} ]]; then
+       export CTARGET=${CATEGORY/cross-}
+fi
+
+HOMEPAGE="http://www.kernel.org/ http://www.gentoo.org/ ${HOMEPAGE}"
+: ${LICENSE:="GPL-2"}
+
+# This is the latest KV_PATCH of the deblob tool available from the
+# libre-sources upstream. If you bump this, you MUST regenerate the Manifests
+# for ALL kernel-2 consumer packages where deblob is available.
+: ${DEBLOB_MAX_VERSION:=38}
+
+# No need to run scanelf/strip on kernel sources/headers (bug #134453).
+RESTRICT="binchecks strip"
+
+# set LINUX_HOSTCFLAGS if not already set
+: ${LINUX_HOSTCFLAGS:="-Wall -Wstrict-prototypes -Os -fomit-frame-pointer 
-I${S}/include"}
+
+# debugging functions
+#==============================================================
+# this function exists only to help debug kernel-2.eclass
+# if you are adding new functionality in, put a call to it
+# at the start of src_unpack, or during SRC_URI/dep generation.
+debug-print-kernel2-variables() {
+       for v in PVR CKV OKV KV KV_FULL KV_MAJOR KV_MINOR KV_PATCH RELEASETYPE \
+                       RELEASE UNIPATCH_LIST_DEFAULT UNIPATCH_LIST_GENPATCHES \
+                       UNIPATCH_LIST S KERNEL_URI K_WANT_GENPATCHES ; do
+               debug-print "${v}: ${!v}"
+       done
+}
+
+#Eclass functions only from here onwards ...
+#==============================================================
+handle_genpatches() {
+       local tarball
+       [[ -z ${K_WANT_GENPATCHES} || -z ${K_GENPATCHES_VER} ]] && return 1
+
+       debug-print "Inside handle_genpatches"
+       local OKV_ARRAY
+       IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
+
+       # for > 3.0 kernels, handle genpatches tarball name
+       # genpatches for 3.0 and 3.0.1 might be named
+       # genpatches-3.0-1.base.tar.xz and genpatches-3.0-2.base.tar.xz
+       # respectively.  Handle this.
+
+       for i in ${K_WANT_GENPATCHES} ; do
+               if [[ ${KV_MAJOR} -ge 3 ]]; then
+                       if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
+                               
tarball="genpatches-${KV_MAJOR}.${KV_MINOR}-${K_GENPATCHES_VER}.${i}.tar.xz"
+                       else
+                               
tarball="genpatches-${KV_MAJOR}.${KV_PATCH}-${K_GENPATCHES_VER}.${i}.tar.xz"
+                       fi
+               else
+                       
tarball="genpatches-${OKV}-${K_GENPATCHES_VER}.${i}.tar.xz"
+               fi
+
+               local use_cond_start="" use_cond_end=""
+
+               if [[ "${i}" == "experimental" && -z ${K_EXP_GENPATCHES_PULL} 
&& -z ${K_EXP_GENPATCHES_NOUSE} ]] ; then
+                       use_cond_start="experimental? ( "
+                       use_cond_end=" )"
+
+                       if use experimental ; then
+                               UNIPATCH_LIST_GENPATCHES+=" 
${DISTDIR}/${tarball}"
+                               debug-print "genpatches tarball: $tarball"
+                       fi
+               else
+                       UNIPATCH_LIST_GENPATCHES+=" ${DISTDIR}/${tarball}"
+                       debug-print "genpatches tarball: $tarball"
+               fi
+
+               GENPATCHES_URI+=" 
${use_cond_start}mirror://gentoo/${tarball}${use_cond_end}"
+       done
+}
+
+detect_version() {
+       # this function will detect and set
+       # - OKV: Original Kernel Version (2.6.0/2.6.0-test11)
+       # - KV: Kernel Version (2.6.0-gentoo/2.6.0-test11-gentoo-r1)
+       # - EXTRAVERSION: The additional version appended to OKV 
(-gentoo/-gentoo-r1)
+
+       # We've already run, so nothing to do here.
+       [[ -n ${KV_FULL} ]] && return 0
+
+       # CKV is used as a comparison kernel version, which is used when
+       # PV doesnt reflect the genuine kernel version.
+       # this gets set to the portage style versioning. ie:
+       #   CKV=2.6.11_rc4
+       CKV=${CKV:-${PV}}
+       OKV=${OKV:-${CKV}}
+       OKV=${OKV/_beta/-test}
+       OKV=${OKV/_rc/-rc}
+       OKV=${OKV/-r*}
+       OKV=${OKV/_p*}
+
+       KV_MAJOR=$(get_version_component_range 1 ${OKV})
+       # handle if OKV is X.Y or X.Y.Z (e.g. 3.0 or 3.0.1)
+       local OKV_ARRAY
+       IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
+
+       # if KV_MAJOR >= 3, then we have no more KV_MINOR
+       #if [[ ${KV_MAJOR} -lt 3 ]]; then
+       if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
+               KV_MINOR=$(get_version_component_range 2 ${OKV})
+               KV_PATCH=$(get_version_component_range 3 ${OKV})
+               if [[ ${KV_MAJOR}${KV_MINOR}${KV_PATCH} -ge 269 ]]; then
+               KV_EXTRA=$(get_version_component_range 4- ${OKV})
+               KV_EXTRA=${KV_EXTRA/[-_]*}
+               else
+                       KV_PATCH=$(get_version_component_range 3- ${OKV})
+               fi
+       else
+               KV_PATCH=$(get_version_component_range 2 ${OKV})
+               KV_EXTRA=$(get_version_component_range 3- ${OKV})
+               KV_EXTRA=${KV_EXTRA/[-_]*}
+       fi
+
+       debug-print "KV_EXTRA is ${KV_EXTRA}"
+
+       KV_PATCH=${KV_PATCH/[-_]*}
+
+       local v n=0 missing
+       #if [[ ${KV_MAJOR} -lt 3 ]]; then
+       if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
+               for v in CKV OKV KV_{MAJOR,MINOR,PATCH} ; do
+                       [[ -z ${!v} ]] && n=1 && missing="${missing}${v} ";
+               done
+       else
+               for v in CKV OKV KV_{MAJOR,PATCH} ; do
+                       [[ -z ${!v} ]] && n=1 && missing="${missing}${v} ";
+               done
+       fi
+
+       [[ $n -eq 1 ]] && \
+               eerror "Missing variables: ${missing}" && \
+               die "Failed to extract kernel version (try explicit CKV in 
ebuild)!"
+       unset v n missing
+
+#      if [[ ${KV_MAJOR} -ge 3 ]]; then
+       if [[ ${#OKV_ARRAY[@]} -lt 3 ]]; then
+               KV_PATCH_ARR=(${KV_PATCH//\./ })
+
+               # at this point 031412, Linus is putting all 3.x kernels in a
+               # 3.x directory, may need to revisit when 4.x is released
+               KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.x"
+
+               [[ -n "${K_LONGTERM}" ]] &&
+                       
KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm/v${KV_MAJOR}.${KV_PATCH_ARR}"
+       else
+               #KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.0"
+               
#KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}"
+               if [[ ${KV_MAJOR} -ge 3 ]]; then
+                       
KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.x"
+               else
+                       
KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}"
+               fi
+
+               [[ -n "${K_LONGTERM}" ]] &&
+                       #KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm"
+                       
KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm/v${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
+       fi
+
+       debug-print "KERNEL_BASE_URI is ${KERNEL_BASE_URI}"
+
+       if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
+               # handle non genpatch using sources correctly
+               if [[ -z ${K_WANT_GENPATCHES} && -z ${K_GENPATCHES_VER} && 
${KV_PATCH} -gt 0 ]]; then
+                       KERNEL_URI="${KERNEL_BASE_URI}/patch-${OKV}.xz"
+                       UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV}.xz"
+               fi
+               KERNEL_URI="${KERNEL_URI} 
${KERNEL_BASE_URI}/linux-${KV_MAJOR}.${KV_MINOR}.tar.xz"
+       else
+               KERNEL_URI="${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
+       fi
+
+       RELEASE=${CKV/${OKV}}
+       RELEASE=${RELEASE/_beta}
+       RELEASE=${RELEASE/_rc/-rc}
+       RELEASE=${RELEASE/_pre/-pre}
+       # We cannot trivally call kernel_is here, because it calls us to detect 
the
+       # version
+       #kernel_is ge 2 6 && RELEASE=${RELEASE/-pre/-git}
+       [ $(($KV_MAJOR * 1000 + ${KV_MINOR:-0})) -ge 2006 ] && 
RELEASE=${RELEASE/-pre/-git}
+       RELEASETYPE=${RELEASE//[0-9]}
+
+       # Now we know that RELEASE is the -rc/-git
+       # and RELEASETYPE is the same but with its numerics stripped
+       # we can work on better sorting EXTRAVERSION.
+       # first of all, we add the release
+       EXTRAVERSION="${RELEASE}"
+       debug-print "0 EXTRAVERSION:${EXTRAVERSION}"
+       [[ -n ${KV_EXTRA} ]] && [[ ${KV_MAJOR} -lt 3 ]] && 
EXTRAVERSION=".${KV_EXTRA}${EXTRAVERSION}"
+
+       debug-print "1 EXTRAVERSION:${EXTRAVERSION}"
+       if [[ -n "${K_NOUSEPR}" ]]; then
+               # Don't add anything based on PR to EXTRAVERSION
+               debug-print "1.0 EXTRAVERSION:${EXTRAVERSION}"
+       elif [[ -n ${K_PREPATCHED} ]]; then
+               debug-print "1.1 EXTRAVERSION:${EXTRAVERSION}"
+               EXTRAVERSION="${EXTRAVERSION}-${PN/-*}${PR/r}"
+       elif [[ "${ETYPE}" = "sources" ]]; then
+               debug-print "1.2 EXTRAVERSION:${EXTRAVERSION}"
+               # For some sources we want to use the PV in the extra version
+               # This is because upstream releases with a completely different
+               # versioning scheme.
+               case ${PN/-*} in
+                    wolk) K_USEPV=1;;
+                 vserver) K_USEPV=1;;
+               esac
+
+               [[ -z "${K_NOUSENAME}" ]] && 
EXTRAVERSION="${EXTRAVERSION}-${PN/-*}"
+               [[ -n "${K_USEPV}" ]]     && 
EXTRAVERSION="${EXTRAVERSION}-${PV//_/-}"
+               [[ -n "${PR//r0}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
+       fi
+       debug-print "2 EXTRAVERSION:${EXTRAVERSION}"
+
+       # The only messing around which should actually effect this is for 
KV_EXTRA
+       # since this has to limit OKV to MAJ.MIN.PAT and strip EXTRA off else
+       # KV_FULL evaluates to MAJ.MIN.PAT.EXT.EXT after EXTRAVERSION
+
+       if [[ -n ${KV_EXTRA} ]]; then
+               if [[ -n ${KV_MINOR} ]]; then
+                       OKV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
+               else
+                       OKV="${KV_MAJOR}.${KV_PATCH}"
+               fi
+               KERNEL_URI="${KERNEL_BASE_URI}/patch-${CKV}.xz
+                                       ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
+               UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV}.xz"
+       fi
+
+       # We need to set this using OKV, but we need to set it before we do any
+       # messing around with OKV based on RELEASETYPE
+       KV_FULL=${OKV}${EXTRAVERSION}
+
+       # we will set this for backwards compatibility.
+       S=${WORKDIR}/linux-${KV_FULL}
+       KV=${KV_FULL}
+
+       # -rc-git pulls can be achieved by specifying CKV
+       # for example:
+       #   CKV="2.6.11_rc3_pre2"
+       # will pull:
+       #   linux-2.6.10.tar.xz & patch-2.6.11-rc3.xz & patch-2.6.11-rc3-git2.xz
+
+       if [[ ${KV_MAJOR}${KV_MINOR} -eq 26 ]]; then
+
+               if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; 
then
+                       OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
+                       
KERNEL_URI="${KERNEL_BASE_URI}/testing/patch-${CKV//_/-}.xz
+                                               
${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
+                       UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.xz"
+               fi
+
+               if [[ ${RELEASETYPE} == -git ]]; then
+                       
KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${OKV}${RELEASE}.xz
+                                               
${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
+                       
UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.xz"
+               fi
+
+               if [[ ${RELEASETYPE} == -rc-git ]]; then
+                       OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
+                       
KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.xz
+                                               
${KERNEL_BASE_URI}/testing/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-git*}.xz
+                                               
${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
+
+                       
UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-git*}.xz
 ${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.xz"
+               fi
+       else
+               if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; 
then
+                       if [[ ${KV_MAJOR}${KV_PATCH} -eq 30 ]]; then
+                               OKV="2.6.39"
+                       else
+                               KV_PATCH_ARR=(${KV_PATCH//\./ })
+                               OKV="${KV_MAJOR}.$((${KV_PATCH_ARR} - 1))"
+                       fi
+                       
KERNEL_URI="${KERNEL_BASE_URI}/testing/patch-${CKV//_/-}.xz
+                                               
${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
+                       UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.xz"
+               fi
+
+               if [[ ${RELEASETYPE} == -git ]]; then
+                       
KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${OKV}${RELEASE}.xz
+                                               
${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
+                       
UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.xz"
+               fi
+
+               if [[ ${RELEASETYPE} == -rc-git ]]; then
+                       if [[ ${KV_MAJOR}${KV_PATCH} -eq 30 ]]; then
+                               OKV="2.6.39"
+                       else
+                               KV_PATCH_ARR=(${KV_PATCH//\./ })
+                               OKV="${KV_MAJOR}.$((${KV_PATCH_ARR} - 1))"
+                       fi
+                       
KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE}.xz
+                                               
${KERNEL_BASE_URI}/testing/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE/-git*}.xz
+                                               
${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
+
+                       
UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE/-git*}.xz
 ${DISTDIR}/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE}.xz"
+               fi
+
+
+       fi
+
+
+       debug-print-kernel2-variables
+
+       handle_genpatches
+}
+
+# Note: duplicated in linux-info.eclass
+kernel_is() {
+       # ALL of these should be set before we can safely continue this 
function.
+       # some of the sources have in the past had only one set.
+       local v n=0
+       for v in OKV KV_{MAJOR,MINOR,PATCH} ; do [[ -z ${!v} ]] && n=1 ; done
+       [[ $n -eq 1 ]] && detect_version
+       unset v n
+
+       # Now we can continue
+       local operator test value
+
+       case ${1#-} in
+         lt) operator="-lt"; shift;;
+         gt) operator="-gt"; shift;;
+         le) operator="-le"; shift;;
+         ge) operator="-ge"; shift;;
+         eq) operator="-eq"; shift;;
+          *) operator="-eq";;
+       esac
+       [[ $# -gt 3 ]] && die "Error in kernel-2_kernel_is(): too many 
parameters"
+
+       : $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH ))
+       : $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + 
${3:-${KV_PATCH}} ))
+       [ ${test} ${operator} ${value} ]
+}
+
+kernel_is_2_4() {
+       kernel_is 2 4
+}
+
+kernel_is_2_6() {
+       kernel_is 2 6 || kernel_is 2 5
+}
+
+# Capture the sources type and set DEPENDs
+if [[ ${ETYPE} == sources ]]; then
+       DEPEND="!build? (
+               sys-apps/sed
+               >=sys-devel/binutils-2.11.90.0.31
+       )"
+       RDEPEND="!build? (
+               >=sys-libs/ncurses-5.2
+               sys-devel/make
+               dev-lang/perl
+               sys-devel/bc
+       )"
+       PDEPEND="!build? ( virtual/dev-manager )"
+
+       SLOT="${PVR}"
+       DESCRIPTION="Sources based on the Linux Kernel."
+       IUSE="symlink build"
+
+       # Bug #266157, deblob for libre support
+       if [[ -z ${K_PREDEBLOBBED} ]] ; then
+               # Bug #359865, force a call to detect_version if needed
+               kernel_is ge 2 6 27 && \
+                       [[ -z "${K_DEBLOB_AVAILABLE}" ]] && \
+                               kernel_is le 2 6 ${DEBLOB_MAX_VERSION} && \
+                                       K_DEBLOB_AVAILABLE=1
+               if [[ ${K_DEBLOB_AVAILABLE} == "1" ]] ; then
+                       IUSE="${IUSE} deblob"
+
+                       # Reflect that kernels contain firmware blobs unless 
otherwise
+                       # stripped
+                       LICENSE="${LICENSE} !deblob? ( freedist )"
+
+                       DEPEND+=" deblob? ( ${PYTHON_DEPS} )"
+
+                       if [[ -n KV_MINOR ]]; then
+                               DEBLOB_PV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
+                       else
+                               DEBLOB_PV="${KV_MAJOR}.${KV_PATCH}"
+                       fi
+
+                       if [[ ${KV_MAJOR} -ge 3 ]]; then
+                               DEBLOB_PV="${KV_MAJOR}.${KV_MINOR}"
+                       fi
+
+                       DEBLOB_A="deblob-${DEBLOB_PV}"
+                       DEBLOB_CHECK_A="deblob-check-${DEBLOB_PV}"
+                       
DEBLOB_HOMEPAGE="http://www.fsfla.org/svnwiki/selibre/linux-libre/";
+                       
DEBLOB_URI_PATH="download/releases/LATEST-${DEBLOB_PV}.N"
+                       if ! has "${EAPI:-0}" 0 1 ; then
+                               
DEBLOB_CHECK_URI="${DEBLOB_HOMEPAGE}/${DEBLOB_URI_PATH}/deblob-check -> 
${DEBLOB_CHECK_A}"
+                       else
+                               
DEBLOB_CHECK_URI="mirror://gentoo/${DEBLOB_CHECK_A}"
+                       fi
+                       
DEBLOB_URI="${DEBLOB_HOMEPAGE}/${DEBLOB_URI_PATH}/${DEBLOB_A}"
+                       HOMEPAGE="${HOMEPAGE} ${DEBLOB_HOMEPAGE}"
+
+                       KERNEL_URI="${KERNEL_URI}
+                               deblob? (
+                                       ${DEBLOB_URI}
+                                       ${DEBLOB_CHECK_URI}
+                               )"
+               else
+                       # We have no way to deblob older kernels, so just mark 
them as
+                       # tainted with non-libre materials.
+                       LICENSE="${LICENSE} freedist"
+               fi
+       fi
+
+elif [[ ${ETYPE} == headers ]]; then
+       DESCRIPTION="Linux system headers"
+
+       # Since we should NOT honour KBUILD_OUTPUT in headers
+       # lets unset it here.
+       unset KBUILD_OUTPUT
+
+       SLOT="0"
+else
+       eerror "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
+       die "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
+fi
+
+# Cross-compile support functions
+#==============================================================
+kernel_header_destdir() {
+       [[ ${CTARGET} == ${CHOST} ]] \
+               && echo "${EPREFIX}"/usr/include \
+               || echo "${EPREFIX}"/usr/${CTARGET}/usr/include
+}
+
+cross_pre_c_headers() {
+       use crosscompile_opts_headers-only && [[ ${CHOST} != ${CTARGET} ]]
+}
+
+env_setup_xmakeopts() {
+       # Kernel ARCH != portage ARCH
+       export KARCH=$(tc-arch-kernel)
+
+       # When cross-compiling, we need to set the ARCH/CROSS_COMPILE
+       # variables properly or bad things happen !
+       xmakeopts="ARCH=${KARCH}"
+       if [[ ${CTARGET} != ${CHOST} ]] && ! cross_pre_c_headers ; then
+               xmakeopts="${xmakeopts} CROSS_COMPILE=${CTARGET}-"
+       elif type -p ${CHOST}-ar > /dev/null ; then
+               xmakeopts="${xmakeopts} CROSS_COMPILE=${CHOST}-"
+       fi
+       export xmakeopts
+}
+
+# Unpack functions
+#==============================================================
+unpack_2_4() {
+       # this file is required for other things to build properly,
+       # so we autogenerate it
+       make -s mrproper ${xmakeopts} || die "make mrproper failed"
+       make -s symlinks ${xmakeopts} || die "make symlinks failed"
+       make -s include/linux/version.h ${xmakeopts} || die "make 
include/linux/version.h failed"
+       echo ">>> version.h compiled successfully."
+}
+
+unpack_2_6() {
+       # this file is required for other things to build properly, so we
+       # autogenerate it ... generate a .config to keep version.h build from
+       # spitting out an annoying warning
+       make -s mrproper ${xmakeopts} 2>/dev/null \
+               || die "make mrproper failed"
+
+       # quick fix for bug #132152 which triggers when it cannot include linux
+       # headers (ie, we have not installed it yet)
+       if ! make -s defconfig ${xmakeopts} &>/dev/null 2>&1 ; then
+               touch .config
+               eerror "make defconfig failed."
+               eerror "assuming you dont have any headers installed yet and 
continuing"
+               epause 5
+       fi
+
+       make -s include/linux/version.h ${xmakeopts} 2>/dev/null \
+               || die "make include/linux/version.h failed"
+       rm -f .config >/dev/null
+}
+
+universal_unpack() {
+       debug-print "Inside universal_unpack"
+
+       local OKV_ARRAY
+       IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
+
+       cd "${WORKDIR}"
+       if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
+               unpack linux-${KV_MAJOR}.${KV_MINOR}.tar.xz
+       else
+               unpack linux-${OKV}.tar.xz
+       fi
+
+       if [[ -d "linux" ]]; then
+               debug-print "Moving linux to linux-${KV_FULL}"
+               mv linux linux-${KV_FULL} \
+                       || die "Unable to move source tree to ${KV_FULL}."
+       elif [[ "${OKV}" != "${KV_FULL}" ]]; then
+               if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]] &&
+                       [[ "${ETYPE}" = "sources" ]]; then
+                       debug-print "moving linux-${KV_MAJOR}.${KV_MINOR} to 
linux-${KV_FULL} "
+                       mv linux-${KV_MAJOR}.${KV_MINOR} linux-${KV_FULL} \
+                               || die "Unable to move source tree to 
${KV_FULL}."
+               else
+                       debug-print "moving linux-${OKV} to linux-${KV_FULL} "
+                       mv linux-${OKV} linux-${KV_FULL} \
+                               || die "Unable to move source tree to 
${KV_FULL}."
+               fi
+       elif [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
+               mv linux-${KV_MAJOR}.${KV_MINOR} linux-${KV_FULL} \
+                       || die "Unable to move source tree to ${KV_FULL}."
+       fi
+       cd "${S}"
+
+       # remove all backup files
+       find . -iname "*~" -exec rm {} \; 2> /dev/null
+
+}
+
+unpack_set_extraversion() {
+       cd "${S}"
+       sed -i -e "s:^\(EXTRAVERSION =\).*:\1 ${EXTRAVERSION}:" Makefile
+       cd "${OLDPWD}"
+}
+
+# Should be done after patches have been applied
+# Otherwise patches that modify the same area of Makefile will fail
+unpack_fix_install_path() {
+       cd "${S}"
+       sed     -i -e 's:#export\tINSTALL_PATH:export\tINSTALL_PATH:' Makefile
+}
+
+# Compile Functions
+#==============================================================
+compile_headers() {
+       env_setup_xmakeopts
+
+       # if we couldnt obtain HOSTCFLAGS from the Makefile,
+       # then set it to something sane
+       local HOSTCFLAGS=$(getfilevar HOSTCFLAGS "${S}"/Makefile)
+       HOSTCFLAGS=${HOSTCFLAGS:--Wall -Wstrict-prototypes -O2 
-fomit-frame-pointer}
+
+       if kernel_is 2 4; then
+               yes "" | make oldconfig ${xmakeopts}
+               echo ">>> make oldconfig complete"
+               make dep ${xmakeopts}
+       elif kernel_is 2 6; then
+               # 2.6.18 introduces headers_install which means we dont need any
+               # of this crap anymore :D
+               kernel_is ge 2 6 18 && return 0
+
+               # autoconf.h isnt generated unless it already exists. plus, we 
have
+               # no guarantee that any headers are installed on the system...
+               [[ -f ${EROOT}/usr/include/linux/autoconf.h ]] \
+                       || touch include/linux/autoconf.h
+
+               # if K_DEFCONFIG isn't set, force to "defconfig"
+               # needed by mips
+               if [[ -z ${K_DEFCONFIG} ]]; then
+                       if [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.16) ]]; 
then
+                               case ${CTARGET} in
+                                       powerpc64*)     
K_DEFCONFIG="ppc64_defconfig";;
+                                       powerpc*)       
K_DEFCONFIG="pmac32_defconfig";;
+                                       *)                      
K_DEFCONFIG="defconfig";;
+                               esac
+                       else
+                               K_DEFCONFIG="defconfig"
+                       fi
+               fi
+
+               # if there arent any installed headers, then there also isnt an 
asm
+               # symlink in /usr/include/, and make defconfig will fail, so we 
have
+               # to force an include path with $S.
+               HOSTCFLAGS="${HOSTCFLAGS} -I${S}/include/"
+               ln -sf asm-${KARCH} "${S}"/include/asm
+               cross_pre_c_headers && return 0
+
+               make ${K_DEFCONFIG} HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || 
die "defconfig failed (${K_DEFCONFIG})"
+               if compile_headers_tweak_config ; then
+                       yes "" | make oldconfig HOSTCFLAGS="${HOSTCFLAGS}" 
${xmakeopts} || die "2nd oldconfig failed"
+               fi
+               make prepare HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die 
"prepare failed"
+               make prepare-all HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die 
"prepare failed"
+       fi
+}
+
+compile_headers_tweak_config() {
+       # some targets can be very very picky, so let's finesse the
+       # .config based upon any info we may have
+       case ${CTARGET} in
+       sh*)
+               sed -i '/CONFIG_CPU_SH/d' .config
+               echo "CONFIG_CPU_SH${CTARGET:2:1}=y" >> .config
+               return 0;;
+       esac
+
+       # no changes, so lets do nothing
+       return 1
+}
+
+# install functions
+#==============================================================
+install_universal() {
+       # Fix silly permissions in tarball
+       cd "${WORKDIR}"
+       chown -R 0:0 * >& /dev/null
+       chmod -R a+r-w+X,u+w *
+       cd ${OLDPWD}
+}
+
+install_headers() {
+       local ddir=$(kernel_header_destdir)
+
+       # 2.6.18 introduces headers_install which means we dont need any
+       # of this crap anymore :D
+       if kernel_is ge 2 6 18 ; then
+               env_setup_xmakeopts
+               emake headers_install INSTALL_HDR_PATH="${D}"/${ddir}/.. 
${xmakeopts} || die
+
+               # let other packages install some of these headers
+               rm -rf "${D}"/${ddir}/scsi  #glibc/uclibc/etc...
+               return 0
+       fi
+
+       # Do not use "linux/*" as that can cause problems with very long
+       # $S values where the cmdline to cp is too long
+       pushd "${S}" >/dev/null
+       dodir ${ddir#${EPREFIX}}/linux
+       cp -pPR "${S}"/include/linux "${D}"/${ddir}/ || die
+       rm -rf "${D}"/${ddir}/linux/modules
+
+       dodir ${ddir#${EPREFIX}}/asm
+       cp -pPR "${S}"/include/asm/* "${ED}"/${ddir}/asm
+
+       if kernel_is 2 6 ; then
+               dodir ${ddir#${EPREFIX}}/asm-generic
+               cp -pPR "${S}"/include/asm-generic/* "${D}"/${ddir}/asm-generic
+       fi
+
+       # clean up
+       find "${D}" -name '*.orig' -exec rm -f {} \;
+
+       popd >/dev/null
+}
+
+install_sources() {
+       local file
+
+       cd "${S}"
+       dodir /usr/src
+       echo ">>> Copying sources ..."
+
+       file="$(find ${WORKDIR} -iname "docs" -type d)"
+       if [[ -n ${file} ]]; then
+               for file in $(find ${file} -type f); do
+                       echo "${file//*docs\/}" >> "${S}"/patches.txt
+                       echo 
"===================================================" >> "${S}"/patches.txt
+                       cat ${file} >> "${S}"/patches.txt
+                       echo 
"===================================================" >> "${S}"/patches.txt
+                       echo "" >> "${S}"/patches.txt
+               done
+       fi
+
+       if [[ ! -f ${S}/patches.txt ]]; then
+               # patches.txt is empty so lets use our ChangeLog
+               [[ -f ${FILESDIR}/../ChangeLog ]] && \
+                       echo "Please check the ebuild ChangeLog for more 
details." \
+                       > "${S}"/patches.txt
+       fi
+
+       mv ${WORKDIR}/linux* "${ED}"/usr/src
+
+       if [[ -n "${UNIPATCH_DOCS}" ]] ; then
+               for i in ${UNIPATCH_DOCS}; do
+                       dodoc "${T}"/${i}
+               done
+       fi
+}
+
+# pkg_preinst functions
+#==============================================================
+preinst_headers() {
+       local ddir=$(kernel_header_destdir)
+       [[ -L ${ddir}/linux ]] && rm ${ddir}/linux
+       [[ -L ${ddir}/asm ]] && rm ${ddir}/asm
+}
+
+# pkg_postinst functions
+#==============================================================
+postinst_sources() {
+       local MAKELINK=0
+
+       # if we have USE=symlink, then force K_SYMLINK=1
+       use symlink && K_SYMLINK=1
+
+       # if we're using a deblobbed kernel, it's not supported
+       [[ $K_DEBLOB_AVAILABLE == 1 ]] && \
+               use deblob && \
+               K_SECURITY_UNSUPPORTED=deblob
+
+       # if we are to forcably symlink, delete it if it already exists first.
+       if [[ ${K_SYMLINK} > 0 ]]; then
+               [[ -h ${EROOT}usr/src/linux ]] && rm ${EROOT}usr/src/linux
+               MAKELINK=1
+       fi
+
+       # if the link doesnt exist, lets create it
+       [[ ! -h ${EROOT}usr/src/linux ]] && MAKELINK=1
+
+       if [[ ${MAKELINK} == 1 ]]; then
+               cd "${EROOT}"usr/src
+               ln -sf linux-${KV_FULL} linux
+               cd ${OLDPWD}
+       fi
+
+       # Don't forget to make directory for sysfs
+       [[ ! -d ${EROOT}sys ]] && kernel_is 2 6 && mkdir ${EROOT}sys
+
+       echo
+       elog "If you are upgrading from a previous kernel, you may be 
interested"
+       elog "in the following document:"
+       elog "  - General upgrade guide: 
http://www.gentoo.org/doc/en/kernel-upgrade.xml";
+       echo
+
+       # if K_EXTRAEINFO is set then lets display it now
+       if [[ -n ${K_EXTRAEINFO} ]]; then
+               echo ${K_EXTRAEINFO} | fmt |
+               while read -s ELINE; do einfo "${ELINE}"; done
+       fi
+
+       # if K_EXTRAELOG is set then lets display it now
+       if [[ -n ${K_EXTRAELOG} ]]; then
+               echo ${K_EXTRAELOG} | fmt |
+               while read -s ELINE; do elog "${ELINE}"; done
+       fi
+
+       # if K_EXTRAEWARN is set then lets display it now
+       if [[ -n ${K_EXTRAEWARN} ]]; then
+               echo ${K_EXTRAEWARN} | fmt |
+               while read -s ELINE; do ewarn "${ELINE}"; done
+       fi
+
+       # optionally display security unsupported message
+       #  Start with why
+       if [[ ${K_SECURITY_UNSUPPORTED} = deblob ]]; then
+               ewarn "Deblobbed kernels may not be up-to-date security-wise"
+               ewarn "as they depend on external scripts."
+       elif [[ -n ${K_SECURITY_UNSUPPORTED} ]]; then
+               ewarn "${PN} is UNSUPPORTED by Gentoo Security."
+       fi
+       #  And now the general message.
+       if [[ -n ${K_SECURITY_UNSUPPORTED} ]]; then
+               ewarn "This means that it is likely to be vulnerable to recent 
security issues."
+               ewarn "For specific information on why this kernel is 
unsupported, please read:"
+               ewarn "http://www.gentoo.org/proj/en/security/kernel.xml";
+       fi
+
+       # warn sparc users that they need to do cross-compiling with >= 
2.6.25(bug #214765)
+       KV_MAJOR=$(get_version_component_range 1 ${OKV})
+       KV_MINOR=$(get_version_component_range 2 ${OKV})
+       KV_PATCH=$(get_version_component_range 3 ${OKV})
+       if [[ "$(tc-arch)" = "sparc" ]]; then
+               if [[ $(gcc-major-version) -lt 4 && $(gcc-minor-version) -lt 4 
]]; then
+                       if [[ ${KV_MAJOR} -ge 3 || 
${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} > 2.6.24 ]] ; then
+                               echo
+                               elog "NOTE: Since 2.6.25 the kernel Makefile 
has changed in a way that"
+                               elog "you now need to do"
+                               elog "  make 
CROSS_COMPILE=sparc64-unknown-linux-gnu-"
+                               elog "instead of just"
+                               elog "  make"
+                               elog "to compile the kernel. For more 
information please browse to"
+                               elog 
"https://bugs.gentoo.org/show_bug.cgi?id=214765";
+                               echo
+                       fi
+               fi
+       fi
+}
+
+# pkg_setup functions
+#==============================================================
+setup_headers() {
+       [[ -z ${H_SUPPORTEDARCH} ]] && H_SUPPORTEDARCH=${PN/-*/}
+       for i in ${H_SUPPORTEDARCH}; do
+               [[ $(tc-arch) == "${i}" ]] && H_ACCEPT_ARCH="yes"
+       done
+
+       if [[ ${H_ACCEPT_ARCH} != "yes" ]]; then
+               echo
+               eerror "This version of ${PN} does not support $(tc-arch)."
+               eerror "Please merge the appropriate sources, in most cases"
+               eerror "(but not all) this will be called $(tc-arch)-headers."
+               die "Package unsupported for $(tc-arch)"
+       fi
+}
+
+# unipatch
+#==============================================================
+unipatch() {
+       local i x y z extention PIPE_CMD UNIPATCH_DROP KPATCH_DIR PATCH_DEPTH 
ELINE
+       local STRICT_COUNT PATCH_LEVEL myLC_ALL myLANG
+
+       # set to a standard locale to ensure sorts are ordered properly.
+       myLC_ALL="${LC_ALL}"
+       myLANG="${LANG}"
+       LC_ALL="C"
+       LANG=""
+
+       [ -z "${KPATCH_DIR}" ] && KPATCH_DIR="${WORKDIR}/patches/"
+       [ ! -d ${KPATCH_DIR} ] && mkdir -p ${KPATCH_DIR}
+
+       # We're gonna need it when doing patches with a predefined patchlevel
+       eshopts_push -s extglob
+
+       # This function will unpack all passed tarballs, add any passed 
patches, and remove any passed patchnumbers
+       # usage can be either via an env var or by params
+       # although due to the nature we pass this within this eclass
+       # it shall be by param only.
+       # -z "${UNIPATCH_LIST}" ] && UNIPATCH_LIST="${@}"
+       UNIPATCH_LIST="${@}"
+
+       #unpack any passed tarballs
+       for i in ${UNIPATCH_LIST}; do
+               if echo ${i} | grep -qs -e "\.tar" -e "\.tbz" -e "\.tgz" ; then
+                       if [ -n "${UNIPATCH_STRICTORDER}" ]; then
+                               unset z
+                               STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
+                               for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
+                                       do z="${z}0";
+                               done
+                               PATCH_ORDER="${z}${STRICT_COUNT}"
+
+                               mkdir -p "${KPATCH_DIR}/${PATCH_ORDER}"
+                               pushd "${KPATCH_DIR}/${PATCH_ORDER}" >/dev/null
+                               unpack ${i##*/}
+                               popd >/dev/null
+                       else
+                               pushd "${KPATCH_DIR}" >/dev/null
+                               unpack ${i##*/}
+                               popd >/dev/null
+                       fi
+
+                       [[ ${i} == *:* ]] && echo ">>> Strict patch levels not 
currently supported for tarballed patchsets"
+               else
+                       extention=${i/*./}
+                       extention=${extention/:*/}
+                       PIPE_CMD=""
+                       case ${extention} in
+                                    xz) PIPE_CMD="xz -dc";;
+                                  lzma) PIPE_CMD="lzma -dc";;
+                                   bz2) PIPE_CMD="bzip2 -dc";;
+                                patch*) PIPE_CMD="cat";;
+                                  diff) PIPE_CMD="cat";;
+                                gz|Z|z) PIPE_CMD="gzip -dc";;
+                               ZIP|zip) PIPE_CMD="unzip -p";;
+                                     *) UNIPATCH_DROP="${UNIPATCH_DROP} 
${i/:*/}";;
+                       esac
+
+                       PATCH_LEVEL=${i/*([^:])?(:)}
+                       i=${i/:*/}
+                       x=${i/*\//}
+                       x=${x/\.${extention}/}
+
+                       if [ -n "${PIPE_CMD}" ]; then
+                               if [ ! -r "${i}" ]; then
+                                       echo
+                                       eerror "FATAL: unable to locate:"
+                                       eerror "${i}"
+                                       eerror "for read-only. The file either 
has incorrect permissions"
+                                       eerror "or does not exist."
+                                       die Unable to locate ${i}
+                               fi
+
+                               if [ -n "${UNIPATCH_STRICTORDER}" ]; then
+                                       unset z
+                                       STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
+                                       for((y=0; y<$((6 - ${#STRICT_COUNT})); 
y++));
+                                               do z="${z}0";
+                                       done
+                                       PATCH_ORDER="${z}${STRICT_COUNT}"
+
+                                       mkdir -p ${KPATCH_DIR}/${PATCH_ORDER}/
+                                       $(${PIPE_CMD} ${i} > 
${KPATCH_DIR}/${PATCH_ORDER}/${x}.patch${PATCH_LEVEL}) || die "uncompressing 
patch failed"
+                               else
+                                       $(${PIPE_CMD} ${i} > 
${KPATCH_DIR}/${x}.patch${PATCH_LEVEL}) || die "uncompressing patch failed"
+                               fi
+                       fi
+               fi
+
+               # If experimental was not chosen by the user, drop experimental 
patches not in K_EXP_GENPATCHES_LIST.
+               if [[ "${i}" == *"genpatches-"*".experimental."* && -n 
${K_EXP_GENPATCHES_PULL} ]] ; then
+                       if [[ -z ${K_EXP_GENPATCHES_NOUSE} ]] && use 
experimental; then
+                               continue
+                       fi
+
+                       local j
+                       for j in ${KPATCH_DIR}/*/50*_*.patch*; do
+                               for k in ${K_EXP_GENPATCHES_LIST} ; do
+                                       [[ "$(basename ${j})" == ${k}* ]] && 
continue 2
+                               done
+                               UNIPATCH_DROP+=" $(basename ${j})"
+                       done
+               fi
+       done
+
+       #populate KPATCH_DIRS so we know where to look to remove the excludes
+       x=${KPATCH_DIR}
+       KPATCH_DIR=""
+       for i in $(find ${x} -type d | sort -n); do
+               KPATCH_DIR="${KPATCH_DIR} ${i}"
+       done
+
+       # do not apply fbcondecor patch to sparc/sparc64 as it breaks boot
+       # bug #272676
+       if [[ "$(tc-arch)" = "sparc" || "$(tc-arch)" = "sparc64" ]]; then
+               if [[ ${KV_MAJOR} -ge 3 || ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} 
> 2.6.28 ]]; then
+                       UNIPATCH_DROP="${UNIPATCH_DROP} 
*_fbcondecor-0.9.6.patch"
+                       echo
+                       ewarn "fbcondecor currently prevents sparc/sparc64 from 
booting"
+                       ewarn "for kernel versions >= 2.6.29. Removing 
fbcondecor patch."
+                       ewarn "See 
https://bugs.gentoo.org/show_bug.cgi?id=272676 for details"
+                       echo
+               fi
+       fi
+
+       #so now lets get rid of the patchno's we want to exclude
+       UNIPATCH_DROP="${UNIPATCH_EXCLUDE} ${UNIPATCH_DROP}"
+       for i in ${UNIPATCH_DROP}; do
+               ebegin "Excluding Patch #${i}"
+               for x in ${KPATCH_DIR}; do rm -f ${x}/${i}* 2>/dev/null; done
+               eend $?
+       done
+
+       # and now, finally, we patch it :)
+       for x in ${KPATCH_DIR}; do
+               for i in $(find ${x} -maxdepth 1 -iname "*.patch*" -or -iname 
"*.diff*" | sort -n); do
+                       STDERR_T="${T}/${i/*\//}"
+                       STDERR_T="${STDERR_T/.patch*/.err}"
+
+                       [ -z ${i/*.patch*/} ] && PATCH_DEPTH=${i/*.patch/}
+                       #[ -z ${i/*.diff*/} ]  && PATCH_DEPTH=${i/*.diff/}
+
+                       if [ -z "${PATCH_DEPTH}" ]; then PATCH_DEPTH=0; fi
+
+                       
####################################################################
+                       # IMPORTANT: This is temporary code to support Linux 
git 3.15_rc1! #
+                       #                                                       
           #
+                       # The patch contains a removal of a symlink, followed 
by addition  #
+                       # of a file with the same name as the symlink in the 
same          #
+                       # location; this causes the dry-run to fail, filed bug 
#507656.    #
+                       #                                                       
           #
+                       # https://bugs.gentoo.org/show_bug.cgi?id=507656        
           #
+                       
####################################################################
+                       if [[ ${PN} == "git-sources" ]] ; then
+                               if [[ ${KV_MAJOR}${KV_PATCH} -ge 315 && 
${RELEASETYPE} == -rc ]] ; then
+                                       ebegin "Applying ${i/*\//} (-p1)"
+                                       if [ $(patch -p1 
--no-backup-if-mismatch -f < ${i} >> ${STDERR_T}) "$?" -eq 0 ]; then
+                                               eend 0
+                                               rm ${STDERR_T}
+                                               break
+                                       else
+                                               eend 1
+                                               eerror "Failed to apply patch 
${i/*\//}"
+                                               eerror "Please attach 
${STDERR_T} to any bug you may post."
+                                               eshopts_pop
+                                               die "Failed to apply ${i/*\//} 
on patch depth 1."
+                                       fi
+                               fi
+                       fi
+                       
####################################################################
+
+                       while [ ${PATCH_DEPTH} -lt 5 ]; do
+                               echo "Attempting Dry-run:" >> ${STDERR_T}
+                               echo "cmd: patch -p${PATCH_DEPTH} 
--no-backup-if-mismatch --dry-run -f < ${i}" >> ${STDERR_T}
+                               echo 
"=======================================================" >> ${STDERR_T}
+                               if [ $(patch -p${PATCH_DEPTH} 
--no-backup-if-mismatch --dry-run -f < ${i} >> ${STDERR_T}) $? -eq 0 ]; then
+                                       ebegin "Applying ${i/*\//} 
(-p${PATCH_DEPTH})"
+                                       echo "Attempting patch:" > ${STDERR_T}
+                                       echo "cmd: patch -p${PATCH_DEPTH} 
--no-backup-if-mismatch -f < ${i}" >> ${STDERR_T}
+                                       echo 
"=======================================================" >> ${STDERR_T}
+                                       if [ $(patch -p${PATCH_DEPTH} 
--no-backup-if-mismatch -f < ${i} >> ${STDERR_T}) "$?" -eq 0 ]; then
+                                               eend 0
+                                               rm ${STDERR_T}
+                                               break
+                                       else
+                                               eend 1
+                                               eerror "Failed to apply patch 
${i/*\//}"
+                                               eerror "Please attach 
${STDERR_T} to any bug you may post."
+                                               eshopts_pop
+                                               die "Failed to apply ${i/*\//} 
on patch depth ${PATCH_DEPTH}."
+                                       fi
+                               else
+                                       PATCH_DEPTH=$((${PATCH_DEPTH} + 1))
+                               fi
+                       done
+                       if [ ${PATCH_DEPTH} -eq 5 ]; then
+                               eerror "Failed to dry-run patch ${i/*\//}"
+                               eerror "Please attach ${STDERR_T} to any bug 
you may post."
+                               eshopts_pop
+                               die "Unable to dry-run patch on any patch depth 
lower than 5."
+                       fi
+               done
+       done
+
+       # When genpatches is used, we want to install 0000_README which 
documents
+       # the patches that were used; such that the user can see them, bug 
#301478.
+       if [[ ! -z ${K_WANT_GENPATCHES} ]] ; then
+               UNIPATCH_DOCS="${UNIPATCH_DOCS} 0000_README"
+       fi
+
+       # When files listed in UNIPATCH_DOCS are found in KPATCH_DIR's, we copy 
it
+       # to the temporary directory and remember them in UNIPATCH_DOCS to 
install
+       # them during the install phase.
+       local tmp
+       for x in ${KPATCH_DIR}; do
+               for i in ${UNIPATCH_DOCS}; do
+                       if [[ -f "${x}/${i}" ]] ; then
+                               tmp="${tmp} ${i}"
+                               cp -f "${x}/${i}" "${T}"/
+                       fi
+               done
+       done
+       UNIPATCH_DOCS="${tmp}"
+
+       # clean up  KPATCH_DIR's - fixes bug #53610
+       for x in ${KPATCH_DIR}; do rm -Rf ${x}; done
+
+       LC_ALL="${myLC_ALL}"
+       LANG="${myLANG}"
+       eshopts_pop
+}
+
+# getfilevar accepts 2 vars as follows:
+# getfilevar <VARIABLE> <CONFIGFILE>
+# pulled from linux-info
+
+getfilevar() {
+       local workingdir basefname basedname xarch=$(tc-arch-kernel)
+
+       if [[ -z ${1} ]] && [[ ! -f ${2} ]]; then
+               echo -e "\n"
+               eerror "getfilevar requires 2 variables, with the second a 
valid file."
+               eerror "   getfilevar <VARIABLE> <CONFIGFILE>"
+       else
+               workingdir=${PWD}
+               basefname=$(basename ${2})
+               basedname=$(dirname ${2})
+               unset ARCH
+
+               cd ${basedname}
+               echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
+                       make ${BUILD_FIXES} -s -f - e 2>/dev/null
+               cd ${workingdir}
+
+               ARCH=${xarch}
+       fi
+}
+
+detect_arch() {
+       # This function sets ARCH_URI and ARCH_PATCH
+       # with the neccessary info for the arch sepecific compatibility
+       # patchsets.
+
+       local ALL_ARCH LOOP_ARCH COMPAT_URI i
+
+       # COMPAT_URI is the contents of ${ARCH}_URI
+       # ARCH_URI is the URI for all the ${ARCH}_URI patches
+       # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
+
+       ARCH_URI=""
+       ARCH_PATCH=""
+       ALL_ARCH="ALPHA AMD64 ARM HPPA IA64 M68K MIPS PPC PPC64 S390 SH SPARC 
X86"
+
+       for LOOP_ARCH in ${ALL_ARCH}; do
+               COMPAT_URI="${LOOP_ARCH}_URI"
+               COMPAT_URI="${!COMPAT_URI}"
+
+               [[ -n ${COMPAT_URI} ]] && \
+                       ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr 
'[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
+
+               if [[ ${LOOP_ARCH} == "$(echo $(tc-arch-kernel) | tr 
'[:lower:]' '[:upper:]')" ]];      then
+                       for i in ${COMPAT_URI}; do
+                               ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
+                       done
+               fi
+       done
+}
+
+headers___fix() {
+       # Voodoo to partially fix broken upstream headers.
+       # note: do not put inline/asm/volatile together (breaks "inline asm 
volatile")
+       sed -i \
+               -e '/^\#define.*_TYPES_H/{:loop n; bloop}' \
+               -e 's:\<\([us]\(8\|16\|32\|64\)\)\>:__\1:g' \
+               -e "s/\([[:space:]]\)inline\([[:space:](]\)/\1__inline__\2/g" \
+               -e "s/\([[:space:]]\)asm\([[:space:](]\)/\1__asm__\2/g" \
+               -e 
"s/\([[:space:]]\)volatile\([[:space:](]\)/\1__volatile__\2/g" \
+               "$@"
+}
+
+# common functions
+#==============================================================
+kernel-2_src_unpack() {
+       universal_unpack
+       debug-print "Doing unipatch"
+
+       [[ -n ${UNIPATCH_LIST} || -n ${UNIPATCH_LIST_DEFAULT} || -n 
${UNIPATCH_LIST_GENPATCHES} ]] && \
+               unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST_GENPATCHES} 
${UNIPATCH_LIST}"
+
+       debug-print "Doing premake"
+
+       # allow ebuilds to massage the source tree after patching but before
+       # we run misc `make` functions below
+       [[ $(type -t kernel-2_hook_premake) == "function" ]] && 
kernel-2_hook_premake
+
+       debug-print "Doing epatch_user"
+       epatch_user
+
+       debug-print "Doing unpack_set_extraversion"
+
+       [[ -z ${K_NOSETEXTRAVERSION} ]] && unpack_set_extraversion
+       unpack_fix_install_path
+
+       # Setup xmakeopts and cd into sourcetree.
+       env_setup_xmakeopts
+       cd "${S}"
+
+       # We dont need a version.h for anything other than headers
+       # at least, I should hope we dont. If this causes problems
+       # take out the if/fi block and inform me please.
+       # unpack_2_6 should now be 2.6.17 safe anyways
+       if [[ ${ETYPE} == headers ]]; then
+               kernel_is 2 4 && unpack_2_4
+               kernel_is 2 6 && unpack_2_6
+       fi
+
+       if [[ $K_DEBLOB_AVAILABLE == 1 ]] && use deblob ; then
+               cp "${DISTDIR}/${DEBLOB_A}" "${T}" || die "cp ${DEBLOB_A} 
failed"
+               cp "${DISTDIR}/${DEBLOB_CHECK_A}" "${T}/deblob-check" || die 
"cp ${DEBLOB_CHECK_A} failed"
+               chmod +x "${T}/${DEBLOB_A}" "${T}/deblob-check" || die "chmod 
deblob scripts failed"
+       fi
+
+       # fix a problem on ppc where TOUT writes to /usr/src/linux breaking 
sandbox
+       # only do this for kernel < 2.6.27 since this file does not exist in 
later
+       # kernels
+       if [[ -n ${KV_MINOR} &&  ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} < 2.6.27 
]] ; then
+               sed -i \
+                       -e 's|TOUT      := .tmp_gas_check|TOUT  := 
$(T).tmp_gas_check|' \
+                       "${S}"/arch/ppc/Makefile
+       else
+               sed -i \
+                       -e 's|TOUT      := .tmp_gas_check|TOUT  := 
$(T).tmp_gas_check|' \
+                       "${S}"/arch/powerpc/Makefile
+       fi
+}
+
+kernel-2_src_compile() {
+       cd "${S}"
+       [[ ${ETYPE} == headers ]] && compile_headers
+
+       if [[ $K_DEBLOB_AVAILABLE == 1 ]] && use deblob ; then
+               echo ">>> Running deblob script ..."
+               python_setup
+               sh "${T}/${DEBLOB_A}" --force || die "Deblob script failed to 
run!!!"
+       fi
+}
+
+# if you leave it to the default src_test, it will run make to
+# find whether test/check targets are present; since "make test"
+# actually produces a few support files, they are installed even
+# though the package is binchecks-restricted.
+#
+# Avoid this altogether by making the function moot.
+kernel-2_src_test() { :; }
+
+kernel-2_pkg_preinst() {
+       [[ ${ETYPE} == headers ]] && preinst_headers
+}
+
+kernel-2_src_install() {
+       install_universal
+       [[ ${ETYPE} == headers ]] && install_headers
+       [[ ${ETYPE} == sources ]] && install_sources
+}
+
+kernel-2_pkg_postinst() {
+       [[ ${ETYPE} == sources ]] && postinst_sources
+}
+
+kernel-2_pkg_setup() {
+       if kernel_is 2 4; then
+               if [[ $(gcc-major-version) -ge 4 ]] ; then
+                       echo
+                       ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't 
supported with linux-2.4!"
+                       ewarn "Either switch to another gcc-version (via 
gcc-config) or use a"
+                       ewarn "newer kernel that supports gcc-4."
+                       echo
+                       ewarn "Also be aware that bugreports about gcc-4 not 
working"
+                       ewarn "with linux-2.4 based ebuilds will be closed as 
INVALID!"
+                       echo
+                       epause 10
+               fi
+       fi
+
+       ABI="${KERNEL_ABI}"
+       [[ ${ETYPE} == headers ]] && setup_headers
+       [[ ${ETYPE} == sources ]] && echo ">>> Preparing to unpack ..."
+}
+
+kernel-2_pkg_postrm() {
+       # This warning only makes sense for kernel sources.
+       [[ ${ETYPE} == headers ]] && return 0
+
+       # If there isn't anything left behind, then don't complain.
+       [[ -e ${EROOT}usr/src/linux-${KV_FULL} ]] || return 0
+       echo
+       ewarn "Note: Even though you have successfully unmerged "
+       ewarn "your kernel package, directories in kernel source location: "
+       ewarn "${EROOT}usr/src/linux-${KV_FULL}"
+       ewarn "with modified files will remain behind. By design, package 
managers"
+       ewarn "will not remove these modified files and the directories they 
reside in."
+       echo
+}

Reply via email to