Gentoo Archives: gentoo-commits

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