1 # Copyright 1999-2016 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
4 # @ECLASS: kernel-2.eclass
6 # Gentoo Kernel project <kernel@gentoo.org>
8 # John Mylchreest <johnm@gentoo.org>
9 # Mike Pagano <mpagano@gentoo.org>
10 # <so many, many others, please add yourself>
11 # @BLURB: Eclass for kernel packages
13 # This is the kernel.eclass rewrite for a clean base regarding the 2.6
14 # series of kernel with back-compatibility for 2.4
15 # Please direct your bugs to the current eclass maintainer :)
16 # added functionality:
17 # unipatch - a flexible, singular method to extract, add and remove patches.
19 # @ECLASS-VARIABLE: K_USEPV
22 # When setting the EXTRAVERSION variable, it should
24 # this is useful for things like wolk. IE:
25 # EXTRAVERSION would be something like : -wolk-4.19-r1
27 # @ECLASS-VARIABLE: K_NOSETEXTRAVERSION
30 # if this is set then EXTRAVERSION will not be
31 # automatically set within the kernel Makefile
33 # @ECLASS-VARIABLE: K_NOUSENAME
36 # if this is set then EXTRAVERSION will not include the
37 # first part of ${PN} in EXTRAVERSION
39 # @ECLASS-VARIABLE: K_NOUSEPR
42 # if this is set then EXTRAVERSION will not include the
43 # anything based on ${PR}.
45 # @ECLASS-VARIABLE: K_PREPATCHED
48 # if the patchset is prepatched (ie: mm-sources,
49 # ck-sources, ac-sources) it will use PR (ie: -r5) as
50 # the patchset version for
51 # and not use it as a true package revision
53 # @ECLASS-VARIABLE: K_EXTRAEINFO
56 # this is a new-line seperated list of einfo displays in
57 # postinst and can be used to carry additional postinst
60 # @ECLASS-VARIABLE: K_EXTRAELOG
63 # same as K_EXTRAEINFO except using elog instead of einfo
65 # @ECLASS-VARIABLE: K_EXTRAEWARN
68 # same as K_EXTRAEINFO except using ewarn instead of einfo
70 # @ECLASS-VARIABLE: K_SYMLINK
73 # if this is set, then forcably create symlink anyway
75 # @ECLASS-VARIABLE: K_BASE_VER
78 # for git-sources, declare the base version this patch is
81 # @ECLASS-VARIABLE: K_DEFCONFIG
84 # Allow specifying a different defconfig target.
85 # If length zero, defaults to "defconfig".
87 # @ECLASS-VARIABLE: K_WANT_GENPATCHES
90 # Apply genpatches to kernel source. Provide any
91 # combination of "base", "extras" or "experimental".
93 # @ECLASS-VARIABLE: K_EXP_GENPATCHES_PULL
96 # If set, we pull "experimental" regardless of the USE FLAG
97 # but expect the ebuild maintainer to use K_EXP_GENPATCHES_LIST.
99 # @ECLASS-VARIABLE: K_EXP_GENPATCHES_NOUSE
102 # If set, no USE flag will be provided for "experimental";
103 # as a result the user cannot choose to apply those patches.
105 # @ECLASS-VARIABLE: K_EXP_GENPATCHES_LIST
108 # A list of patches to pick from "experimental" to apply when
109 # the USE flag is unset and K_EXP_GENPATCHES_PULL is set.
111 # @ECLASS-VARIABLE: K_FROM_GIT
114 # If set, this variable signals that the kernel sources derives
115 # from a git tree and special handling will be applied so that
116 # any patches that are applied will actually apply.
118 # @ECLASS-VARIABLE: K_GENPATCHES_VER
121 # The version of the genpatches tarball(s) to apply.
122 # A value of "5" would apply genpatches-2.6.12-5 to
123 # my-sources-2.6.12.ebuild
125 # @ECLASS-VARIABLE: K_SECURITY_UNSUPPORTED
128 # If set, this kernel is unsupported by Gentoo Security
129 # to the current eclass maintainer :)
131 # @ECLASS-VARIABLE: K_DEBLOB_AVAILABLE
134 # A value of "0" will disable all of the optional deblob
135 # code. If empty, will be set to "1" if deblobbing is
136 # possible. Test ONLY for "1".
138 # @ECLASS-VARIABLE: K_DEBLOB_TAG
141 # This will be the version of deblob script. It's a upstream SVN tag
142 # such asw -gnu or -gnu1.
144 # @ECLASS-VARIABLE: K_PREDEBLOBBED
147 # This kernel was already deblobbed elsewhere.
148 # If false, either optional deblobbing will be available
149 # or the license will note the inclusion of freedist code.
151 # @ECLASS-VARIABLE: K_LONGTERM
154 # If set, the eclass will search for the kernel source
155 # in the long term directories on the upstream servers
156 # as the location has been changed by upstream
158 # @ECLASS-VARIABLE: H_SUPPORTEDARCH
161 # this should be a space separated list of ARCH's which
162 # can be supported by the headers ebuild
164 # @ECLASS-VARIABLE: UNIPATCH_LIST
167 # space delimetered list of patches to be applied to the kernel
169 # @ECLASS-VARIABLE: UNIPATCH_EXCLUDE
172 # An addition var to support exlusion based completely
173 # on "<passedstring>*" and not "<passedno#>_*"
174 # this should _NOT_ be used from the ebuild as this is
175 # reserved for end users passing excludes from the cli
177 # @ECLASS-VARIABLE: UNIPATCH_DOCS
180 # space delimemeted list of docs to be installed to
183 # @ECLASS-VARIABLE: UNIPATCH_STRICTORDER
186 # if this is set places patches into directories of
187 # order, so they are applied in the order passed
188 # Changing any other variable in this eclass is not supported; you can request
189 # for additional variables to be added by contacting the current maintainer.
190 # If you do change them, there is a chance that we will not fix resulting bugs;
191 # that of course does not mean we're not willing to help.
193 PYTHON_COMPAT=( python{2_6,2_7} )
195 inherit eutils toolchain-funcs versionator multilib python-any-r1
198 EXPORT_FUNCTIONS src_{unpack,compile,install,test} \
199 pkg_{setup,preinst,postinst,postrm} ;;
201 EXPORT_FUNCTIONS src_{unpack,prepare,compile,install,test} \
202 pkg_{setup,preinst,postinst,postrm} ;;
203 *) die "${ECLASS}: EAPI ${EAPI} not supported" ;;
206 # Added by Daniel Ostrow <dostrow@gentoo.org>
207 # This is an ugly hack to get around an issue with a 32-bit userland on ppc64.
208 # I will remove it when I come up with something more reasonable.
209 [[ ${PROFILE_ARCH} == "ppc64" ]] && CHOST="powerpc64-${CHOST#*-}"
211 export CTARGET=${CTARGET:-${CHOST}}
212 if [[ ${CTARGET} == ${CHOST} && ${CATEGORY/cross-} != ${CATEGORY} ]]; then
213 export CTARGET=${CATEGORY/cross-}
216 HOMEPAGE="https://www.kernel.org/ https://www.gentoo.org/ ${HOMEPAGE}"
217 : ${LICENSE:="GPL-2"}
219 has "${EAPI:-0}" 0 1 2 && ED=${D} EPREFIX= EROOT=${ROOT}
221 # This is the latest KV_PATCH of the deblob tool available from the
222 # libre-sources upstream. If you bump this, you MUST regenerate the Manifests
223 # for ALL kernel-2 consumer packages where deblob is available.
224 : ${DEBLOB_MAX_VERSION:=38}
226 # No need to run scanelf/strip on kernel sources/headers (bug #134453).
227 RESTRICT="binchecks strip"
229 # set LINUX_HOSTCFLAGS if not already set
230 : ${LINUX_HOSTCFLAGS:="-Wall -Wstrict-prototypes -Os -fomit-frame-pointer -I${S}/include"}
233 # @FUNCTION: debug-print-kernel2-variables
236 # this function exists only to help debug kernel-2.eclass
237 # if you are adding new functionality in, put a call to it
238 # at the start of src_unpack, or during SRC_URI/dep generation.
240 debug-print-kernel2-variables() {
241 for v in PVR CKV OKV KV KV_FULL KV_MAJOR KV_MINOR KV_PATCH RELEASETYPE \
242 RELEASE UNIPATCH_LIST_DEFAULT UNIPATCH_LIST_GENPATCHES \
243 UNIPATCH_LIST S KERNEL_URI K_WANT_GENPATCHES ; do
244 debug-print "${v}: ${!v}"
248 # @FUNCTION: handle_genpatches
249 # @USAGE: [--set-unipatch-list]
251 # add genpatches to list of patches to apply if wanted
253 handle_genpatches() {
254 local tarball want_unipatch_list
255 [[ -z ${K_WANT_GENPATCHES} || -z ${K_GENPATCHES_VER} ]] && return 1
257 if [[ -n ${1} ]]; then
258 # set UNIPATCH_LIST_GENPATCHES only on explicit request
259 # since that requires 'use' call which can be used only in phase
260 # functions, while the function is also called in global scope
261 if [[ ${1} == --set-unipatch-list ]]; then
264 die "Usage: ${FUNCNAME} [--set-unipatch-list]"
268 debug-print "Inside handle_genpatches"
270 IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
272 # for > 3.0 kernels, handle genpatches tarball name
273 # genpatches for 3.0 and 3.0.1 might be named
274 # genpatches-3.0-1.base.tar.xz and genpatches-3.0-2.base.tar.xz
275 # respectively. Handle this.
277 for i in ${K_WANT_GENPATCHES} ; do
278 if [[ ${KV_MAJOR} -ge 3 ]]; then
279 if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
280 tarball="genpatches-${KV_MAJOR}.${KV_MINOR}-${K_GENPATCHES_VER}.${i}.tar.xz"
282 tarball="genpatches-${KV_MAJOR}.${KV_PATCH}-${K_GENPATCHES_VER}.${i}.tar.xz"
285 tarball="genpatches-${OKV}-${K_GENPATCHES_VER}.${i}.tar.xz"
288 local use_cond_start="" use_cond_end=""
290 if [[ "${i}" == "experimental" && -z ${K_EXP_GENPATCHES_PULL} && -z ${K_EXP_GENPATCHES_NOUSE} ]] ; then
291 use_cond_start="experimental? ( "
294 if [[ -n ${want_unipatch_list} ]] && use experimental ; then
295 UNIPATCH_LIST_GENPATCHES+=" ${DISTDIR}/${tarball}"
296 debug-print "genpatches tarball: $tarball"
298 elif [[ -n ${want_unipatch_list} ]]; then
299 UNIPATCH_LIST_GENPATCHES+=" ${DISTDIR}/${tarball}"
300 debug-print "genpatches tarball: $tarball"
302 GENPATCHES_URI+=" ${use_cond_start}mirror://gentoo/${tarball}${use_cond_end}"
306 # @FUNCTION: detect_version
309 # this function will detect and set
310 # - OKV: Original Kernel Version (2.6.0/2.6.0-test11)
311 # - KV: Kernel Version (2.6.0-gentoo/2.6.0-test11-gentoo-r1)
312 # - EXTRAVERSION: The additional version appended to OKV (-gentoo/-gentoo-r1)
315 # We've already run, so nothing to do here.
316 [[ -n ${KV_FULL} ]] && return 0
318 # CKV is used as a comparison kernel version, which is used when
319 # PV doesnt reflect the genuine kernel version.
320 # this gets set to the portage style versioning. ie:
324 OKV=${OKV/_beta/-test}
329 KV_MAJOR=$(get_version_component_range 1 ${OKV})
330 # handle if OKV is X.Y or X.Y.Z (e.g. 3.0 or 3.0.1)
332 IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
334 # if KV_MAJOR >= 3, then we have no more KV_MINOR
335 #if [[ ${KV_MAJOR} -lt 3 ]]; then
336 if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
337 KV_MINOR=$(get_version_component_range 2 ${OKV})
338 KV_PATCH=$(get_version_component_range 3 ${OKV})
339 if [[ ${KV_MAJOR}${KV_MINOR}${KV_PATCH} -ge 269 ]]; then
340 KV_EXTRA=$(get_version_component_range 4- ${OKV})
341 KV_EXTRA=${KV_EXTRA/[-_]*}
343 KV_PATCH=$(get_version_component_range 3- ${OKV})
346 KV_PATCH=$(get_version_component_range 2 ${OKV})
347 KV_EXTRA=$(get_version_component_range 3- ${OKV})
348 KV_EXTRA=${KV_EXTRA/[-_]*}
351 debug-print "KV_EXTRA is ${KV_EXTRA}"
353 KV_PATCH=${KV_PATCH/[-_]*}
356 #if [[ ${KV_MAJOR} -lt 3 ]]; then
357 if [[ ${#OKV_ARRAY[@]} -ge 3 ]]; then
358 for v in CKV OKV KV_{MAJOR,MINOR,PATCH} ; do
359 [[ -z ${!v} ]] && n=1 && missing="${missing}${v} ";
362 for v in CKV OKV KV_{MAJOR,PATCH} ; do
363 [[ -z ${!v} ]] && n=1 && missing="${missing}${v} ";
368 eerror "Missing variables: ${missing}" && \
369 die "Failed to extract kernel version (try explicit CKV in ebuild)!"
372 # if [[ ${KV_MAJOR} -ge 3 ]]; then
373 if [[ ${#OKV_ARRAY[@]} -lt 3 ]]; then
374 KV_PATCH_ARR=(${KV_PATCH//\./ })
376 # at this point 031412, Linus is putting all 3.x kernels in a
377 # 3.x directory, may need to revisit when 4.x is released
378 KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.x"
380 [[ -n "${K_LONGTERM}" ]] &&
381 KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm/v${KV_MAJOR}.${KV_PATCH_ARR}"
383 #KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.0"
384 #KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}"
385 if [[ ${KV_MAJOR} -ge 3 ]]; then
386 KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.x"
388 KERNEL_BASE_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}"
391 [[ -n "${K_LONGTERM}" ]] &&
392 #KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm"
393 KERNEL_BASE_URI="${KERNEL_BASE_URI}/longterm/v${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
396 debug-print "KERNEL_BASE_URI is ${KERNEL_BASE_URI}"
398 if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
399 # handle non genpatch using sources correctly
400 if [[ -z ${K_WANT_GENPATCHES} && -z ${K_GENPATCHES_VER} && ${KV_PATCH} -gt 0 ]]; then
401 KERNEL_URI="${KERNEL_BASE_URI}/patch-${OKV}.xz"
402 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV}.xz"
404 KERNEL_URI="${KERNEL_URI} ${KERNEL_BASE_URI}/linux-${KV_MAJOR}.${KV_MINOR}.tar.xz"
406 KERNEL_URI="${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
409 RELEASE=${CKV/${OKV}}
410 RELEASE=${RELEASE/_beta}
411 RELEASE=${RELEASE/_rc/-rc}
412 RELEASE=${RELEASE/_pre/-pre}
413 # We cannot trivally call kernel_is here, because it calls us to detect the
415 #kernel_is ge 2 6 && RELEASE=${RELEASE/-pre/-git}
416 [ $(($KV_MAJOR * 1000 + ${KV_MINOR:-0})) -ge 2006 ] && RELEASE=${RELEASE/-pre/-git}
417 RELEASETYPE=${RELEASE//[0-9]}
419 # Now we know that RELEASE is the -rc/-git
420 # and RELEASETYPE is the same but with its numerics stripped
421 # we can work on better sorting EXTRAVERSION.
422 # first of all, we add the release
423 EXTRAVERSION="${RELEASE}"
424 debug-print "0 EXTRAVERSION:${EXTRAVERSION}"
425 [[ -n ${KV_EXTRA} ]] && [[ ${KV_MAJOR} -lt 3 ]] && EXTRAVERSION=".${KV_EXTRA}${EXTRAVERSION}"
427 debug-print "1 EXTRAVERSION:${EXTRAVERSION}"
428 if [[ -n "${K_NOUSEPR}" ]]; then
429 # Don't add anything based on PR to EXTRAVERSION
430 debug-print "1.0 EXTRAVERSION:${EXTRAVERSION}"
431 elif [[ -n ${K_PREPATCHED} ]]; then
432 debug-print "1.1 EXTRAVERSION:${EXTRAVERSION}"
433 EXTRAVERSION="${EXTRAVERSION}-${PN/-*}${PR/r}"
434 elif [[ "${ETYPE}" = "sources" ]]; then
435 debug-print "1.2 EXTRAVERSION:${EXTRAVERSION}"
436 # For some sources we want to use the PV in the extra version
437 # This is because upstream releases with a completely different
444 [[ -z "${K_NOUSENAME}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PN/-*}"
445 [[ -n "${K_USEPV}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PV//_/-}"
446 [[ -n "${PR//r0}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
448 debug-print "2 EXTRAVERSION:${EXTRAVERSION}"
450 # The only messing around which should actually effect this is for KV_EXTRA
451 # since this has to limit OKV to MAJ.MIN.PAT and strip EXTRA off else
452 # KV_FULL evaluates to MAJ.MIN.PAT.EXT.EXT after EXTRAVERSION
454 if [[ -n ${KV_EXTRA} ]]; then
455 if [[ -n ${KV_MINOR} ]]; then
456 OKV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
458 OKV="${KV_MAJOR}.${KV_PATCH}"
460 KERNEL_URI="${KERNEL_BASE_URI}/patch-${CKV}.xz
461 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
462 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV}.xz"
465 # We need to set this using OKV, but we need to set it before we do any
466 # messing around with OKV based on RELEASETYPE
467 KV_FULL=${OKV}${EXTRAVERSION}
469 # we will set this for backwards compatibility.
470 S="${WORKDIR}"/linux-${KV_FULL}
473 # -rc-git pulls can be achieved by specifying CKV
475 # CKV="2.6.11_rc3_pre2"
477 # linux-2.6.10.tar.xz & patch-2.6.11-rc3.xz & patch-2.6.11-rc3-git2.xz
479 if [[ ${KV_MAJOR}${KV_MINOR} -eq 26 ]]; then
481 if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; then
482 OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
483 KERNEL_URI="${KERNEL_BASE_URI}/testing/patch-${CKV//_/-}.xz
484 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
485 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.xz"
488 if [[ ${RELEASETYPE} == -git ]]; then
489 KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${OKV}${RELEASE}.xz
490 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
491 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.xz"
494 if [[ ${RELEASETYPE} == -rc-git ]]; then
495 OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
496 KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.xz
497 ${KERNEL_BASE_URI}/testing/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-git*}.xz
498 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
500 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-git*}.xz ${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.xz"
503 KV_PATCH_ARR=(${KV_PATCH//\./ })
505 # the different majorminor versions have different patch start versions
506 OKV_DICT=(["2"]="${KV_MAJOR}.$((${KV_PATCH_ARR} - 1))" ["3"]="2.6.39" ["4"]="3.19")
508 if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; then
509 OKV=${K_BASE_VER:-$OKV_DICT["${KV_MAJOR}"]}
510 KERNEL_URI="${KERNEL_BASE_URI}/testing/patch-${CKV//_/-}.xz
511 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
512 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.xz"
515 if [[ ${RELEASETYPE} == -git ]]; then
516 KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${OKV}${RELEASE}.xz
517 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
518 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.xz"
521 if [[ ${RELEASETYPE} == -rc-git ]]; then
522 OKV=${K_BASE_VER:-$OKV_DICT["${KV_MAJOR}"]}
523 KERNEL_URI="${KERNEL_BASE_URI}/snapshots/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE}.xz
524 ${KERNEL_BASE_URI}/testing/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE/-git*}.xz
525 ${KERNEL_BASE_URI}/linux-${OKV}.tar.xz"
527 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE/-git*}.xz ${DISTDIR}/patch-${KV_MAJOR}.${KV_PATCH}${RELEASE}.xz"
533 debug-print-kernel2-variables
538 # @FUNCTION: kernel_is
539 # @USAGE: <conditional version | version>
541 # user for comparing kernel versions
542 # or just identifying a version
544 # e.g kernel_is ge 4.8.11
545 # Note: duplicated in linux-info.eclass
547 # ALL of these should be set before we can safely continue this function.
548 # some of the sources have in the past had only one set.
550 for v in OKV KV_{MAJOR,MINOR,PATCH} ; do [[ -z ${!v} ]] && n=1 ; done
551 [[ $n -eq 1 ]] && detect_version
554 # Now we can continue
555 local operator test value
558 lt) operator="-lt"; shift;;
559 gt) operator="-gt"; shift;;
560 le) operator="-le"; shift;;
561 ge) operator="-ge"; shift;;
562 eq) operator="-eq"; shift;;
565 [[ $# -gt 3 ]] && die "Error in kernel-2_kernel_is(): too many parameters"
567 : $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH ))
568 : $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + ${3:-${KV_PATCH}} ))
569 [ ${test} ${operator} ${value} ]
572 # @FUNCTION: kernel_is_2_4
575 # return true if kernel is version 2.4
580 # @FUNCTION: kernel_is_2_6
583 # return true if kernel is version 2.6
585 kernel_is 2 6 || kernel_is 2 5
588 # Capture the sources type and set DEPENDs
589 if [[ ${ETYPE} == sources ]]; then
592 >=sys-devel/binutils-2.11.90.0.31
595 >=sys-libs/ncurses-5.2
602 DESCRIPTION="Sources based on the Linux Kernel."
605 # Bug #266157, deblob for libre support
606 if [[ -z ${K_PREDEBLOBBED} ]] ; then
607 # Bug #359865, force a call to detect_version if needed
608 kernel_is ge 2 6 27 && \
609 [[ -z "${K_DEBLOB_AVAILABLE}" ]] && \
610 kernel_is le 2 6 ${DEBLOB_MAX_VERSION} && \
612 if [[ ${K_DEBLOB_AVAILABLE} == "1" ]] ; then
613 IUSE="${IUSE} deblob"
615 # Reflect that kernels contain firmware blobs unless otherwise
617 LICENSE="${LICENSE} !deblob? ( freedist )"
619 DEPEND+=" deblob? ( ${PYTHON_DEPS} )"
621 if [[ -n KV_MINOR ]]; then
622 DEBLOB_PV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
624 DEBLOB_PV="${KV_MAJOR}.${KV_PATCH}"
627 if [[ ${KV_MAJOR} -ge 3 ]]; then
628 DEBLOB_PV="${KV_MAJOR}.${KV_MINOR}"
631 # deblob svn tag, default is -gnu, to change, use K_DEBLOB_TAG in ebuild
632 K_DEBLOB_TAG=${K_DEBLOB_TAG:--gnu}
633 DEBLOB_A="deblob-${DEBLOB_PV}"
634 DEBLOB_CHECK_A="deblob-check-${DEBLOB_PV}"
635 DEBLOB_HOMEPAGE="http://www.fsfla.org/svn/fsfla/software/linux-libre/releases/tags"
636 DEBLOB_URI_PATH="${DEBLOB_PV}${K_DEBLOB_TAG}"
637 if ! has "${EAPI:-0}" 0 1 ; then
638 DEBLOB_CHECK_URI="${DEBLOB_HOMEPAGE}/${DEBLOB_URI_PATH}/deblob-check -> ${DEBLOB_CHECK_A}"
640 DEBLOB_CHECK_URI="mirror://gentoo/${DEBLOB_CHECK_A}"
643 DEBLOB_URI="${DEBLOB_HOMEPAGE}/${DEBLOB_URI_PATH}/${DEBLOB_A}"
644 HOMEPAGE="${HOMEPAGE} ${DEBLOB_HOMEPAGE}"
646 KERNEL_URI="${KERNEL_URI}
652 # We have no way to deblob older kernels, so just mark them as
653 # tainted with non-libre materials.
654 LICENSE="${LICENSE} freedist"
658 elif [[ ${ETYPE} == headers ]]; then
659 DESCRIPTION="Linux system headers"
660 IUSE="crosscompile_opts_headers-only"
662 # Since we should NOT honour KBUILD_OUTPUT in headers
663 # lets unset it here.
669 # Cross-compile support functions
671 # @FUNCTION: kernel_header_destdir
674 # return header destination directory
675 kernel_header_destdir() {
676 [[ ${CTARGET} == ${CHOST} ]] \
677 && echo /usr/include \
678 || echo /usr/${CTARGET}/usr/include
681 # @FUNCTION: cross_pre_c_headers
684 # set use if necessary for cross compile support
685 cross_pre_c_headers() {
686 use crosscompile_opts_headers-only && [[ ${CHOST} != ${CTARGET} ]]
689 # @FUNCTION: env_setup_xmakeopts
692 # set the ARCH/CROSS_COMPILE when cross compiling
694 env_setup_xmakeopts() {
695 # Kernel ARCH != portage ARCH
696 export KARCH=$(tc-arch-kernel)
698 # When cross-compiling, we need to set the ARCH/CROSS_COMPILE
699 # variables properly or bad things happen !
700 xmakeopts="ARCH=${KARCH}"
701 if [[ ${CTARGET} != ${CHOST} ]] && ! cross_pre_c_headers ; then
702 xmakeopts="${xmakeopts} CROSS_COMPILE=${CTARGET}-"
703 elif type -p ${CHOST}-ar > /dev/null ; then
704 xmakeopts="${xmakeopts} CROSS_COMPILE=${CHOST}-"
709 # @FUNCTION: unpack_2_4
712 # unpack and generate .config for 2.4 kernels
715 # this file is required for other things to build properly,
716 # so we autogenerate it
717 make -s mrproper ${xmakeopts} || die "make mrproper failed"
718 make -s symlinks ${xmakeopts} || die "make symlinks failed"
719 make -s include/linux/version.h ${xmakeopts} || die "make include/linux/version.h failed"
720 echo ">>> version.h compiled successfully."
723 # @FUNCTION: unpack_2_6
726 # unpack and generate .config for 2.6 kernels
729 # this file is required for other things to build properly, so we
730 # autogenerate it ... generate a .config to keep version.h build from
731 # spitting out an annoying warning
732 make -s mrproper ${xmakeopts} 2>/dev/null \
733 || die "make mrproper failed"
735 # quick fix for bug #132152 which triggers when it cannot include linux
736 # headers (ie, we have not installed it yet)
737 if ! make -s defconfig ${xmakeopts} &>/dev/null 2>&1 ; then
739 eerror "make defconfig failed."
740 eerror "assuming you dont have any headers installed yet and continuing"
744 make -s include/linux/version.h ${xmakeopts} 2>/dev/null \
745 || die "make include/linux/version.h failed"
746 rm -f .config >/dev/null
749 # @FUNCTION: universal_unpack
752 # unpack kernel sources
755 debug-print "Inside universal_unpack"
758 IFS="." read -r -a OKV_ARRAY <<<"${OKV}"
761 if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
762 unpack linux-${KV_MAJOR}.${KV_MINOR}.tar.xz
764 unpack linux-${OKV}.tar.xz
767 if [[ -d "linux" ]]; then
768 debug-print "Moving linux to linux-${KV_FULL}"
769 mv linux linux-${KV_FULL} \
770 || die "Unable to move source tree to ${KV_FULL}."
771 elif [[ "${OKV}" != "${KV_FULL}" ]]; then
772 if [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]] &&
773 [[ "${ETYPE}" = "sources" ]]; then
774 debug-print "moving linux-${KV_MAJOR}.${KV_MINOR} to linux-${KV_FULL} "
775 mv linux-${KV_MAJOR}.${KV_MINOR} linux-${KV_FULL} \
776 || die "Unable to move source tree to ${KV_FULL}."
778 debug-print "moving linux-${OKV} to linux-${KV_FULL} "
779 mv linux-${OKV} linux-${KV_FULL} \
780 || die "Unable to move source tree to ${KV_FULL}."
782 elif [[ ${#OKV_ARRAY[@]} -ge 3 ]] && [[ ${KV_MAJOR} -ge 3 ]]; then
783 mv linux-${KV_MAJOR}.${KV_MINOR} linux-${KV_FULL} \
784 || die "Unable to move source tree to ${KV_FULL}."
788 # remove all backup files
789 find . -iname "*~" -exec rm {} \; 2> /dev/null
793 # @FUNCTION: unpack_set_extraversion
796 # handle EXTRAVERSION
798 unpack_set_extraversion() {
800 sed -i -e "s:^\(EXTRAVERSION =\).*:\1 ${EXTRAVERSION}:" Makefile
804 # @FUNCTION: unpack_fix_install_path
807 # Should be done after patches have been applied
808 # Otherwise patches that modify the same area of Makefile will fail
810 unpack_fix_install_path() {
812 sed -i -e 's:#export\tINSTALL_PATH:export\tINSTALL_PATH:' Makefile
817 # @FUNCTION: compile_headers
825 # if we couldnt obtain HOSTCFLAGS from the Makefile,
826 # then set it to something sane
827 local HOSTCFLAGS=$(getfilevar HOSTCFLAGS "${S}"/Makefile)
828 HOSTCFLAGS=${HOSTCFLAGS:--Wall -Wstrict-prototypes -O2 -fomit-frame-pointer}
830 if kernel_is 2 4; then
831 yes "" | make oldconfig ${xmakeopts}
832 echo ">>> make oldconfig complete"
833 make dep ${xmakeopts}
834 elif kernel_is 2 6; then
835 # 2.6.18 introduces headers_install which means we dont need any
836 # of this crap anymore :D
837 kernel_is ge 2 6 18 && return 0
839 # autoconf.h isnt generated unless it already exists. plus, we have
840 # no guarantee that any headers are installed on the system...
841 [[ -f ${EROOT}usr/include/linux/autoconf.h ]] \
842 || touch include/linux/autoconf.h
844 # if K_DEFCONFIG isn't set, force to "defconfig"
846 if [[ -z ${K_DEFCONFIG} ]]; then
847 if kernel_is ge 2 6 16 ; then
849 powerpc64*) K_DEFCONFIG="ppc64_defconfig";;
850 powerpc*) K_DEFCONFIG="pmac32_defconfig";;
851 *) K_DEFCONFIG="defconfig";;
854 K_DEFCONFIG="defconfig"
858 # if there arent any installed headers, then there also isnt an asm
859 # symlink in /usr/include/, and make defconfig will fail, so we have
860 # to force an include path with $S.
861 HOSTCFLAGS="${HOSTCFLAGS} -I${S}/include/"
862 ln -sf asm-${KARCH} "${S}"/include/asm || die
863 cross_pre_c_headers && return 0
865 make ${K_DEFCONFIG} HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "defconfig failed (${K_DEFCONFIG})"
866 if compile_headers_tweak_config ; then
867 yes "" | make oldconfig HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "2nd oldconfig failed"
869 make prepare HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
870 make prepare-all HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
874 # @FUNCTION: compile_headers_tweak_config
877 # some targets can be very very picky, so let's finesse the
878 # .config based upon any info we may have
880 compile_headers_tweak_config() {
883 sed -i '/CONFIG_CPU_SH/d' .config || die
884 echo "CONFIG_CPU_SH${CTARGET:2:1}=y" >> .config
888 # no changes, so lets do nothing
894 # @FUNCTION: install_universal
897 # Fix permissions in tarball
899 install_universal() {
901 chown -R 0:0 * >& /dev/null
902 chmod -R a+r-w+X,u+w *
906 # @FUNCTION: install_headers
912 local ddir=$(kernel_header_destdir)
914 # 2.6.18 introduces headers_install which means we dont need any
915 # of this crap anymore :D
916 if kernel_is ge 2 6 18 ; then
918 emake headers_install INSTALL_HDR_PATH="${ED}"${ddir}/.. ${xmakeopts} || die
920 # let other packages install some of these headers
921 rm -rf "${ED}"${ddir}/scsi || die #glibc/uclibc/etc...
925 # Do not use "linux/*" as that can cause problems with very long
926 # $S values where the cmdline to cp is too long
927 pushd "${S}" >/dev/null
929 cp -pPR "${S}"/include/linux "${ED}"${ddir}/ || die
930 rm -rf "${ED}"${ddir}/linux/modules || die
933 cp -pPR "${S}"/include/asm/* "${ED}"${ddir}/asm || die
935 if kernel_is 2 6 ; then
936 dodir ${ddir}/asm-generic
937 cp -pPR "${S}"/include/asm-generic/* "${ED}"${ddir}/asm-generic || die
941 find "${D}" -name '*.orig' -exec rm -f {} \;
946 # @FUNCTION: install_sources
956 echo ">>> Copying sources ..."
958 file="$(find ${WORKDIR} -iname "docs" -type d)"
959 if [[ -n ${file} ]]; then
960 for file in $(find ${file} -type f); do
961 echo "${file//*docs\/}" >> "${S}"/patches.txt
962 echo "===================================================" >> "${S}"/patches.txt
963 cat ${file} >> "${S}"/patches.txt
964 echo "===================================================" >> "${S}"/patches.txt
965 echo "" >> "${S}"/patches.txt
969 mv "${WORKDIR}"/linux* "${ED}"usr/src || die
971 if [[ -n "${UNIPATCH_DOCS}" ]] ; then
972 for i in ${UNIPATCH_DOCS}; do
978 # @FUNCTION: preinst_headers
981 # Headers preinst steps
984 local ddir=$(kernel_header_destdir)
985 [[ -L ${EPREFIX}${ddir}/linux ]] && { rm "${EPREFIX}"${ddir}/linux || die; }
986 [[ -L ${EPREFIX}${ddir}/asm ]] && { rm "${EPREFIX}"${ddir}/asm || die; }
989 # @FUNCTION: postinst_sources
992 # Sources post installation function.
993 # see inline comments
998 # if we have USE=symlink, then force K_SYMLINK=1
999 use symlink && K_SYMLINK=1
1001 # We do support security on a deblobbed kernel, bug #555878.
1002 # If some particular kernel version doesn't have security
1003 # supported because of USE=deblob or otherwise, one can still
1004 # set K_SECURITY_UNSUPPORTED on a per ebuild basis.
1005 #[[ $K_DEBLOB_AVAILABLE == 1 ]] && \
1007 # K_SECURITY_UNSUPPORTED=deblob
1009 # if we are to forcably symlink, delete it if it already exists first.
1010 if [[ ${K_SYMLINK} > 0 ]]; then
1011 [[ -h ${EROOT}usr/src/linux ]] && { rm "${EROOT}"usr/src/linux || die; }
1015 # if the link doesnt exist, lets create it
1016 [[ ! -h ${EROOT}usr/src/linux ]] && MAKELINK=1
1018 if [[ ${MAKELINK} == 1 ]]; then
1019 ln -sf linux-${KV_FULL} "${EROOT}"usr/src/linux || die
1022 # Don't forget to make directory for sysfs
1023 [[ ! -d ${EROOT}sys ]] && kernel_is 2 6 && { mkdir "${EROOT}"sys || die ; }
1026 elog "If you are upgrading from a previous kernel, you may be interested"
1027 elog "in the following document:"
1028 elog " - General upgrade guide: https://wiki.gentoo.org/wiki/Kernel/Upgrade"
1031 # if K_EXTRAEINFO is set then lets display it now
1032 if [[ -n ${K_EXTRAEINFO} ]]; then
1033 echo ${K_EXTRAEINFO} | fmt |
1034 while read -s ELINE; do einfo "${ELINE}"; done
1037 # if K_EXTRAELOG is set then lets display it now
1038 if [[ -n ${K_EXTRAELOG} ]]; then
1039 echo ${K_EXTRAELOG} | fmt |
1040 while read -s ELINE; do elog "${ELINE}"; done
1043 # if K_EXTRAEWARN is set then lets display it now
1044 if [[ -n ${K_EXTRAEWARN} ]]; then
1045 echo ${K_EXTRAEWARN} | fmt |
1046 while read -s ELINE; do ewarn "${ELINE}"; done
1049 # optionally display security unsupported message
1051 if [[ -n ${K_SECURITY_UNSUPPORTED} ]]; then
1052 ewarn "${PN} is UNSUPPORTED by Gentoo Security."
1054 # And now the general message.
1055 if [[ -n ${K_SECURITY_UNSUPPORTED} ]]; then
1056 ewarn "This means that it is likely to be vulnerable to recent security issues."
1058 ewarn "Upstream kernel developers recommend always running the latest "
1059 ewarn "release of any current long term supported Linux kernel version."
1060 ewarn "To see a list of these versions, their most current release and "
1061 ewarn "long term support status, please go to https://www.kernel.org ."
1063 ewarn "For specific information on why this kernel is unsupported, please read:"
1064 ewarn "https://wiki.gentoo.org/wiki/Project:Kernel_Security"
1067 # warn sparc users that they need to do cross-compiling with >= 2.6.25(bug #214765)
1068 KV_MAJOR=$(get_version_component_range 1 ${OKV})
1069 KV_MINOR=$(get_version_component_range 2 ${OKV})
1070 KV_PATCH=$(get_version_component_range 3 ${OKV})
1071 if [[ "$(tc-arch)" = "sparc" ]]; then
1072 if [[ $(gcc-major-version) -lt 4 && $(gcc-minor-version) -lt 4 ]]; then
1073 if [[ ${KV_MAJOR} -ge 3 || ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} > 2.6.24 ]] ; then
1075 elog "NOTE: Since 2.6.25 the kernel Makefile has changed in a way that"
1076 elog "you now need to do"
1077 elog " make CROSS_COMPILE=sparc64-unknown-linux-gnu-"
1078 elog "instead of just"
1080 elog "to compile the kernel. For more information please browse to"
1081 elog "https://bugs.gentoo.org/show_bug.cgi?id=214765"
1088 # pkg_setup functions
1090 # @FUNCTION: setup_headers
1093 # Determine if ${PN} supports arch
1096 [[ -z ${H_SUPPORTEDARCH} ]] && H_SUPPORTEDARCH=${PN/-*/}
1097 for i in ${H_SUPPORTEDARCH}; do
1098 [[ $(tc-arch) == "${i}" ]] && H_ACCEPT_ARCH="yes"
1101 if [[ ${H_ACCEPT_ARCH} != "yes" ]]; then
1103 eerror "This version of ${PN} does not support $(tc-arch)."
1104 eerror "Please merge the appropriate sources, in most cases"
1105 eerror "(but not all) this will be called $(tc-arch)-headers."
1106 die "Package unsupported for $(tc-arch)"
1110 # @FUNCTION: unipatch
1111 # @USAGE: <list of patches to apply>
1113 # Universal function that will apply patches to source
1116 local i x y z extention PIPE_CMD UNIPATCH_DROP KPATCH_DIR PATCH_DEPTH ELINE
1117 local STRICT_COUNT PATCH_LEVEL myLC_ALL myLANG
1119 # set to a standard locale to ensure sorts are ordered properly.
1120 myLC_ALL="${LC_ALL}"
1125 [ -z "${KPATCH_DIR}" ] && KPATCH_DIR="${WORKDIR}/patches/"
1126 [ ! -d ${KPATCH_DIR} ] && mkdir -p ${KPATCH_DIR}
1128 # We're gonna need it when doing patches with a predefined patchlevel
1129 eshopts_push -s extglob
1131 # This function will unpack all passed tarballs, add any passed patches,
1132 # and remove any passed patchnumbers
1133 # usage can be either via an env var or by params
1134 # although due to the nature we pass this within this eclass
1135 # it shall be by param only.
1136 # -z "${UNIPATCH_LIST}" ] && UNIPATCH_LIST="${@}"
1137 UNIPATCH_LIST="${@}"
1139 #unpack any passed tarballs
1140 for i in ${UNIPATCH_LIST}; do
1141 if echo ${i} | grep -qs -e "\.tar" -e "\.tbz" -e "\.tgz" ; then
1142 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
1144 STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
1145 for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
1148 PATCH_ORDER="${z}${STRICT_COUNT}"
1150 mkdir -p "${KPATCH_DIR}/${PATCH_ORDER}"
1151 pushd "${KPATCH_DIR}/${PATCH_ORDER}" >/dev/null
1155 pushd "${KPATCH_DIR}" >/dev/null
1160 [[ ${i} == *:* ]] && echo ">>> Strict patch levels not currently supported for tarballed patchsets"
1163 extention=${extention/:*/}
1165 case ${extention} in
1166 xz) PIPE_CMD="xz -dc";;
1167 lzma) PIPE_CMD="lzma -dc";;
1168 bz2) PIPE_CMD="bzip2 -dc";;
1169 patch*) PIPE_CMD="cat";;
1170 diff) PIPE_CMD="cat";;
1171 gz|Z|z) PIPE_CMD="gzip -dc";;
1172 ZIP|zip) PIPE_CMD="unzip -p";;
1173 *) UNIPATCH_DROP="${UNIPATCH_DROP} ${i/:*/}";;
1176 PATCH_LEVEL=${i/*([^:])?(:)}
1179 x=${x/\.${extention}/}
1181 if [ -n "${PIPE_CMD}" ]; then
1182 if [ ! -r "${i}" ]; then
1184 eerror "FATAL: unable to locate:"
1186 eerror "for read-only. The file either has incorrect permissions"
1187 eerror "or does not exist."
1188 die Unable to locate ${i}
1191 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
1193 STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
1194 for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
1197 PATCH_ORDER="${z}${STRICT_COUNT}"
1199 mkdir -p ${KPATCH_DIR}/${PATCH_ORDER}/
1200 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${PATCH_ORDER}/${x}.patch${PATCH_LEVEL}) || die "uncompressing patch failed"
1202 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${x}.patch${PATCH_LEVEL}) || die "uncompressing patch failed"
1207 # If experimental was not chosen by the user, drop experimental patches not in K_EXP_GENPATCHES_LIST.
1208 if [[ "${i}" == *"genpatches-"*".experimental."* && -n ${K_EXP_GENPATCHES_PULL} ]] ; then
1209 if [[ -z ${K_EXP_GENPATCHES_NOUSE} ]] && use experimental; then
1214 for j in ${KPATCH_DIR}/*/50*_*.patch*; do
1215 for k in ${K_EXP_GENPATCHES_LIST} ; do
1216 [[ "$(basename ${j})" == ${k}* ]] && continue 2
1218 UNIPATCH_DROP+=" $(basename ${j})"
1221 UNIPATCH_LIST_GENPATCHES+=" ${DISTDIR}/${tarball}"
1222 debug-print "genpatches tarball: $tarball"
1224 # check gcc version < 4.9.X uses patch 5000 and = 4.9.X uses patch 5010
1225 if [[ $(gcc-major-version) -eq 4 ]] && [[ $(gcc-minor-version) -ne 9 ]]; then
1226 # drop 5000_enable-additional-cpu-optimizations-for-gcc-4.9.patch
1227 if [[ $UNIPATCH_DROP != *"5010_enable-additional-cpu-optimizations-for-gcc-4.9.patch"* ]]; then
1228 UNIPATCH_DROP+=" 5010_enable-additional-cpu-optimizations-for-gcc-4.9.patch"
1231 if [[ $UNIPATCH_DROP != *"5000_enable-additional-cpu-optimizations-for-gcc.patch"* ]]; then
1232 #drop 5000_enable-additional-cpu-optimizations-for-gcc.patch
1233 UNIPATCH_DROP+=" 5000_enable-additional-cpu-optimizations-for-gcc.patch"
1239 #populate KPATCH_DIRS so we know where to look to remove the excludes
1242 for i in $(find ${x} -type d | sort -n); do
1243 KPATCH_DIR="${KPATCH_DIR} ${i}"
1246 # do not apply fbcondecor patch to sparc/sparc64 as it breaks boot
1248 if [[ "$(tc-arch)" = "sparc" || "$(tc-arch)" = "sparc64" ]]; then
1249 if [[ ${KV_MAJOR} -ge 3 || ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} > 2.6.28 ]]; then
1250 UNIPATCH_DROP="${UNIPATCH_DROP} *_fbcondecor-0.9.6.patch"
1252 ewarn "fbcondecor currently prevents sparc/sparc64 from booting"
1253 ewarn "for kernel versions >= 2.6.29. Removing fbcondecor patch."
1254 ewarn "See https://bugs.gentoo.org/show_bug.cgi?id=272676 for details"
1259 #so now lets get rid of the patchno's we want to exclude
1260 UNIPATCH_DROP="${UNIPATCH_EXCLUDE} ${UNIPATCH_DROP}"
1261 for i in ${UNIPATCH_DROP}; do
1262 ebegin "Excluding Patch #${i}"
1263 for x in ${KPATCH_DIR}; do rm -f ${x}/${i}* 2>/dev/null; done
1267 # and now, finally, we patch it :)
1268 for x in ${KPATCH_DIR}; do
1269 for i in $(find ${x} -maxdepth 1 -iname "*.patch*" -or -iname "*.diff*" | sort -n); do
1270 STDERR_T="${T}/${i/*\//}"
1271 STDERR_T="${STDERR_T/.patch*/.err}"
1273 [ -z ${i/*.patch*/} ] && PATCH_DEPTH=${i/*.patch/}
1274 #[ -z ${i/*.diff*/} ] && PATCH_DEPTH=${i/*.diff/}
1276 if [ -z "${PATCH_DEPTH}" ]; then PATCH_DEPTH=0; fi
1278 ####################################################################
1279 # IMPORTANT: This is temporary code to support Linux git 3.15_rc1! #
1281 # The patch contains a removal of a symlink, followed by addition #
1282 # of a file with the same name as the symlink in the same #
1283 # location; this causes the dry-run to fail, filed bug #507656. #
1285 # https://bugs.gentoo.org/show_bug.cgi?id=507656 #
1286 ####################################################################
1287 if [[ -n ${K_FROM_GIT} ]] ; then
1288 if [[ ${KV_MAJOR} -gt 3 || ( ${KV_MAJOR} -eq 3 && ${KV_PATCH} -gt 15 ) &&
1289 ${RELEASETYPE} == -rc ]] ; then
1290 ebegin "Applying ${i/*\//} (-p1)"
1291 if [ $(patch -p1 --no-backup-if-mismatch -f < ${i} >> ${STDERR_T}) "$?" -le 2 ]; then
1293 rm ${STDERR_T} || die
1297 eerror "Failed to apply patch ${i/*\//}"
1298 eerror "Please attach ${STDERR_T} to any bug you may post."
1300 die "Failed to apply ${i/*\//} on patch depth 1."
1304 ####################################################################
1306 while [ ${PATCH_DEPTH} -lt 5 ]; do
1307 echo "Attempting Dry-run:" >> ${STDERR_T}
1308 echo "cmd: patch -p${PATCH_DEPTH} --no-backup-if-mismatch --dry-run -f < ${i}" >> ${STDERR_T}
1309 echo "=======================================================" >> ${STDERR_T}
1310 if [ $(patch -p${PATCH_DEPTH} --no-backup-if-mismatch --dry-run -f < ${i} >> ${STDERR_T}) $? -eq 0 ]; then
1311 ebegin "Applying ${i/*\//} (-p${PATCH_DEPTH})"
1312 echo "Attempting patch:" > ${STDERR_T}
1313 echo "cmd: patch -p${PATCH_DEPTH} --no-backup-if-mismatch -f < ${i}" >> ${STDERR_T}
1314 echo "=======================================================" >> ${STDERR_T}
1315 if [ $(patch -p${PATCH_DEPTH} --no-backup-if-mismatch -f < ${i} >> ${STDERR_T}) "$?" -eq 0 ]; then
1317 rm ${STDERR_T} || die
1321 eerror "Failed to apply patch ${i/*\//}"
1322 eerror "Please attach ${STDERR_T} to any bug you may post."
1324 die "Failed to apply ${i/*\//} on patch depth ${PATCH_DEPTH}."
1327 PATCH_DEPTH=$((${PATCH_DEPTH} + 1))
1330 if [ ${PATCH_DEPTH} -eq 5 ]; then
1331 eerror "Failed to dry-run patch ${i/*\//}"
1332 eerror "Please attach ${STDERR_T} to any bug you may post."
1334 die "Unable to dry-run patch on any patch depth lower than 5."
1339 # When genpatches is used, we want to install 0000_README which documents
1340 # the patches that were used; such that the user can see them, bug #301478.
1341 if [[ ! -z ${K_WANT_GENPATCHES} ]] ; then
1342 UNIPATCH_DOCS="${UNIPATCH_DOCS} 0000_README"
1345 # When files listed in UNIPATCH_DOCS are found in KPATCH_DIR's, we copy it
1346 # to the temporary directory and remember them in UNIPATCH_DOCS to install
1347 # them during the install phase.
1349 for x in ${KPATCH_DIR}; do
1350 for i in ${UNIPATCH_DOCS}; do
1351 if [[ -f ${x}/${i} ]] ; then
1353 cp -f "${x}/${i}" "${T}"/ || die
1357 UNIPATCH_DOCS="${tmp}"
1359 # clean up KPATCH_DIR's - fixes bug #53610
1360 for x in ${KPATCH_DIR}; do rm -Rf ${x}; done
1362 LC_ALL="${myLC_ALL}"
1367 # @FUNCTION: getfilevar
1368 # @USAGE: <variable> <configfile>
1370 # pulled from linux-info
1373 local workingdir basefname basedname xarch=$(tc-arch-kernel)
1375 if [[ -z ${1} ]] && [[ ! -f ${2} ]]; then
1377 eerror "getfilevar requires 2 variables, with the second a valid file."
1378 eerror " getfilevar <VARIABLE> <CONFIGFILE>"
1381 basefname=$(basename ${2})
1382 basedname=$(dirname ${2})
1386 echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
1387 make ${BUILD_FIXES} -s -f - e 2>/dev/null
1394 # @FUNCTION: detect_arch
1397 # This function sets ARCH_URI and ARCH_PATCH
1398 # with the neccessary info for the arch sepecific compatibility
1403 local ALL_ARCH LOOP_ARCH COMPAT_URI i
1405 # COMPAT_URI is the contents of ${ARCH}_URI
1406 # ARCH_URI is the URI for all the ${ARCH}_URI patches
1407 # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
1411 ALL_ARCH="ALPHA AMD64 ARM HPPA IA64 M68K MIPS PPC PPC64 S390 SH SPARC X86"
1413 for LOOP_ARCH in ${ALL_ARCH}; do
1414 COMPAT_URI="${LOOP_ARCH}_URI"
1415 COMPAT_URI="${!COMPAT_URI}"
1417 [[ -n ${COMPAT_URI} ]] && \
1418 ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr '[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
1420 if [[ ${LOOP_ARCH} == "$(echo $(tc-arch-kernel) | tr '[:lower:]' '[:upper:]')" ]]; then
1421 for i in ${COMPAT_URI}; do
1422 ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
1428 # @FUNCTION: headers___fix
1431 # Voodoo to partially fix broken upstream headers.
1432 # note: do not put inline/asm/volatile together (breaks "inline asm volatile")
1436 -e '/^\#define.*_TYPES_H/{:loop n; bloop}' \
1437 -e 's:\<\([us]\(8\|16\|32\|64\)\)\>:__\1:g' \
1438 -e "s/\([[:space:]]\)inline\([[:space:](]\)/\1__inline__\2/g" \
1439 -e "s/\([[:space:]]\)asm\([[:space:](]\)/\1__asm__\2/g" \
1440 -e "s/\([[:space:]]\)volatile\([[:space:](]\)/\1__volatile__\2/g" \
1444 # @FUNCTION: kernel-2_src_unpack
1447 # unpack sources, handle genpatches, deblob
1449 kernel-2_src_unpack() {
1451 debug-print "Doing unipatch"
1453 # request UNIPATCH_LIST_GENPATCHES in phase since it calls 'use'
1454 handle_genpatches --set-unipatch-list
1455 [[ -n ${UNIPATCH_LIST} || -n ${UNIPATCH_LIST_DEFAULT} || -n ${UNIPATCH_LIST_GENPATCHES} ]] && \
1456 unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST_GENPATCHES} ${UNIPATCH_LIST}"
1458 debug-print "Doing premake"
1460 # allow ebuilds to massage the source tree after patching but before
1461 # we run misc `make` functions below
1462 [[ $(type -t kernel-2_hook_premake) == "function" ]] && kernel-2_hook_premake
1465 0|1) kernel-2_src_prepare ;;
1468 debug-print "Doing unpack_set_extraversion"
1470 [[ -z ${K_NOSETEXTRAVERSION} ]] && unpack_set_extraversion
1471 unpack_fix_install_path
1473 # Setup xmakeopts and cd into sourcetree.
1477 # We dont need a version.h for anything other than headers
1478 # at least, I should hope we dont. If this causes problems
1479 # take out the if/fi block and inform me please.
1480 # unpack_2_6 should now be 2.6.17 safe anyways
1481 if [[ ${ETYPE} == headers ]]; then
1482 kernel_is 2 4 && unpack_2_4
1483 kernel_is 2 6 && unpack_2_6
1486 if [[ $K_DEBLOB_AVAILABLE == 1 ]] && use deblob ; then
1487 cp "${DISTDIR}/${DEBLOB_A}" "${T}" || die "cp ${DEBLOB_A} failed"
1488 cp "${DISTDIR}/${DEBLOB_CHECK_A}" "${T}/deblob-check" || die "cp ${DEBLOB_CHECK_A} failed"
1489 chmod +x "${T}/${DEBLOB_A}" "${T}/deblob-check" || die "chmod deblob scripts failed"
1492 # fix a problem on ppc where TOUT writes to /usr/src/linux breaking sandbox
1493 # only do this for kernel < 2.6.27 since this file does not exist in later
1495 if [[ -n ${KV_MINOR} && ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH} < 2.6.27 ]] ; then
1497 -e 's|TOUT := .tmp_gas_check|TOUT := $(T).tmp_gas_check|' \
1498 "${S}"/arch/ppc/Makefile
1501 -e 's|TOUT := .tmp_gas_check|TOUT := $(T).tmp_gas_check|' \
1502 "${S}"/arch/powerpc/Makefile
1506 # @FUNCTION: kernel-2_src_prepare
1509 # Apply any user patches
1511 kernel-2_src_prepare() {
1513 debug-print "Applying any user patches"
1515 # apply any user patches
1517 0|1|2|3|4|5) epatch_user ;;
1522 # @FUNCTION: kernel-2_src_compile
1525 # conpile headers or run deblob script
1527 kernel-2_src_compile() {
1529 [[ ${ETYPE} == headers ]] && compile_headers
1531 if [[ $K_DEBLOB_AVAILABLE == 1 ]] && use deblob ; then
1532 echo ">>> Running deblob script ..."
1534 sh "${T}/${DEBLOB_A}" --force || die "Deblob script failed to run!!!"
1538 # @FUNCTION: kernel-2_src_test
1541 # if you leave it to the default src_test, it will run make to
1542 # find whether test/check targets are present; since "make test"
1543 # actually produces a few support files, they are installed even
1544 # though the package is binchecks-restricted.
1546 # Avoid this altogether by making the function moot.
1547 kernel-2_src_test() { :; }
1549 # @FUNCTION: kernel-2_pkg_preinst
1551 # if ETYPE = headers, call preinst_headers
1553 kernel-2_pkg_preinst() {
1554 [[ ${ETYPE} == headers ]] && preinst_headers
1557 # @FUNCTION: kernel-2_src_install
1560 # Install headers or sources dependant on ETYPE
1562 kernel-2_src_install() {
1564 [[ ${ETYPE} == headers ]] && install_headers
1565 [[ ${ETYPE} == sources ]] && install_sources
1568 # @FUNCTION: kernel-2_pkg_postinst
1571 # call postinst_sources for ETYPE = sources
1573 kernel-2_pkg_postinst() {
1574 [[ ${ETYPE} == sources ]] && postinst_sources
1577 # @FUNCTION: kernel-2_pkg_setup
1580 # check for supported kernel version, die if ETYPE is unknown, call setup_headers
1583 kernel-2_pkg_setup() {
1584 if kernel_is 2 4; then
1585 if [[ $(gcc-major-version) -ge 4 ]] ; then
1587 ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with linux-2.4!"
1588 ewarn "Either switch to another gcc-version (via gcc-config) or use a"
1589 ewarn "newer kernel that supports gcc-4."
1591 ewarn "Also be aware that bugreports about gcc-4 not working"
1592 ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"
1599 if [[ ${ETYPE} != sources ]] && [[ ${ETYPE} != headers ]]; then
1600 eerror "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
1601 die "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
1604 [[ ${ETYPE} == headers ]] && setup_headers
1605 [[ ${ETYPE} == sources ]] && echo ">>> Preparing to unpack ..."
1608 # @FUNCTION: kernel-2_pkg_postrm
1611 # Notify the user that after a depclean, there may be sources
1612 # left behind that need to be manually cleaned
1614 kernel-2_pkg_postrm() {
1615 # This warning only makes sense for kernel sources.
1616 [[ ${ETYPE} == headers ]] && return 0
1618 # If there isn't anything left behind, then don't complain.
1619 [[ -e ${EROOT}usr/src/linux-${KV_FULL} ]] || return 0
1621 ewarn "Note: Even though you have successfully unmerged "
1622 ewarn "your kernel package, directories in kernel source location: "
1623 ewarn "${EROOT}usr/src/linux-${KV_FULL}"
1624 ewarn "with modified files will remain behind. By design, package managers"
1625 ewarn "will not remove these modified files and the directories they reside in."
1627 ewarn "For more detailed kernel removal instructions, please see: "
1628 ewarn "https://wiki.gentoo.org/wiki/Kernel/Removal"