app-admin/lastpass-cli: serve man from devspace #654846
[gentoo.git] / eclass / kernel-2.eclass
1 # Copyright 1999-2018 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3
4 # @ECLASS: kernel-2.eclass
5 # @MAINTAINER:
6 # Gentoo Kernel project <kernel@gentoo.org>
7 # @AUTHOR:
8 # John Mylchreest <johnm@gentoo.org>
9 # Mike Pagano <mpagano@gentoo.org>
10 # <so many, many others, please add yourself>
11 # @BLURB: Eclass for kernel packages
12 # @DESCRIPTION:
13 # This is the kernel.eclass rewrite for a clean base regarding the 2.6
14 # series of kernel with back-compatibility for 2.4
15 # Please direct your bugs to the current eclass maintainer :)
16 # added functionality:
17 # unipatch              - a flexible, singular method to extract, add and remove patches.
18
19 # @ECLASS-VARIABLE: K_USEPV
20 # @DEFAULT_UNSET
21 # @DESCRIPTION:
22 # When setting the EXTRAVERSION variable, it should
23 # add PV to the end.
24 # this is useful for things like wolk. IE:
25 # EXTRAVERSION would be something like : -wolk-4.19-r1
26
27 # @ECLASS-VARIABLE:  K_NOSETEXTRAVERSION
28 # @DEFAULT_UNSET
29 # @DESCRIPTION:
30 # if this is set then EXTRAVERSION will not be
31 # automatically set within the kernel Makefile
32
33 # @ECLASS-VARIABLE: K_NOUSENAME
34 # @DEFAULT_UNSET
35 # @DESCRIPTION:
36 # if this is set then EXTRAVERSION will not include the
37 # first part of ${PN} in EXTRAVERSION
38
39 # @ECLASS-VARIABLE: K_NOUSEPR
40 # @DEFAULT_UNSET
41 # @DESCRIPTION:
42 # if this is set then EXTRAVERSION will not include the
43 # anything based on ${PR}.
44
45 # @ECLASS-VARIABLE: K_PREPATCHED
46 # @DEFAULT_UNSET
47 # @DESCRIPTION:
48 # if the patchset is prepatched (ie: mm-sources,
49 # ck-sources, ac-sources) it will use PR (ie: -r5) as
50 # the patchset version for
51 # and not use it as a true package revision
52
53 # @ECLASS-VARIABLE:  K_EXTRAEINFO
54 # @DEFAULT_UNSET
55 # @DESCRIPTION:
56 # this is a new-line seperated list of einfo displays in
57 # postinst and can be used to carry additional postinst
58 # messages
59
60 # @ECLASS-VARIABLE:  K_EXTRAELOG
61 # @DEFAULT_UNSET
62 # @DESCRIPTION:
63 # same as K_EXTRAEINFO except using elog instead of einfo
64
65 # @ECLASS-VARIABLE:  K_EXTRAEWARN
66 # @DEFAULT_UNSET
67 # @DESCRIPTION:
68 # same as K_EXTRAEINFO except using ewarn instead of einfo
69
70 # @ECLASS-VARIABLE:  K_SYMLINK
71 # @DEFAULT_UNSET
72 # @DESCRIPTION:
73 # if this is set, then forcably create symlink anyway
74
75 # @ECLASS-VARIABLE:  K_BASE_VER
76 # @DEFAULT_UNSET
77 # @DESCRIPTION:
78 # for git-sources, declare the base version this patch is
79 # based off of.
80
81 # @ECLASS-VARIABLE:  K_DEFCONFIG
82 # @DEFAULT_UNSET
83 # @DESCRIPTION:
84 # Allow specifying a different defconfig target.
85 # If length zero, defaults to "defconfig".
86
87 # @ECLASS-VARIABLE:  K_WANT_GENPATCHES
88 # @DEFAULT_UNSET
89 # @DESCRIPTION:
90 # Apply genpatches to kernel source. Provide any
91 # combination of "base", "extras" or "experimental".
92
93 # @ECLASS-VARIABLE:  K_EXP_GENPATCHES_PULL
94 # @DEFAULT_UNSET
95 # @DESCRIPTION:
96 # If set, we pull "experimental" regardless of the USE FLAG
97 # but expect the ebuild maintainer to use K_EXP_GENPATCHES_LIST.
98
99 # @ECLASS-VARIABLE:  K_EXP_GENPATCHES_NOUSE
100 # @DEFAULT_UNSET
101 # @DESCRIPTION:
102 # If set, no USE flag will be provided for "experimental";
103 # as a result the user cannot choose to apply those patches.
104
105 # @ECLASS-VARIABLE:  K_EXP_GENPATCHES_LIST
106 # @DEFAULT_UNSET
107 # @DESCRIPTION:
108 # A list of patches to pick from "experimental" to apply when
109 # the USE flag is unset and K_EXP_GENPATCHES_PULL is set.
110
111 # @ECLASS-VARIABLE:  K_FROM_GIT
112 # @DEFAULT_UNSET
113 # @DESCRIPTION:
114 # If set, this variable signals that the kernel sources derives
115 # from a git tree and special handling will be applied so that
116 # any patches that are applied will actually apply.
117
118 # @ECLASS-VARIABLE:  K_GENPATCHES_VER
119 # @DEFAULT_UNSET
120 # @DESCRIPTION:
121 # The version of the genpatches tarball(s) to apply.
122 # A value of "5" would apply genpatches-2.6.12-5 to
123 # my-sources-2.6.12.ebuild
124
125 # @ECLASS-VARIABLE:  K_SECURITY_UNSUPPORTED
126 # @DEFAULT_UNSET
127 # @DESCRIPTION:
128 # If set, this kernel is unsupported by Gentoo Security
129 # to the current eclass maintainer :)
130
131 # @ECLASS-VARIABLE:  K_DEBLOB_AVAILABLE
132 # @DEFAULT_UNSET
133 # @DESCRIPTION:
134 # A value of "0" will disable all of the optional deblob
135 # code. If empty, will be set to "1" if deblobbing is
136 # possible. Test ONLY for "1".
137
138 # @ECLASS-VARIABLE:  K_DEBLOB_TAG
139 # @DEFAULT_UNSET
140 # @DESCRIPTION:
141 # This will be the version of deblob script. It's a upstream SVN tag
142 # such asw -gnu or -gnu1.
143
144 # @ECLASS-VARIABLE:  K_PREDEBLOBBED
145 # @DEFAULT_UNSET
146 # @DESCRIPTION:
147 # This kernel was already deblobbed elsewhere.
148 # If false, either optional deblobbing will be available
149 # or the license will note the inclusion of linux-firmware code.
150
151 # @ECLASS-VARIABLE:  K_LONGTERM
152 # @DEFAULT_UNSET
153 # @DESCRIPTION:
154 # If set, the eclass will search for the kernel source
155 # in the long term directories on the upstream servers
156 # as the location has been changed by upstream
157
158 # @ECLASS-VARIABLE:  H_SUPPORTEDARCH
159 # @DEFAULT_UNSET
160 # @DESCRIPTION:
161 # this should be a space separated list of ARCH's which
162 # can be supported by the headers ebuild
163
164 # @ECLASS-VARIABLE:  UNIPATCH_LIST
165 # @DEFAULT_UNSET
166 # @DESCRIPTION:
167 # space delimetered list of patches to be applied to the kernel
168
169 # @ECLASS-VARIABLE:  UNIPATCH_EXCLUDE
170 # @DEFAULT_UNSET
171 # @DESCRIPTION:
172 # An addition var to support exlusion based completely
173 # on "<passedstring>*" and not "<passedno#>_*"
174 # this should _NOT_ be used from the ebuild as this is
175 # reserved for end users passing excludes from the cli
176
177 # @ECLASS-VARIABLE:  UNIPATCH_DOCS
178 # @DEFAULT_UNSET
179 # @DESCRIPTION:
180 # space delimemeted list of docs to be installed to
181 # the doc dir
182
183 # @ECLASS-VARIABLE:  UNIPATCH_STRICTORDER
184 # @DEFAULT_UNSET
185 # @DESCRIPTION:
186 # if this is set places patches into directories of
187 # order, so they are applied in the order passed
188 # Changing any other variable in this eclass is not supported; you can request
189 # for additional variables to be added by contacting the current maintainer.
190 # If you do change them, there is a chance that we will not fix resulting bugs;
191 # that of course does not mean we're not willing to help.
192
193 PYTHON_COMPAT=( python{2_6,2_7} )
194
195 inherit eutils toolchain-funcs versionator multilib python-any-r1
196 case ${EAPI:-0} in
197         0|1)
198                 EXPORT_FUNCTIONS src_{unpack,compile,install,test} \
199                         pkg_{setup,preinst,postinst,postrm} ;;
200         2|3|4|5|6)
201                 EXPORT_FUNCTIONS src_{unpack,prepare,compile,install,test} \
202                         pkg_{setup,preinst,postinst,postrm} ;;
203         *) die "${ECLASS}: EAPI ${EAPI} not supported" ;;
204 esac
205
206 # Added by Daniel Ostrow <dostrow@gentoo.org>
207 # This is an ugly hack to get around an issue with a 32-bit userland on ppc64.
208 # I will remove it when I come up with something more reasonable.
209 [[ ${PROFILE_ARCH} == "ppc64" ]] && CHOST="powerpc64-${CHOST#*-}"
210
211 export CTARGET=${CTARGET:-${CHOST}}
212 if [[ ${CTARGET} == ${CHOST} && ${CATEGORY/cross-} != ${CATEGORY} ]]; then
213         export CTARGET=${CATEGORY/cross-}
214 fi
215
216 HOMEPAGE="https://www.kernel.org/ https://www.gentoo.org/ ${HOMEPAGE}"
217 : ${LICENSE:="GPL-2"}
218
219 has "${EAPI:-0}" 0 1 2 && ED=${D} EPREFIX= EROOT=${ROOT}
220
221 # This is the latest KV_PATCH of the deblob tool available from the
222 # libre-sources upstream. If you bump this, you MUST regenerate the Manifests
223 # for ALL kernel-2 consumer packages where deblob is available.
224 : ${DEBLOB_MAX_VERSION:=38}
225
226 # No need to run scanelf/strip on kernel sources/headers (bug #134453).
227 RESTRICT="binchecks strip"
228
229 # set LINUX_HOSTCFLAGS if not already set
230 : ${LINUX_HOSTCFLAGS:="-Wall -Wstrict-prototypes -Os -fomit-frame-pointer -I${S}/include"}
231
232
233 # @FUNCTION: debug-print-kernel2-variables
234 # @USAGE:
235 # @DESCRIPTION:
236 # this function exists only to help debug kernel-2.eclass
237 # if you are adding new functionality in, put a call to it
238 # at the start of src_unpack, or during SRC_URI/dep generation.
239
240 debug-print-kernel2-variables() {
241         for v in PVR CKV OKV KV KV_FULL KV_MAJOR KV_MINOR KV_PATCH RELEASETYPE \
242                         RELEASE UNIPATCH_LIST_DEFAULT UNIPATCH_LIST_GENPATCHES \
243                         UNIPATCH_LIST S KERNEL_URI K_WANT_GENPATCHES ; do
244                 debug-print "${v}: ${!v}"
245         done
246 }
247
248 # @FUNCTION: handle_genpatches
249 # @USAGE: [--set-unipatch-list]
250 # @DESCRIPTION:
251 # add genpatches to list of patches to apply if wanted
252
253 handle_genpatches() {
254         local tarball want_unipatch_list
255         [[ -z ${K_WANT_GENPATCHES} || -z ${K_GENPATCHES_VER} ]] && return 1
256
257         if [[ -n ${1} ]]; then
258                 # set UNIPATCH_LIST_GENPATCHES only on explicit request
259                 # since that requires 'use' call which can be used only in phase
260                 # functions, while the function is also called in global scope
261                 if [[ ${1} == --set-unipatch-list ]]; then
262                         want_unipatch_list=1
263                 else
264                         die "Usage: ${FUNCNAME} [--set-unipatch-list]"
265                 fi
266         fi
267
268         debug-print "Inside handle_genpatches"
269         local OKV_ARRAY
270         IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
271
272         # for > 3.0 kernels, handle genpatches tarball name
273         # genpatches for 3.0 and 3.0.1 might be named
274         # genpatches-3.0-1.base.tar.xz and genpatches-3.0-2.base.tar.xz
275         # respectively.  Handle this.
276
277         for i in ${K_WANT_GENPATCHES} ; do
278                 if [[ ${KV_MAJOR} -ge 3 ]]; then
279                         if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
280                                 tarball="genpatches-${KV_MAJOR}.${KV_MINOR}-${K_GENPATCHES_VER}.${i}.tar.xz"
281                         else
282                                 tarball="genpatches-${KV_MAJOR}.${KV_PATCH}-${K_GENPATCHES_VER}.${i}.tar.xz"
283                         fi
284                 else
285                         tarball="genpatches-${OKV}-${K_GENPATCHES_VER}.${i}.tar.xz"
286                 fi
287
288                 local use_cond_start="" use_cond_end=""
289
290                 if [[ "${i}" == "experimental" && -z ${K_EXP_GENPATCHES_PULL} && -z ${K_EXP_GENPATCHES_NOUSE} ]] ; then
291                         use_cond_start="experimental? ( "
292                         use_cond_end=" )"
293
294                         if [[ -n ${want_unipatch_list} ]] && use experimental ; then
295                                 UNIPATCH_LIST_GENPATCHES+=" ${DISTDIR}/${tarball}"
296                                 debug-print "genpatches tarball: $tarball"
297                         fi
298                 elif [[ -n ${want_unipatch_list} ]]; then
299                         UNIPATCH_LIST_GENPATCHES+=" ${DISTDIR}/${tarball}"
300                         debug-print "genpatches tarball: $tarball"
301                 fi
302                 GENPATCHES_URI+=" ${use_cond_start}mirror://gentoo/${tarball}${use_cond_end}"
303         done
304 }
305
306 # @FUNCTION: detect_version
307 # @USAGE:
308 # @DESCRIPTION:
309 # this function will detect and set
310 # - OKV: Original Kernel Version (2.6.0/2.6.0-test11)
311 # - KV: Kernel Version (2.6.0-gentoo/2.6.0-test11-gentoo-r1)
312 # - EXTRAVERSION: The additional version appended to OKV (-gentoo/-gentoo-r1)
313 detect_version() {
314
315         # We've already run, so nothing to do here.
316         [[ -n ${KV_FULL} ]] && return 0
317
318         # CKV is used as a comparison kernel version, which is used when
319         # PV doesnt reflect the genuine kernel version.
320         # this gets set to the portage style versioning. ie:
321         #   CKV=2.6.11_rc4
322         CKV=${CKV:-${PV}}
323         OKV=${OKV:-${CKV}}
324         OKV=${OKV/_beta/-test}
325         OKV=${OKV/_rc/-rc}
326         OKV=${OKV/-r*}
327         OKV=${OKV/_p*}
328
329         KV_MAJOR=$(get_version_component_range 1 ${OKV})
330         # handle if OKV is X.Y or X.Y.Z (e.g. 3.0 or 3.0.1)
331         local OKV_ARRAY
332         IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
333
334         # if KV_MAJOR >= 3, then we have no more KV_MINOR
335         #if [[ ${KV_MAJOR} -lt 3 ]]; then
336         if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
337                 KV_MINOR=$(get_version_component_range 2 ${OKV})
338                 KV_PATCH=$(get_version_component_range 3 ${OKV})
339                 if [[ ${KV_MAJOR}${KV_MINOR}${KV_PATCH} -ge 269 ]]; then
340                         KV_EXTRA=$(get_version_component_range 4- ${OKV})
341                         KV_EXTRA=${KV_EXTRA/[-_]*}
342                 else
343                         KV_PATCH=$(get_version_component_range 3- ${OKV})
344                 fi
345         else
346                 KV_PATCH=$(get_version_component_range 2 ${OKV})
347                 KV_EXTRA=$(get_version_component_range 3- ${OKV})
348                 KV_EXTRA=${KV_EXTRA/[-_]*}
349         fi
350
351         debug-print "KV_EXTRA is ${KV_EXTRA}"
352
353         KV_PATCH=${KV_PATCH/[-_]*}
354
355         local v n=0 missing
356         #if [[ ${KV_MAJOR} -lt 3 ]]; then
357         if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
358                 for v in CKV OKV KV_{MAJOR,MINOR,PATCH} ; do
359                         [[ -z ${!v} ]] && n=1 && missing="${missing}${v} ";
360                 done
361         else
362                 for v in CKV OKV KV_{MAJOR,PATCH} ; do
363                         [[ -z ${!v} ]] && n=1 && missing="${missing}${v} ";
364                 done
365         fi
366
367         [[ $n -eq 1 ]] && \
368                 eerror "Missing variables: ${missing}" && \
369                 die "Failed to extract kernel version (try explicit CKV in ebuild)!"
370         unset v n missing
371
372 #       if [[ ${KV_MAJOR} -ge 3 ]]; then
373         if [[ ${#OKV_ARRAY[@]} -lt 3 ]]; then
374                 KV_PATCH_ARR=(${KV_PATCH//\./ })
375
376                 # at this point 031412, Linus is putting all 3.x kernels in a
377                 # 3.x directory, may need to revisit when 4.x is released
378                 KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.x"
379
380                 [[ -n "${K_LONGTERM}" ]] &&
381                         KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm/v${KV_MAJOR}.${KV_PATCH_ARR}"
382         else
383                 #KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.0"
384                 #KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}"
385                 if [[ ${KV_MAJOR} -ge 3 ]]; then
386                         KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.x"
387                 else
388                         KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}"
389                 fi
390
391                 [[ -n "${K_LONGTERM}" ]] &&
392                         #KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm"
393                         KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm/v${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
394         fi
395
396         debug-print "KERNEL_BASE_URI is ${KERNEL_BASE_URI}"
397
398         if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
399                 # handle non genpatch using sources correctly
400                 if [[ -z ${K_WANT_GENPATCHES} && -z ${K_GENPATCHES_VER} && ${KV_PATCH} -gt 0 ]]; then
401                         KERNEL_URI="${KERNEL_BASE_URI}/patch-${OKV}.xz"
402                         UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV}.xz"
403                 fi
404                 KERNEL_URI="${KERNEL_URI} ${KERNEL_BASE_URI}/linux-${KV_MAJOR}.${KV_MINOR}.tar.xz"
405         else
406                 KERNEL_URI="${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
407         fi
408
409         RELEASE=${CKV/${OKV}}
410         RELEASE=${RELEASE/_beta}
411         RELEASE=${RELEASE/_rc/-rc}
412         RELEASE=${RELEASE/_pre/-pre}
413         # We cannot trivally call kernel_is here, because it calls us to detect the
414         # version
415         #kernel_is ge 2 6 && RELEASE=${RELEASE/-pre/-git}
416         [ $(($KV_MAJOR * 1000 + ${KV_MINOR:-0})) -ge 2006 ] && RELEASE=${RELEASE/-pre/-git}
417         RELEASETYPE=${RELEASE//[0-9]}
418
419         # Now we know that RELEASE is the -rc/-git
420         # and RELEASETYPE is the same but with its numerics stripped
421         # we can work on better sorting EXTRAVERSION.
422         # first of all, we add the release
423         EXTRAVERSION="${RELEASE}"
424         debug-print "0 EXTRAVERSION:${EXTRAVERSION}"
425         [[ -n ${KV_EXTRA} ]] && [[ ${KV_MAJOR} -lt 3 ]] && EXTRAVERSION=".${KV_EXTRA}${EXTRAVERSION}"
426
427         debug-print "1 EXTRAVERSION:${EXTRAVERSION}"
428         if [[ -n "${K_NOUSEPR}" ]]; then
429                 # Don't add anything based on PR to EXTRAVERSION
430                 debug-print "1.0 EXTRAVERSION:${EXTRAVERSION}"
431         elif [[ -n ${K_PREPATCHED} ]]; then
432                 debug-print "1.1 EXTRAVERSION:${EXTRAVERSION}"
433                 EXTRAVERSION="${EXTRAVERSION}-${PN/-*}${PR/r}"
434         elif [[ "${ETYPE}" = "sources" ]]; then
435                 debug-print "1.2 EXTRAVERSION:${EXTRAVERSION}"
436                 # For some sources we want to use the PV in the extra version
437                 # This is because upstream releases with a completely different
438                 # versioning scheme.
439                 case ${PN/-*} in
440                      wolk) K_USEPV=1;;
441                   vserver) K_USEPV=1;;
442                 esac
443
444                 [[ -z "${K_NOUSENAME}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PN/-*}"
445                 [[ -n "${K_USEPV}" ]]     && EXTRAVERSION="${EXTRAVERSION}-${PV//_/-}"
446                 [[ -n "${PR//r0}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
447         fi
448         debug-print "2 EXTRAVERSION:${EXTRAVERSION}"
449
450         # The only messing around which should actually effect this is for KV_EXTRA
451         # since this has to limit OKV to MAJ.MIN.PAT and strip EXTRA off else
452         # KV_FULL evaluates to MAJ.MIN.PAT.EXT.EXT after EXTRAVERSION
453
454         if [[ -n ${KV_EXTRA} ]]; then
455                 if [[ -n ${KV_MINOR} ]]; then
456                         OKV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
457                 else
458                         OKV="${KV_MAJOR}.${KV_PATCH}"
459                 fi
460                 KERNEL_URI="${KERNEL_BASE_URI}/patch-${CKV}.xz
461                                         ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
462                 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV}.xz"
463         fi
464
465         # We need to set this using OKV, but we need to set it before we do any
466         # messing around with OKV based on RELEASETYPE
467         KV_FULL=${OKV}${EXTRAVERSION}
468
469         # we will set this for backwards compatibility.
470         S="${WORKDIR}"/linux-${KV_FULL}
471         KV=${KV_FULL}
472
473         # -rc-git pulls can be achieved by specifying CKV
474         # for example:
475         #   CKV="2.6.11_rc3_pre2"
476         # will pull:
477         #   linux-2.6.10.tar.xz & patch-2.6.11-rc3.xz & patch-2.6.11-rc3-git2.xz
478
479         if [[ ${KV_MAJOR}${KV_MINOR} -eq 26 ]]; then
480
481                 if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; then
482                         OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
483                         KERNEL_URI="${KERNEL_BASE_URI}/testing/patch-${CKV//_/-}.xz
484                                                 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
485                         UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.xz"
486                 fi
487
488                 if [[ ${RELEASETYPE} == -git ]]; then
489                         KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${OKV}${RELEASE}.xz
490                                                 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
491                         UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.xz"
492                 fi
493
494                 if [[ ${RELEASETYPE} == -rc-git ]]; then
495                         OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
496                         KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.xz
497                                                 ${KERNEL_BASE_URI}/testing/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-git*}.xz
498                                                 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
499
500                         UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-git*}.xz ${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.xz"
501                 fi
502         else
503                 KV_PATCH_ARR=(${KV_PATCH//\./ })
504
505                 # the different majorminor versions have different patch start versions
506                 OKV_DICT=(["2"]="${KV_MAJOR}.$((${KV_PATCH_ARR} - 1))" ["3"]="2.6.39" ["4"]="3.19")
507
508                 if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; then
509
510                         OKV=${K_BASE_VER:-$OKV_DICT["${KV_MAJOR}"]}
511
512                         # as of 12/5/2017, the rc patch is no longer offered as a compressed
513                         # file, and no longer is it mirrored on kernel.org
514                         if [[ ${KV_MAJOR} -ge 4 ]] && [[ ${KV_PATCH} -ge 12 ]]; then
515                                 KERNEL_URI="https://git.kernel.org/torvalds/p/v${KV_FULL}/v${OKV} -> patch-${KV_FULL}.patch
516                                                         ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
517                                 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.patch"
518                         else
519                                 KERNEL_URI="${KERNEL_BASE_URI}/testing/patch-${CKV//_/-}.xz
520                                                         ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
521                                 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.xz"
522                         fi
523                 fi
524
525                 if [[ ${RELEASETYPE} == -git ]]; then
526                         KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${OKV}${RELEASE}.xz
527                                                 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
528                         UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.xz"
529                 fi
530
531                 if [[ ${RELEASETYPE} == -rc-git ]]; then
532                         OKV=${K_BASE_VER:-$OKV_DICT["${KV_MAJOR}"]}
533                         KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE}.xz
534                                                 ${KERNEL_BASE_URI}/testing/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE/-git*}.xz
535                                                 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
536
537                         UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE/-git*}.xz ${DISTDIR}/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE}.xz"
538                 fi
539
540
541         fi
542
543         debug-print-kernel2-variables
544
545         handle_genpatches
546 }
547
548 # @FUNCTION: kernel_is
549 # @USAGE: <conditional version | version>
550 # @DESCRIPTION:
551 # user for comparing kernel versions
552 # or just identifying a version
553 # e.g kernel_is 2 4
554 # e.g kernel_is ge 4.8.11
555 # Note: duplicated in linux-info.eclass
556 kernel_is() {
557         # ALL of these should be set before we can safely continue this function.
558         # some of the sources have in the past had only one set.
559         local v n=0
560         for v in OKV KV_{MAJOR,MINOR,PATCH} ; do [[ -z ${!v} ]] && n=1 ; done
561         [[ $n -eq 1 ]] && detect_version
562         unset v n
563
564         # Now we can continue
565         local operator test value
566
567         case ${1#-} in
568           lt) operator="-lt"; shift;;
569           gt) operator="-gt"; shift;;
570           le) operator="-le"; shift;;
571           ge) operator="-ge"; shift;;
572           eq) operator="-eq"; shift;;
573            *) operator="-eq";;
574         esac
575         [[ $# -gt 3 ]] && die "Error in kernel-2_kernel_is(): too many parameters"
576
577         : $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH ))
578         : $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + ${3:-${KV_PATCH}} ))
579         [ ${test} ${operator} ${value} ]
580 }
581
582 # @FUNCTION: kernel_is_2_4
583 # @USAGE:
584 # @DESCRIPTION:
585 # return true if kernel is version 2.4
586 kernel_is_2_4() {
587         kernel_is 2 4
588 }
589
590 # @FUNCTION: kernel_is_2_6
591 # @USAGE:
592 # @DESCRIPTION:
593 # return true if kernel is version 2.6
594 kernel_is_2_6() {
595         kernel_is 2 6 || kernel_is 2 5
596 }
597
598 # Capture the sources type and set DEPENDs
599 if [[ ${ETYPE} == sources ]]; then
600         DEPEND="!build? (
601                 sys-apps/sed
602                 >=sys-devel/binutils-2.11.90.0.31
603         )"
604         RDEPEND="!build? (
605                 >=sys-libs/ncurses-5.2
606                 sys-devel/make
607                 dev-lang/perl
608                 sys-devel/bc
609                 virtual/libelf
610         )"
611
612         SLOT="${PVR}"
613         DESCRIPTION="Sources based on the Linux Kernel."
614         IUSE="symlink build"
615
616         # Bug #266157, deblob for libre support
617         if [[ -z ${K_PREDEBLOBBED} ]] ; then
618                 # Bug #359865, force a call to detect_version if needed
619                 kernel_is ge 2 6 27 && \
620                         [[ -z "${K_DEBLOB_AVAILABLE}" ]] && \
621                                 kernel_is le 2 6 ${DEBLOB_MAX_VERSION} && \
622                                         K_DEBLOB_AVAILABLE=1
623                 if [[ ${K_DEBLOB_AVAILABLE} == "1" ]] ; then
624                         IUSE="${IUSE} deblob"
625
626                         # Reflect that kernels contain firmware blobs unless otherwise
627                         # stripped
628                         LICENSE="${LICENSE} !deblob? ( linux-firmware )"
629
630                         DEPEND+=" deblob? ( ${PYTHON_DEPS} )"
631
632                         if [[ -n KV_MINOR ]]; then
633                                 DEBLOB_PV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
634                         else
635                                 DEBLOB_PV="${KV_MAJOR}.${KV_PATCH}"
636                         fi
637
638                         if [[ ${KV_MAJOR} -ge 3 ]]; then
639                                 DEBLOB_PV="${KV_MAJOR}.${KV_MINOR}"
640                         fi
641
642                         # deblob svn tag, default is -gnu, to change, use K_DEBLOB_TAG in ebuild
643                         K_DEBLOB_TAG=${K_DEBLOB_TAG:--gnu}
644                         DEBLOB_A="deblob-${DEBLOB_PV}"
645                         DEBLOB_CHECK_A="deblob-check-${DEBLOB_PV}"
646                         DEBLOB_HOMEPAGE="http://www.fsfla.org/svn/fsfla/software/linux-libre/releases/tags"
647                         DEBLOB_URI_PATH="${DEBLOB_PV}${K_DEBLOB_TAG}"
648                         if ! has "${EAPI:-0}" 0 1 ; then
649                                 DEBLOB_CHECK_URI="${DEBLOB_HOMEPAGE}/${DEBLOB_URI_PATH}/deblob-check -> ${DEBLOB_CHECK_A}"
650                         else
651                                 DEBLOB_CHECK_URI="mirror://gentoo/${DEBLOB_CHECK_A}"
652                         fi
653
654                         DEBLOB_URI="${DEBLOB_HOMEPAGE}/${DEBLOB_URI_PATH}/${DEBLOB_A}"
655                         HOMEPAGE="${HOMEPAGE} ${DEBLOB_HOMEPAGE}"
656
657                         KERNEL_URI="${KERNEL_URI}
658                                 deblob? (
659                                         ${DEBLOB_URI}
660                                         ${DEBLOB_CHECK_URI}
661                                 )"
662                 else
663                         # We have no way to deblob older kernels, so just mark them as
664                         # tainted with non-libre materials.
665                         LICENSE="${LICENSE} linux-firmware"
666                 fi
667         fi
668
669 elif [[ ${ETYPE} == headers ]]; then
670         DESCRIPTION="Linux system headers"
671         IUSE="headers-only"
672
673         # Since we should NOT honour KBUILD_OUTPUT in headers
674         # lets unset it here.
675         unset KBUILD_OUTPUT
676
677         SLOT="0"
678 fi
679
680 # Cross-compile support functions
681
682 # @FUNCTION: kernel_header_destdir
683 # @USAGE:
684 # @DESCRIPTION:
685 # return header destination directory
686 kernel_header_destdir() {
687         [[ ${CTARGET} == ${CHOST} ]] \
688                 && echo /usr/include \
689                 || echo /usr/${CTARGET}/usr/include
690 }
691
692 # @FUNCTION: cross_pre_c_headers
693 # @USAGE:
694 # @DESCRIPTION:
695 # set use if necessary for cross compile support
696 cross_pre_c_headers() {
697         use headers-only && [[ ${CHOST} != ${CTARGET} ]]
698 }
699
700 # @FUNCTION: env_setup_xmakeopts
701 # @USAGE:
702 # @DESCRIPTION:
703 # set the ARCH/CROSS_COMPILE when cross compiling
704
705 env_setup_xmakeopts() {
706         # Kernel ARCH != portage ARCH
707         export KARCH=$(tc-arch-kernel)
708
709         # When cross-compiling, we need to set the ARCH/CROSS_COMPILE
710         # variables properly or bad things happen !
711         xmakeopts="ARCH=${KARCH}"
712         if [[ ${CTARGET} != ${CHOST} ]] && ! cross_pre_c_headers ; then
713                 xmakeopts="${xmakeopts} CROSS_COMPILE=${CTARGET}-"
714         elif type -p ${CHOST}-ar > /dev/null ; then
715                 xmakeopts="${xmakeopts} CROSS_COMPILE=${CHOST}-"
716         fi
717         export xmakeopts
718 }
719
720 # @FUNCTION: unpack_2_4
721 # @USAGE:
722 # @DESCRIPTION:
723 # unpack and generate .config for 2.4 kernels
724
725 unpack_2_4() {
726         # this file is required for other things to build properly,
727         # so we autogenerate it
728         make -s mrproper ${xmakeopts} || die "make mrproper failed"
729         make -s symlinks ${xmakeopts} || die "make symlinks failed"
730         make -s include/linux/version.h ${xmakeopts} || die "make include/linux/version.h failed"
731         echo ">>> version.h compiled successfully."
732 }
733
734 # @FUNCTION: unpack_2_6
735 # @USAGE:
736 # @DESCRIPTION:
737 # unpack and generate .config for 2.6 kernels
738
739 unpack_2_6() {
740         # this file is required for other things to build properly, so we
741         # autogenerate it ... generate a .config to keep version.h build from
742         # spitting out an annoying warning
743         make -s mrproper ${xmakeopts} 2>/dev/null \
744                 || die "make mrproper failed"
745
746         # quick fix for bug #132152 which triggers when it cannot include linux
747         # headers (ie, we have not installed it yet)
748         if ! make -s defconfig ${xmakeopts} &>/dev/null 2>&1 ; then
749                 touch .config
750                 eerror "make defconfig failed."
751                 eerror "assuming you dont have any headers installed yet and continuing"
752                 epause 5
753         fi
754
755         make -s include/linux/version.h ${xmakeopts} 2>/dev/null \
756                 || die "make include/linux/version.h failed"
757         rm -f .config >/dev/null
758 }
759
760 # @FUNCTION: universal_unpack
761 # @USAGE:
762 # @DESCRIPTION:
763 # unpack kernel sources
764
765 universal_unpack() {
766         debug-print "Inside universal_unpack"
767
768         local OKV_ARRAY
769         IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
770
771         cd "${WORKDIR}"
772         if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
773                 unpack linux-${KV_MAJOR}.${KV_MINOR}.tar.xz
774         else
775                 unpack linux-${OKV}.tar.xz
776         fi
777
778         if [[ -d "linux" ]]; then
779                 debug-print "Moving linux to linux-${KV_FULL}"
780                 mv linux linux-${KV_FULL} \
781                         || die "Unable to move source tree to ${KV_FULL}."
782         elif [[ "${OKV}" != "${KV_FULL}" ]]; then
783                 if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]] &&
784                         [[ "${ETYPE}" = "sources" ]]; then
785                         debug-print "moving linux-${KV_MAJOR}.${KV_MINOR} to linux-${KV_FULL} "
786                         mv linux-${KV_MAJOR}.${KV_MINOR} linux-${KV_FULL} \
787                                 || die "Unable to move source tree to ${KV_FULL}."
788                 else
789                         debug-print "moving linux-${OKV} to linux-${KV_FULL} "
790                         mv linux-${OKV} linux-${KV_FULL} \
791                                 || die "Unable to move source tree to ${KV_FULL}."
792                 fi
793         elif [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
794                 mv linux-${KV_MAJOR}.${KV_MINOR} linux-${KV_FULL} \
795                         || die "Unable to move source tree to ${KV_FULL}."
796         fi
797         cd "${S}"
798
799         # remove all backup files
800         find . -iname "*~" -exec rm {} \; 2> /dev/null
801
802 }
803
804 # @FUNCTION: unpack_set_extraversion
805 # @USAGE:
806 # @DESCRIPTION:
807 # handle EXTRAVERSION
808
809 unpack_set_extraversion() {
810         cd "${S}"
811         sed -i -e "s:^\(EXTRAVERSION =\).*:\1 ${EXTRAVERSION}:" Makefile
812         cd "${OLDPWD}"
813 }
814
815 # @FUNCTION: unpack_fix_install_path
816 # @USAGE:
817 # @DESCRIPTION:
818 # Should be done after patches have been applied
819 # Otherwise patches that modify the same area of Makefile will fail
820
821 unpack_fix_install_path() {
822         cd "${S}"
823         sed     -i -e 's:#export\tINSTALL_PATH:export\tINSTALL_PATH:' Makefile
824 }
825
826 # Compile Functions
827
828 # @FUNCTION: compile_headers
829 # @USAGE:
830 # @DESCRIPTION:
831 # header compilation
832
833 compile_headers() {
834         env_setup_xmakeopts
835
836         # if we couldnt obtain HOSTCFLAGS from the Makefile,
837         # then set it to something sane
838         local HOSTCFLAGS=$(getfilevar HOSTCFLAGS "${S}"/Makefile)
839         HOSTCFLAGS=${HOSTCFLAGS:--Wall -Wstrict-prototypes -O2 -fomit-frame-pointer}
840
841         if kernel_is 2 4; then
842                 yes "" | make oldconfig ${xmakeopts}
843                 echo ">>> make oldconfig complete"
844                 make dep ${xmakeopts}
845         elif kernel_is 2 6; then
846                 # 2.6.18 introduces headers_install which means we dont need any
847                 # of this crap anymore :D
848                 kernel_is ge 2 6 18 && return 0
849
850                 # autoconf.h isnt generated unless it already exists. plus, we have
851                 # no guarantee that any headers are installed on the system...
852                 [[ -f ${EROOT}usr/include/linux/autoconf.h ]] \
853                         || touch include/linux/autoconf.h
854
855                 # if K_DEFCONFIG isn't set, force to "defconfig"
856                 # needed by mips
857                 if [[ -z ${K_DEFCONFIG} ]]; then
858                         if kernel_is ge 2 6 16 ; then
859                                 case ${CTARGET} in
860                                         powerpc64*)     K_DEFCONFIG="ppc64_defconfig";;
861                                         powerpc*)       K_DEFCONFIG="pmac32_defconfig";;
862                                         *)                      K_DEFCONFIG="defconfig";;
863                                 esac
864                         else
865                                 K_DEFCONFIG="defconfig"
866                         fi
867                 fi
868
869                 # if there arent any installed headers, then there also isnt an asm
870                 # symlink in /usr/include/, and make defconfig will fail, so we have
871                 # to force an include path with $S.
872                 HOSTCFLAGS="${HOSTCFLAGS} -I${S}/include/"
873                 ln -sf asm-${KARCH} "${S}"/include/asm || die
874                 cross_pre_c_headers && return 0
875
876                 make ${K_DEFCONFIG} HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "defconfig failed (${K_DEFCONFIG})"
877                 if compile_headers_tweak_config ; then
878                         yes "" | make oldconfig HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "2nd oldconfig failed"
879                 fi
880                 make prepare HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
881                 make prepare-all HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
882         fi
883 }
884
885 # @FUNCTION: compile_headers_tweak_config
886 # @USAGE:
887 # @DESCRIPTION:
888 # some targets can be very very picky, so let's finesse the
889 # .config based upon any info we may have
890
891 compile_headers_tweak_config() {
892         case ${CTARGET} in
893         sh*)
894                 sed -i '/CONFIG_CPU_SH/d' .config || die
895                 echo "CONFIG_CPU_SH${CTARGET:2:1}=y" >> .config
896                 return 0;;
897         esac
898
899         # no changes, so lets do nothing
900         return 1
901 }
902
903 # install functions
904
905 # @FUNCTION: install_universal
906 # @USAGE:
907 # @DESCRIPTION:
908 # Fix permissions in tarball
909
910 install_universal() {
911         cd "${WORKDIR}"
912         chown -R 0:0 * >& /dev/null
913         chmod -R a+r-w+X,u+w *
914         cd ${OLDPWD}
915 }
916
917 # @FUNCTION: install_headers
918 # @USAGE:
919 # @DESCRIPTION:
920 # Install headers
921
922 install_headers() {
923         local ddir=$(kernel_header_destdir)
924
925         # 2.6.18 introduces headers_install which means we dont need any
926         # of this crap anymore :D
927         if kernel_is ge 2 6 18 ; then
928                 env_setup_xmakeopts
929                 emake headers_install INSTALL_HDR_PATH="${ED}"${ddir}/.. ${xmakeopts} || die
930
931                 # let other packages install some of these headers
932                 rm -rf "${ED}"${ddir}/scsi || die #glibc/uclibc/etc...
933                 return 0
934         fi
935
936         # Do not use "linux/*" as that can cause problems with very long
937         # $S values where the cmdline to cp is too long
938         pushd "${S}" >/dev/null
939         dodir ${ddir}/linux
940         cp -pPR "${S}"/include/linux "${ED}"${ddir}/ || die
941         rm -rf "${ED}"${ddir}/linux/modules || die
942
943         dodir ${ddir}/asm
944         cp -pPR "${S}"/include/asm/* "${ED}"${ddir}/asm || die
945
946         if kernel_is 2 6 ; then
947                 dodir ${ddir}/asm-generic
948                 cp -pPR "${S}"/include/asm-generic/* "${ED}"${ddir}/asm-generic || die
949         fi
950
951         # clean up
952         find "${D}" -name '*.orig' -exec rm -f {} \;
953
954         popd >/dev/null
955 }
956
957 # @FUNCTION: install_sources
958 # @USAGE:
959 # @DESCRIPTION:
960 # Install sources
961
962 install_sources() {
963         local file
964
965         cd "${S}"
966         dodir /usr/src
967         echo ">>> Copying sources ..."
968
969         file="$(find ${WORKDIR} -iname "docs" -type d)"
970         if [[ -n ${file} ]]; then
971                 for file in $(find ${file} -type f); do
972                         echo "${file//*docs\/}" >> "${S}"/patches.txt
973                         echo "===================================================" >> "${S}"/patches.txt
974                         cat ${file} >> "${S}"/patches.txt
975                         echo "===================================================" >> "${S}"/patches.txt
976                         echo "" >> "${S}"/patches.txt
977                 done
978         fi
979
980         mv "${WORKDIR}"/linux* "${ED}"usr/src || die
981
982         if [[ -n "${UNIPATCH_DOCS}" ]] ; then
983                 for i in ${UNIPATCH_DOCS}; do
984                         dodoc "${T}"/${i}
985                 done
986         fi
987 }
988
989 # @FUNCTION: preinst_headers
990 # @USAGE:
991 # @DESCRIPTION:
992 # Headers preinst steps
993
994 preinst_headers() {
995         local ddir=$(kernel_header_destdir)
996         [[ -L ${EPREFIX}${ddir}/linux ]] && { rm "${EPREFIX}"${ddir}/linux || die; }
997         [[ -L ${EPREFIX}${ddir}/asm ]] && { rm "${EPREFIX}"${ddir}/asm || die; }
998 }
999
1000 # @FUNCTION: postinst_sources
1001 # @USAGE:
1002 # @DESCRIPTION:
1003 # Sources post installation function.
1004 # see inline comments
1005
1006 postinst_sources() {
1007         local MAKELINK=0
1008
1009         # if we have USE=symlink, then force K_SYMLINK=1
1010         use symlink && K_SYMLINK=1
1011
1012         # We do support security on a deblobbed kernel, bug #555878.
1013         # If some particular kernel version doesn't have security
1014         # supported because of USE=deblob or otherwise, one can still
1015         # set K_SECURITY_UNSUPPORTED on a per ebuild basis.
1016         #[[ $K_DEBLOB_AVAILABLE == 1 ]] && \
1017         #       use deblob && \
1018         #       K_SECURITY_UNSUPPORTED=deblob
1019
1020         # if we are to forcably symlink, delete it if it already exists first.
1021         if [[ ${K_SYMLINK} > 0 ]]; then
1022                 [[ -h ${EROOT}usr/src/linux ]] && { rm "${EROOT}"usr/src/linux || die; }
1023                 MAKELINK=1
1024         fi
1025
1026         # if the link doesnt exist, lets create it
1027         [[ ! -h ${EROOT}usr/src/linux ]] && MAKELINK=1
1028
1029         if [[ ${MAKELINK} == 1 ]]; then
1030                 ln -sf linux-${KV_FULL} "${EROOT}"usr/src/linux || die
1031         fi
1032
1033         # Don't forget to make directory for sysfs
1034         [[ ! -d ${EROOT}sys ]] && kernel_is 2 6 && { mkdir "${EROOT}"sys || die ; }
1035
1036         echo
1037         elog "If you are upgrading from a previous kernel, you may be interested"
1038         elog "in the following document:"
1039         elog "  - General upgrade guide: https://wiki.gentoo.org/wiki/Kernel/Upgrade"
1040         echo
1041
1042         # if K_EXTRAEINFO is set then lets display it now
1043         if [[ -n ${K_EXTRAEINFO} ]]; then
1044                 echo ${K_EXTRAEINFO} | fmt |
1045                 while read -s ELINE; do einfo "${ELINE}"; done
1046         fi
1047
1048         # if K_EXTRAELOG is set then lets display it now
1049         if [[ -n ${K_EXTRAELOG} ]]; then
1050                 echo ${K_EXTRAELOG} | fmt |
1051                 while read -s ELINE; do elog "${ELINE}"; done
1052         fi
1053
1054         # if K_EXTRAEWARN is set then lets display it now
1055         if [[ -n ${K_EXTRAEWARN} ]]; then
1056                 echo ${K_EXTRAEWARN} | fmt |
1057                 while read -s ELINE; do ewarn "${ELINE}"; done
1058         fi
1059
1060         # optionally display security unsupported message
1061         #  Start with why
1062         if [[ -n ${K_SECURITY_UNSUPPORTED} ]]; then
1063                 ewarn "${PN} is UNSUPPORTED by Gentoo Security."
1064         fi
1065         #  And now the general message.
1066         if [[ -n ${K_SECURITY_UNSUPPORTED} ]]; then
1067                 ewarn "This means that it is likely to be vulnerable to recent security issues."
1068                 echo
1069                 ewarn "Upstream kernel developers recommend always running the latest "
1070                 ewarn "release of any current long term supported Linux kernel version."
1071                 ewarn "To see a list of these versions, their most current release and "
1072                 ewarn "long term support status, please go to https://www.kernel.org ."
1073                 echo
1074                 ewarn "For specific information on why this kernel is unsupported, please read:"
1075                 ewarn "https://wiki.gentoo.org/wiki/Project:Kernel_Security"
1076         fi
1077
1078         # warn sparc users that they need to do cross-compiling with >= 2.6.25(bug #214765)
1079         KV_MAJOR=$(get_version_component_range 1 ${OKV})
1080         KV_MINOR=$(get_version_component_range 2 ${OKV})
1081         KV_PATCH=$(get_version_component_range 3 ${OKV})
1082         if [[ "$(tc-arch)" = "sparc" ]]; then
1083                 if [[ $(gcc-major-version) -lt 4 && $(gcc-minor-version) -lt 4 ]]; then
1084                         if [[ ${KV_MAJOR} -ge 3 || ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} > 2.6.24 ]] ; then
1085                                 echo
1086                                 elog "NOTE: Since 2.6.25 the kernel Makefile has changed in a way that"
1087                                 elog "you now need to do"
1088                                 elog "  make CROSS_COMPILE=sparc64-unknown-linux-gnu-"
1089                                 elog "instead of just"
1090                                 elog "  make"
1091                                 elog "to compile the kernel. For more information please browse to"
1092                                 elog "https://bugs.gentoo.org/show_bug.cgi?id=214765"
1093                                 echo
1094                         fi
1095                 fi
1096         fi
1097 }
1098
1099 # pkg_setup functions
1100
1101 # @FUNCTION: setup_headers
1102 # @USAGE:
1103 # @DESCRIPTION:
1104 # Determine if ${PN} supports arch
1105
1106 setup_headers() {
1107         [[ -z ${H_SUPPORTEDARCH} ]] && H_SUPPORTEDARCH=${PN/-*/}
1108         for i in ${H_SUPPORTEDARCH}; do
1109                 [[ $(tc-arch) == "${i}" ]] && H_ACCEPT_ARCH="yes"
1110         done
1111
1112         if [[ ${H_ACCEPT_ARCH} != "yes" ]]; then
1113                 echo
1114                 eerror "This version of ${PN} does not support $(tc-arch)."
1115                 eerror "Please merge the appropriate sources, in most cases"
1116                 eerror "(but not all) this will be called $(tc-arch)-headers."
1117                 die "Package unsupported for $(tc-arch)"
1118         fi
1119 }
1120
1121 # @FUNCTION: unipatch
1122 # @USAGE: <list of patches to apply>
1123 # @DESCRIPTION:
1124 # Universal function that will apply patches to source
1125
1126 unipatch() {
1127         local i x y z extention PIPE_CMD UNIPATCH_DROP KPATCH_DIR PATCH_DEPTH ELINE
1128         local STRICT_COUNT PATCH_LEVEL myLC_ALL myLANG
1129
1130         # set to a standard locale to ensure sorts are ordered properly.
1131         myLC_ALL="${LC_ALL}"
1132         myLANG="${LANG}"
1133         LC_ALL="C"
1134         LANG=""
1135
1136         [ -z "${KPATCH_DIR}" ] && KPATCH_DIR="${WORKDIR}/patches/"
1137         [ ! -d ${KPATCH_DIR} ] && mkdir -p ${KPATCH_DIR}
1138
1139         # We're gonna need it when doing patches with a predefined patchlevel
1140         eshopts_push -s extglob
1141
1142         # This function will unpack all passed tarballs, add any passed patches,
1143         # and remove any passed patchnumbers
1144         # usage can be either via an env var or by params
1145         # although due to the nature we pass this within this eclass
1146         # it shall be by param only.
1147         # -z "${UNIPATCH_LIST}" ] && UNIPATCH_LIST="${@}"
1148         UNIPATCH_LIST="${@}"
1149
1150         #unpack any passed tarballs
1151         for i in ${UNIPATCH_LIST}; do
1152                 if echo ${i} | grep -qs -e "\.tar" -e "\.tbz" -e "\.tgz" ; then
1153                         if [ -n "${UNIPATCH_STRICTORDER}" ]; then
1154                                 unset z
1155                                 STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
1156                                 for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
1157                                         do z="${z}0";
1158                                 done
1159                                 PATCH_ORDER="${z}${STRICT_COUNT}"
1160
1161                                 mkdir -p "${KPATCH_DIR}/${PATCH_ORDER}"
1162                                 pushd "${KPATCH_DIR}/${PATCH_ORDER}" >/dev/null
1163                                 unpack ${i##*/}
1164                                 popd >/dev/null
1165                         else
1166                                 pushd "${KPATCH_DIR}" >/dev/null
1167                                 unpack ${i##*/}
1168                                 popd >/dev/null
1169                         fi
1170
1171                         [[ ${i} == *:* ]] && echo ">>> Strict patch levels not currently supported for tarballed patchsets"
1172                 else
1173                         extention=${i/*./}
1174                         extention=${extention/:*/}
1175                         PIPE_CMD=""
1176                         case ${extention} in
1177                                      xz) PIPE_CMD="xz -dc";;
1178                                    lzma) PIPE_CMD="lzma -dc";;
1179                                     bz2) PIPE_CMD="bzip2 -dc";;
1180                                  patch*) PIPE_CMD="cat";;
1181                                    diff) PIPE_CMD="cat";;
1182                                  gz|Z|z) PIPE_CMD="gzip -dc";;
1183                                 ZIP|zip) PIPE_CMD="unzip -p";;
1184                                       *) UNIPATCH_DROP="${UNIPATCH_DROP} ${i/:*/}";;
1185                         esac
1186
1187                         PATCH_LEVEL=${i/*([^:])?(:)}
1188                         i=${i/:*/}
1189                         x=${i/*\//}
1190                         x=${x/\.${extention}/}
1191
1192                         if [ -n "${PIPE_CMD}" ]; then
1193                                 if [ ! -r "${i}" ]; then
1194                                         echo
1195                                         eerror "FATAL: unable to locate:"
1196                                         eerror "${i}"
1197                                         eerror "for read-only. The file either has incorrect permissions"
1198                                         eerror "or does not exist."
1199                                         die Unable to locate ${i}
1200                                 fi
1201
1202                                 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
1203                                         unset z
1204                                         STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
1205                                         for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
1206                                                 do z="${z}0";
1207                                         done
1208                                         PATCH_ORDER="${z}${STRICT_COUNT}"
1209
1210                                         mkdir -p ${KPATCH_DIR}/${PATCH_ORDER}/
1211                                         $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${PATCH_ORDER}/${x}.patch${PATCH_LEVEL}) || die "uncompressing patch failed"
1212                                 else
1213                                         $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${x}.patch${PATCH_LEVEL}) || die "uncompressing patch failed"
1214                                 fi
1215                         fi
1216                 fi
1217
1218                 # If experimental was not chosen by the user, drop experimental patches not in K_EXP_GENPATCHES_LIST.
1219                 if [[ "${i}" == *"genpatches-"*".experimental."* && -n ${K_EXP_GENPATCHES_PULL} ]] ; then
1220                         if [[ -z ${K_EXP_GENPATCHES_NOUSE} ]] && use experimental; then
1221                                 continue
1222                         fi
1223
1224                         local j
1225                         for j in ${KPATCH_DIR}/*/50*_*.patch*; do
1226                                 for k in ${K_EXP_GENPATCHES_LIST} ; do
1227                                         [[ "$(basename ${j})" == ${k}* ]] && continue 2
1228                                 done
1229                                 UNIPATCH_DROP+=" $(basename ${j})"
1230                         done
1231                 else
1232                         UNIPATCH_LIST_GENPATCHES+=" ${DISTDIR}/${tarball}"
1233                         debug-print "genpatches tarball: $tarball"
1234
1235                         # check gcc version < 4.9.X uses patch 5000 and = 4.9.X uses patch 5010
1236                         if [[ $(gcc-major-version) -eq 4 ]] && [[ $(gcc-minor-version) -ne 9 ]]; then
1237                                 # drop 5000_enable-additional-cpu-optimizations-for-gcc-4.9.patch
1238                                 if [[ $UNIPATCH_DROP != *"5010_enable-additional-cpu-optimizations-for-gcc-4.9.patch"* ]]; then
1239                                         UNIPATCH_DROP+=" 5010_enable-additional-cpu-optimizations-for-gcc-4.9.patch"
1240                                 fi
1241                         else
1242                                 if [[ $UNIPATCH_DROP != *"5000_enable-additional-cpu-optimizations-for-gcc.patch"* ]]; then
1243                                         #drop 5000_enable-additional-cpu-optimizations-for-gcc.patch
1244                                         UNIPATCH_DROP+=" 5000_enable-additional-cpu-optimizations-for-gcc.patch"
1245                                 fi
1246                         fi
1247                 fi
1248         done
1249
1250         #populate KPATCH_DIRS so we know where to look to remove the excludes
1251         x=${KPATCH_DIR}
1252         KPATCH_DIR=""
1253         for i in $(find ${x} -type d | sort -n); do
1254                 KPATCH_DIR="${KPATCH_DIR} ${i}"
1255         done
1256
1257         # do not apply fbcondecor patch to sparc/sparc64 as it breaks boot
1258         # bug #272676
1259         if [[ "$(tc-arch)" = "sparc" || "$(tc-arch)" = "sparc64" ]]; then
1260                 if [[ ${KV_MAJOR} -ge 3 || ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} > 2.6.28 ]]; then
1261                         UNIPATCH_DROP="${UNIPATCH_DROP} *_fbcondecor-0.9.6.patch"
1262                         echo
1263                         ewarn "fbcondecor currently prevents sparc/sparc64 from booting"
1264                         ewarn "for kernel versions >= 2.6.29. Removing fbcondecor patch."
1265                         ewarn "See https://bugs.gentoo.org/show_bug.cgi?id=272676 for details"
1266                         echo
1267                 fi
1268         fi
1269
1270         #so now lets get rid of the patchno's we want to exclude
1271         UNIPATCH_DROP="${UNIPATCH_EXCLUDE} ${UNIPATCH_DROP}"
1272         for i in ${UNIPATCH_DROP}; do
1273                 ebegin "Excluding Patch #${i}"
1274                 for x in ${KPATCH_DIR}; do rm -f ${x}/${i}* 2>/dev/null; done
1275                 eend $?
1276         done
1277
1278         # and now, finally, we patch it :)
1279         for x in ${KPATCH_DIR}; do
1280                 for i in $(find ${x} -maxdepth 1 -iname "*.patch*" -or -iname "*.diff*" | sort -n); do
1281                         STDERR_T="${T}/${i/*\//}"
1282                         STDERR_T="${STDERR_T/.patch*/.err}"
1283
1284                         [ -z ${i/*.patch*/} ] && PATCH_DEPTH=${i/*.patch/}
1285                         #[ -z ${i/*.diff*/} ]  && PATCH_DEPTH=${i/*.diff/}
1286
1287                         if [ -z "${PATCH_DEPTH}" ]; then PATCH_DEPTH=0; fi
1288
1289                         ####################################################################
1290                         # IMPORTANT: This is temporary code to support Linux git 3.15_rc1! #
1291                         #                                                                  #
1292                         # The patch contains a removal of a symlink, followed by addition  #
1293                         # of a file with the same name as the symlink in the same          #
1294                         # location; this causes the dry-run to fail, filed bug #507656.    #
1295                         #                                                                  #
1296                         # https://bugs.gentoo.org/show_bug.cgi?id=507656                   #
1297                         ####################################################################
1298                         if [[ -n ${K_FROM_GIT} ]] ; then
1299                                 if [[ ${KV_MAJOR} -gt 3 || ( ${KV_MAJOR} -eq 3 && ${KV_PATCH} -gt 15 ) &&
1300                                         ${RELEASETYPE} == -rc ]] ; then
1301                                         ebegin "Applying ${i/*\//} (-p1)"
1302                                         if [ $(patch -p1 --no-backup-if-mismatch -f < ${i} >> ${STDERR_T}) "$?" -le 2 ]; then
1303                                                 eend 0
1304                                                 rm ${STDERR_T} || die
1305                                                 break
1306                                         else
1307                                                 eend 1
1308                                                 eerror "Failed to apply patch ${i/*\//}"
1309                                                 eerror "Please attach ${STDERR_T} to any bug you may post."
1310                                                 eshopts_pop
1311                                                 die "Failed to apply ${i/*\//} on patch depth 1."
1312                                         fi
1313                                 fi
1314                         fi
1315                         ####################################################################
1316
1317                         while [ ${PATCH_DEPTH} -lt 5 ]; do
1318                                 echo "Attempting Dry-run:" >> ${STDERR_T}
1319                                 echo "cmd: patch -p${PATCH_DEPTH} --no-backup-if-mismatch --dry-run -f < ${i}" >> ${STDERR_T}
1320                                 echo "=======================================================" >> ${STDERR_T}
1321                                 if [ $(patch -p${PATCH_DEPTH} --no-backup-if-mismatch --dry-run -f < ${i} >> ${STDERR_T}) $? -eq 0 ]; then
1322                                         ebegin "Applying ${i/*\//} (-p${PATCH_DEPTH})"
1323                                         echo "Attempting patch:" > ${STDERR_T}
1324                                         echo "cmd: patch -p${PATCH_DEPTH} --no-backup-if-mismatch -f < ${i}" >> ${STDERR_T}
1325                                         echo "=======================================================" >> ${STDERR_T}
1326                                         if [ $(patch -p${PATCH_DEPTH} --no-backup-if-mismatch -f < ${i} >> ${STDERR_T}) "$?" -eq 0 ]; then
1327                                                 eend 0
1328                                                 rm ${STDERR_T} || die
1329                                                 break
1330                                         else
1331                                                 eend 1
1332                                                 eerror "Failed to apply patch ${i/*\//}"
1333                                                 eerror "Please attach ${STDERR_T} to any bug you may post."
1334                                                 eshopts_pop
1335                                                 die "Failed to apply ${i/*\//} on patch depth ${PATCH_DEPTH}."
1336                                         fi
1337                                 else
1338                                         PATCH_DEPTH=$((${PATCH_DEPTH} + 1))
1339                                 fi
1340                         done
1341                         if [ ${PATCH_DEPTH} -eq 5 ]; then
1342                                 eerror "Failed to dry-run patch ${i/*\//}"
1343                                 eerror "Please attach ${STDERR_T} to any bug you may post."
1344                                 eshopts_pop
1345                                 die "Unable to dry-run patch on any patch depth lower than 5."
1346                         fi
1347                 done
1348         done
1349
1350         # When genpatches is used, we want to install 0000_README which documents
1351         # the patches that were used; such that the user can see them, bug #301478.
1352         if [[ ! -z ${K_WANT_GENPATCHES} ]] ; then
1353                 UNIPATCH_DOCS="${UNIPATCH_DOCS} 0000_README"
1354         fi
1355
1356         # When files listed in UNIPATCH_DOCS are found in KPATCH_DIR's, we copy it
1357         # to the temporary directory and remember them in UNIPATCH_DOCS to install
1358         # them during the install phase.
1359         local tmp
1360         for x in ${KPATCH_DIR}; do
1361                 for i in ${UNIPATCH_DOCS}; do
1362                         if [[ -f ${x}/${i} ]] ; then
1363                                 tmp="${tmp} ${i}"
1364                                 cp -f "${x}/${i}" "${T}"/ || die
1365                         fi
1366                 done
1367         done
1368         UNIPATCH_DOCS="${tmp}"
1369
1370         # clean up  KPATCH_DIR's - fixes bug #53610
1371         for x in ${KPATCH_DIR}; do rm -Rf ${x}; done
1372
1373         LC_ALL="${myLC_ALL}"
1374         LANG="${myLANG}"
1375         eshopts_pop
1376 }
1377
1378 # @FUNCTION: getfilevar
1379 # @USAGE: <variable> <configfile>
1380 # @DESCRIPTION:
1381 # pulled from linux-info
1382
1383 getfilevar() {
1384         local workingdir basefname basedname xarch=$(tc-arch-kernel)
1385
1386         if [[ -z ${1} ]] && [[ ! -f ${2} ]]; then
1387                 echo -e "\n"
1388                 eerror "getfilevar requires 2 variables, with the second a valid file."
1389                 eerror "   getfilevar <VARIABLE> <CONFIGFILE>"
1390         else
1391                 workingdir=${PWD}
1392                 basefname=$(basename ${2})
1393                 basedname=$(dirname ${2})
1394                 unset ARCH
1395
1396                 cd ${basedname}
1397                 echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
1398                         make ${BUILD_FIXES} -s -f - e 2>/dev/null
1399                 cd ${workingdir}
1400
1401                 ARCH=${xarch}
1402         fi
1403 }
1404
1405 # @FUNCTION: detect_arch
1406 # @USAGE:
1407 # @DESCRIPTION:
1408 # This function sets ARCH_URI and ARCH_PATCH
1409 # with the neccessary info for the arch sepecific compatibility
1410 # patchsets.
1411
1412 detect_arch() {
1413
1414         local ALL_ARCH LOOP_ARCH LOOP_ARCH_L COMPAT_URI i TC_ARCH_KERNEL
1415
1416         # COMPAT_URI is the contents of ${ARCH}_URI
1417         # ARCH_URI is the URI for all the ${ARCH}_URI patches
1418         # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
1419
1420         ARCH_URI=""
1421         ARCH_PATCH=""
1422         TC_ARCH_KERNEL=""
1423         ALL_ARCH="ALPHA AMD64 ARM HPPA IA64 M68K MIPS PPC PPC64 S390 SH SPARC X86"
1424
1425         for LOOP_ARCH in ${ALL_ARCH}; do
1426                 COMPAT_URI="${LOOP_ARCH}_URI"
1427                 COMPAT_URI="${!COMPAT_URI}"
1428
1429                 declare -l LOOP_ARCH_L=${LOOP_ARCH}
1430
1431                 [[ -n ${COMPAT_URI} ]] && \
1432                         ARCH_URI="${ARCH_URI} ${LOOP_ARCH_L}? ( ${COMPAT_URI} )"
1433
1434                 declare -u TC_ARCH_KERNEL=$(tc-arch-kernel)
1435                 if [[ ${LOOP_ARCH} == ${TC_ARCH_KERNEL} ]]; then
1436                         for i in ${COMPAT_URI}; do
1437                                 ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
1438                         done
1439                 fi
1440
1441         done
1442 }
1443
1444 # @FUNCTION: headers___fix
1445 # @USAGE:
1446 # @DESCRIPTION:
1447 # Voodoo to partially fix broken upstream headers.
1448 # note: do not put inline/asm/volatile together (breaks "inline asm volatile")
1449
1450 headers___fix() {
1451         sed -i \
1452                 -e '/^\#define.*_TYPES_H/{:loop n; bloop}' \
1453                 -e 's:\<\([us]\(8\|16\|32\|64\)\)\>:__\1:g' \
1454                 -e "s/\([[:space:]]\)inline\([[:space:](]\)/\1__inline__\2/g" \
1455                 -e "s/\([[:space:]]\)asm\([[:space:](]\)/\1__asm__\2/g" \
1456                 -e "s/\([[:space:]]\)volatile\([[:space:](]\)/\1__volatile__\2/g" \
1457                 "$@"
1458 }
1459
1460 # @FUNCTION: kernel-2_src_unpack
1461 # @USAGE:
1462 # @DESCRIPTION:
1463 # unpack sources, handle genpatches, deblob
1464
1465 kernel-2_src_unpack() {
1466         universal_unpack
1467         debug-print "Doing unipatch"
1468
1469         # request UNIPATCH_LIST_GENPATCHES in phase since it calls 'use'
1470         handle_genpatches --set-unipatch-list
1471         [[ -n ${UNIPATCH_LIST} || -n ${UNIPATCH_LIST_DEFAULT} || -n ${UNIPATCH_LIST_GENPATCHES} ]] && \
1472                 unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST_GENPATCHES} ${UNIPATCH_LIST}"
1473
1474         debug-print "Doing premake"
1475
1476         # allow ebuilds to massage the source tree after patching but before
1477         # we run misc `make` functions below
1478         [[ $(type -t kernel-2_hook_premake) == "function" ]] && kernel-2_hook_premake
1479
1480         case ${EAPI:-0} in
1481                 0|1) kernel-2_src_prepare ;;
1482         esac
1483
1484         debug-print "Doing unpack_set_extraversion"
1485
1486         [[ -z ${K_NOSETEXTRAVERSION} ]] && unpack_set_extraversion
1487         unpack_fix_install_path
1488
1489         # Setup xmakeopts and cd into sourcetree.
1490         env_setup_xmakeopts
1491         cd "${S}"
1492
1493         # We dont need a version.h for anything other than headers
1494         # at least, I should hope we dont. If this causes problems
1495         # take out the if/fi block and inform me please.
1496         # unpack_2_6 should now be 2.6.17 safe anyways
1497         if [[ ${ETYPE} == headers ]]; then
1498                 kernel_is 2 4 && unpack_2_4
1499                 kernel_is 2 6 && unpack_2_6
1500         fi
1501
1502         if [[ $K_DEBLOB_AVAILABLE == 1 ]] && use deblob ; then
1503                 cp "${DISTDIR}/${DEBLOB_A}" "${T}" || die "cp ${DEBLOB_A} failed"
1504                 cp "${DISTDIR}/${DEBLOB_CHECK_A}" "${T}/deblob-check" || die "cp ${DEBLOB_CHECK_A} failed"
1505                 chmod +x "${T}/${DEBLOB_A}" "${T}/deblob-check" || die "chmod deblob scripts failed"
1506         fi
1507
1508         # fix a problem on ppc where TOUT writes to /usr/src/linux breaking sandbox
1509         # only do this for kernel < 2.6.27 since this file does not exist in later
1510         # kernels
1511         if [[ -n ${KV_MINOR} &&  ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} < 2.6.27 ]] ; then
1512                 sed -i \
1513                         -e 's|TOUT      := .tmp_gas_check|TOUT  := $(T).tmp_gas_check|' \
1514                         "${S}"/arch/ppc/Makefile
1515         else
1516                 sed -i \
1517                         -e 's|TOUT      := .tmp_gas_check|TOUT  := $(T).tmp_gas_check|' \
1518                         "${S}"/arch/powerpc/Makefile
1519         fi
1520 }
1521
1522 # @FUNCTION: kernel-2_src_prepare
1523 # @USAGE:
1524 # @DESCRIPTION:
1525 # Apply any user patches
1526
1527 kernel-2_src_prepare() {
1528
1529         debug-print "Applying any user patches"
1530
1531         # apply any user patches
1532         case ${EAPI:-0} in
1533                 0|1|2|3|4|5) epatch_user ;;
1534                 6) eapply_user ;;
1535         esac
1536 }
1537
1538 # @FUNCTION: kernel-2_src_compile
1539 # @USAGE:
1540 # @DESCRIPTION:
1541 # conpile headers or run deblob script
1542
1543 kernel-2_src_compile() {
1544         cd "${S}"
1545         [[ ${ETYPE} == headers ]] && compile_headers
1546
1547         if [[ $K_DEBLOB_AVAILABLE == 1 ]] && use deblob ; then
1548                 echo ">>> Running deblob script ..."
1549                 python_setup
1550                 sh "${T}/${DEBLOB_A}" --force || die "Deblob script failed to run!!!"
1551         fi
1552 }
1553
1554 # @FUNCTION: kernel-2_src_test
1555 # @USAGE:
1556 # @DESCRIPTION:
1557 # if you leave it to the default src_test, it will run make to
1558 # find whether test/check targets are present; since "make test"
1559 # actually produces a few support files, they are installed even
1560 # though the package is binchecks-restricted.
1561 #
1562 # Avoid this altogether by making the function moot.
1563 kernel-2_src_test() { :; }
1564
1565 # @FUNCTION: kernel-2_pkg_preinst
1566 # @DESCRIPTION:
1567 # if ETYPE = headers, call preinst_headers
1568
1569 kernel-2_pkg_preinst() {
1570         [[ ${ETYPE} == headers ]] && preinst_headers
1571 }
1572
1573 # @FUNCTION: kernel-2_src_install
1574 # @USAGE:
1575 # @DESCRIPTION:
1576 # Install headers or sources dependant on ETYPE
1577
1578 kernel-2_src_install() {
1579         install_universal
1580         [[ ${ETYPE} == headers ]] && install_headers
1581         [[ ${ETYPE} == sources ]] && install_sources
1582 }
1583
1584 # @FUNCTION: kernel-2_pkg_postinst
1585 # @USAGE:
1586 # @DESCRIPTION:
1587 # call postinst_sources for ETYPE = sources
1588
1589 kernel-2_pkg_postinst() {
1590         [[ ${ETYPE} == sources ]] && postinst_sources
1591 }
1592
1593 # @FUNCTION: kernel-2_pkg_setup
1594 # @USAGE:
1595 # @DESCRIPTION:
1596 # check for supported kernel version, die if ETYPE is unknown, call setup_headers
1597 # if necessary
1598
1599 kernel-2_pkg_setup() {
1600         if kernel_is 2 4; then
1601                 if [[ $(gcc-major-version) -ge 4 ]] ; then
1602                         echo
1603                         ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with linux-2.4!"
1604                         ewarn "Either switch to another gcc-version (via gcc-config) or use a"
1605                         ewarn "newer kernel that supports gcc-4."
1606                         echo
1607                         ewarn "Also be aware that bugreports about gcc-4 not working"
1608                         ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"
1609                         echo
1610                         epause 10
1611                 fi
1612         fi
1613
1614         ABI="${KERNEL_ABI}"
1615         if [[ ${ETYPE} != sources ]] && [[ ${ETYPE} != headers ]]; then
1616                 eerror "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
1617                 die "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
1618         fi
1619
1620         [[ ${ETYPE} == headers ]] && setup_headers
1621         [[ ${ETYPE} == sources ]] && echo ">>> Preparing to unpack ..."
1622 }
1623
1624 # @FUNCTION: kernel-2_pkg_postrm
1625 # @USAGE:
1626 # @DESCRIPTION:
1627 # Notify the user that after a depclean, there may be sources
1628 # left behind that need to be manually cleaned
1629
1630 kernel-2_pkg_postrm() {
1631         # This warning only makes sense for kernel sources.
1632         [[ ${ETYPE} == headers ]] && return 0
1633
1634         # If there isn't anything left behind, then don't complain.
1635         [[ -e ${EROOT}usr/src/linux-${KV_FULL} ]] || return 0
1636         echo
1637         ewarn "Note: Even though you have successfully unmerged "
1638         ewarn "your kernel package, directories in kernel source location: "
1639         ewarn "${EROOT}usr/src/linux-${KV_FULL}"
1640         ewarn "with modified files will remain behind. By design, package managers"
1641         ewarn "will not remove these modified files and the directories they reside in."
1642         echo
1643         ewarn "For more detailed kernel removal instructions, please see: "
1644         ewarn "https://wiki.gentoo.org/wiki/Kernel/Removal"
1645         echo
1646 }