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