/[gentoo-x86]/eclass/kernel-2.eclass
Gentoo

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.125 - (show annotations) (download)
Sun May 15 20:30:04 2005 UTC (14 years, 1 month ago) by johnm
Branch: MAIN
Changes since 1.124: +5 -1 lines
Ignore KBUILD_OUTPUT for linux-headers. Fixes bug #92620

1 # Copyright 1999-2005 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/kernel-2.eclass,v 1.124 2005/05/09 17:20:11 plasmaroo Exp $
4
5 # Description: kernel.eclass rewrite for a clean base regarding the 2.6
6 # series of kernel with back-compatibility for 2.4
7 #
8 # Maintainer: John Mylchreest <johnm@gentoo.org>
9 # Copyright 2005 Gentoo Linux
10 #
11 # Please direct your bugs to the current eclass maintainer :)
12
13 # added functionality:
14 # unipatch - a flexible, singular method to extract, add and remove patches.
15
16 # A Couple of env vars are available to effect usage of this eclass
17 # These are as follows:
18 #
19 # K_USEPV - When setting the EXTRAVERSION variable, it should
20 # add PV to the end.
21 # this is useful for thigns like wolk. IE:
22 # EXTRAVERSION would be something like : -wolk-4.19-r1
23 # K_NOSETEXTRAVERSION - if this is set then EXTRAVERSION will not be
24 # automatically set within the kernel Makefile
25 # K_NOUSENAME - if this is set then EXTRAVERSION will not include the
26 # first part of ${PN} in EXTRAVERSION
27 # K_PREPATCHED - if the patchset is prepatched (ie: mm-sources,
28 # ck-sources, ac-sources) it will use PR (ie: -r5) as
29 # the patchset version for
30 # and not use it as a true package revision
31 # K_EXTRAEINFO - this is a new-line seperated list of einfo displays in
32 # postinst and can be used to carry additional postinst
33 # messages
34 # K_EXTRAEWARN - same as K_EXTRAEINFO except ewarn's instead of einfo's
35 # K_SYMLINK - if this is set, then forcably create symlink anyway
36 #
37 # K_DEFCONFIG - Allow specifying a different defconfig target.
38 # If length zero, defaults to "defconfig".
39
40 # H_SUPPORTEDARCH - this should be a space separated list of ARCH's which
41 # can be supported by the headers ebuild
42
43 # UNIPATCH_LIST - space delimetered list of patches to be applied to the
44 # kernel
45 # UNIPATCH_EXCLUDE - an addition var to support exlusion based completely
46 # on "<passedstring>*" and not "<passedno#>_*"
47 # - this should _NOT_ be used from the ebuild as this is
48 # reserved for end users passing excludes from the cli
49 # UNIPATCH_DOCS - space delimemeted list of docs to be installed to
50 # the doc dir
51 # UNIPATCH_STRICTORDER - if this is set places patches into directories of
52 # order, so they are applied in the order passed
53
54 inherit toolchain-funcs versionator multilib
55 ECLASS="kernel-2"
56 INHERITED="$INHERITED $ECLASS"
57 EXPORT_FUNCTIONS pkg_setup src_unpack src_compile src_install \
58 pkg_preinst pkg_postinst
59
60 export CTARGET=${CTARGET:-${CHOST}}
61 if [[ ${CTARGET} == ${CHOST} && ${CATEGORY/cross-} != ${CATEGORY} ]]; then
62 export CTARGET=${CATEGORY/cross-}
63 fi
64
65 HOMEPAGE="http://www.kernel.org/ http://www.gentoo.org/"
66 LICENSE="GPL-2"
67
68 # set LINUX_HOSTCFLAGS if not already set
69 [ -z "$LINUX_HOSTCFLAGS" ] && \
70 LINUX_HOSTCFLAGS="-Wall -Wstrict-prototypes -Os -fomit-frame-pointer -I${S}/include"
71
72 #Eclass functions only from here onwards ...
73 #==============================================================
74 detect_version() {
75 # this function will detect and set
76 # - OKV: Original Kernel Version (2.6.0/2.6.0-test11)
77 # - KV: Kernel Version (2.6.0-gentoo/2.6.0-test11-gentoo-r1)
78 # - EXTRAVERSION: The additional version appended to OKV (-gentoo/-gentoo-r1)
79
80 if [[ -n ${KV_FULL} ]]; then
81 # we will set this for backwards compatibility.
82 KV=${KV_FULL}
83
84 # we know KV_FULL so lets stop here. but not without resetting S
85 S=${WORKDIR}/linux-${KV_FULL}
86 return
87 fi
88
89 # CKV is used as a comparison kernel version, which is used when
90 # PV doesnt reflect the genuine kernel version.
91 # this gets set to the portage style versioning. ie:
92 # CKV=2.6.11_rc4
93 CKV=${CKV:-${PV}}
94 OKV=${OKV:-${CKV}}
95 OKV=${OKV/_beta/-test}
96 OKV=${OKV/_rc/-rc}
97 OKV=${OKV/-r*}
98 OKV=${OKV/_p*}
99
100 KV_MAJOR=$(get_version_component_range 1 ${OKV})
101 KV_MINOR=$(get_version_component_range 2 ${OKV})
102 KV_PATCH=$(get_version_component_range 3 ${OKV})
103
104 if [[ ${KV_MAJOR}${KV_MINOR}${KV_PATCH} -ge 269 ]]; then
105 KV_EXTRA=$(get_version_component_range 4- ${OKV})
106 KV_EXTRA=${KV_EXTRA/[-_]*}
107 else
108 KV_PATCH=$(get_version_component_range 3- ${OKV})
109 fi
110 KV_PATCH=${KV_PATCH/[-_]*}
111
112 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
113
114 RELEASE=${CKV/${OKV}}
115 RELEASE=${RELEASE/_beta}
116 RELEASE=${RELEASE/_rc/-rc}
117 RELEASE=${RELEASE/_pre/-pre}
118 kernel_is ge 2 6 && RELEASE=${RELEASE/-pre/-bk}
119 RELEASETYPE=${RELEASE//[0-9]}
120
121 # Now we know that RELEASE is the -rc/-bk
122 # and RELEASETYPE is the same but with its numerics stripped
123 # we can work on better sorting EXTRAVERSION.
124 # first of all, we add the release
125 EXTRAVERSION="${RELEASE}"
126 [[ -n ${KV_EXTRA} ]] && EXTRAVERSION=".${KV_EXTRA}${EXTRAVERSION}"
127
128 if [[ -n ${K_PREPATCHED} ]]; then
129 EXTRAVERSION="${EXTRAVERSION}-${PN/-*}${PR/r}"
130 elif [[ "${ETYPE}" = "sources" ]]; then
131 # For some sources we want to use the PV in the extra version
132 # This is because upstream releases with a completely different
133 # versioning scheme.
134 case ${PN/-*} in
135 wolk) K_USEPV=1;;
136 vserver) K_USEPV=1;;
137 esac
138
139 [[ -z ${K_NOUSENAME} ]] && EXTRAVERSION="${EXTRAVERSION}-${PN/-*}"
140 [[ -n ${K_USEPV} ]] && EXTRAVERSION="${EXTRAVERSION}-${PV//_/-}"
141 [[ -n ${PR//r0} ]] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
142 fi
143
144 # The only messing around which should actually effect this is for KV_EXTRA
145 # since this has to limit OKV to MAJ.MIN.PAT and strip EXTRA off else
146 # KV_FULL evaluates to MAJ.MIN.PAT.EXT.EXT after EXTRAVERSION
147 if [[ -n ${KV_EXTRA} ]]; then
148 OKV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
149 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/patch-${CKV}.bz2
150 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.tar.bz2"
151 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV}.bz2"
152 fi
153
154 # We need to set this using OKV, but we need to set it before we do any
155 # messing around with OKV based on RELEASETYPE
156 KV_FULL=${OKV}${EXTRAVERSION}
157
158 # we will set this for backwards compatibility.
159 S=${WORKDIR}/linux-${KV_FULL}
160 KV=${KV_FULL}
161
162 # -rc-bk pulls can be achieved by specifying CKV
163 # for example:
164 # CKV="2.6.11_rc3_pre2"
165 # will pull:
166 # linux-2.6.10.tar.bz2 & patch-2.6.11-rc3.bz2 & patch-2.6.11-rc3-bk2.bz2
167
168 if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; then
169 OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
170 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${CKV//_/-}.bz2
171 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
172 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.bz2"
173 fi
174
175 if [[ ${RELEASETYPE} == -bk ]]; then
176 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${OKV}${RELEASE}.bz2
177 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
178 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.bz2"
179 fi
180
181 if [[ ${RELEASETYPE} == -rc-bk ]]; then
182 OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
183 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
184 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-bk*}.bz2
185 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
186 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-bk*}.bz2 ${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
187 fi
188 }
189
190 kernel_is() {
191 [[ -z ${OKV} ]] && detect_version
192 local operator test value x=0 y=0 z=0
193
194 case ${1} in
195 lt) operator="-lt"; shift;;
196 gt) operator="-gt"; shift;;
197 le) operator="-le"; shift;;
198 ge) operator="-ge"; shift;;
199 eq) operator="-eq"; shift;;
200 *) operator="-eq";;
201 esac
202
203 for x in ${@}; do
204 for((y=0; y<$((3 - ${#x})); y++)); do value="${value}0"; done
205 value="${value}${x}"
206 z=$((${z} + 1))
207
208 case ${z} in
209 1) for((y=0; y<$((3 - ${#KV_MAJOR})); y++)); do test="${test}0"; done;
210 test="${test}${KV_MAJOR}";;
211 2) for((y=0; y<$((3 - ${#KV_MINOR})); y++)); do test="${test}0"; done;
212 test="${test}${KV_MINOR}";;
213 3) for((y=0; y<$((3 - ${#KV_PATCH})); y++)); do test="${test}0"; done;
214 test="${test}${KV_PATCH}";;
215 *) die "Error in kernel-2_kernel_is(): Too many parameters.";;
216 esac
217 done
218
219 [ ${test} ${operator} ${value} ] && return 0 || return 1
220 }
221
222 kernel_is_2_4() {
223 kernel_is 2 4
224 }
225
226 kernel_is_2_6() {
227 kernel_is 2 6 || kernel_is 2 5
228 }
229
230 kernel_header_destdir() {
231 [[ ${CTARGET} == ${CHOST} ]] \
232 && echo /usr/include \
233 || echo /usr/${CTARGET}/include
234 }
235
236 # Capture the sources type and set DEPENDs
237 if [[ ${ETYPE} == sources ]]; then
238 DEPEND="!build? ( sys-apps/sed
239 >=sys-devel/binutils-2.11.90.0.31 )
240 doc? ( app-text/docbook-sgml-utils )"
241 RDEPEND="${DEPEND}
242 !build? ( >=sys-libs/ncurses-5.2
243 sys-devel/make )"
244
245 PROVIDE="virtual/linux-sources"
246 kernel_is gt 2 4 && PROVIDE="${PROVIDE} virtual/alsa"
247 SLOT="${PVR}"
248 DESCRIPTION="Sources for the Linux kernel"
249 IUSE="${IUSE} symlink build doc"
250 elif [[ ${ETYPE} == headers ]]; then
251 DESCRIPTION="Linux system headers"
252 IUSE="${IUSE}"
253
254 if [[ ${CTARGET} = ${CHOST} ]]; then
255 DEPEND="!virtual/os-headers"
256 PROVIDE="virtual/kernel virtual/os-headers"
257 SLOT="0"
258 else
259 SLOT="${CTARGET}"
260 fi
261 else
262 eerror "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
263 die "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
264 fi
265
266 # Unpack functions
267 #==============================================================
268 unpack_2_4() {
269 # Kernel ARCH != portage ARCH
270 local ARCH=$(tc-arch-kernel)
271
272 cd ${S}
273 # this file is required for other things to build properly,
274 # so we autogenerate it
275 make mrproper || die "make mrproper died"
276 make include/linux/version.h || die "make include/linux/version.h failed"
277 echo ">>> version.h compiled successfully."
278
279 ARCH=$(tc-arch)
280 }
281
282 universal_unpack() {
283 cd ${WORKDIR}
284 unpack linux-${OKV}.tar.bz2
285 if [[ "${OKV}" != "${KV_FULL}" ]]; then
286 mv linux-${OKV} linux-${KV_FULL} \
287 || die "Unable to move source tree to ${KV_FULL}."
288 fi
289 cd ${S}
290
291 # remove all backup files
292 find . -iname "*~" -exec rm {} \; 2> /dev/null
293
294 # fix a problem on ppc where TOUT writes to /usr/src/linux breaking sandbox
295 use ppc && \
296 sed -ie 's|TOUT := .tmp_gas_check|TOUT := $(T).tmp_gas_check|' \
297 ${S}/arch/ppc/Makefile
298 }
299
300 unpack_set_extraversion() {
301 cd ${S}
302 sed -i -e "s:^\(EXTRAVERSION =\).*:\1 ${EXTRAVERSION}:" Makefile
303 cd ${OLDPWD}
304 }
305
306 # Should be done after patches have been applied
307 # Otherwise patches that modify the same area of Makefile will fail
308 unpack_fix_install_path() {
309 cd ${S}
310 sed -i -e 's:#export\tINSTALL_PATH:export\tINSTALL_PATH:' Makefile
311 }
312
313 unpack_fix_docbook() {
314 if [[ -d ${S}/Documentation/DocBook ]]; then
315 cd ${S}/Documentation/DocBook
316 sed -ie "s:db2:docbook2:g" Makefile
317 cd ${OLDPWD}
318 fi
319 }
320
321 # Compile Functions
322 #==============================================================
323 compile_headers() {
324 # Since KBUILD_OUTPUT shouldnt be used when compiling headers, lets unset it
325 # if it exists.
326 [[ -n ${KBUILD_OUTPUT} ]] && unset KBUILD_OUTPUT
327
328 # if we couldnt obtain HOSTCFLAGS from the Makefile,
329 # then set it to something sane
330 local HOSTCFLAGS=$(getfilevar HOSTCFLAGS ${S}/Makefile)
331 HOSTCFLAGS=${HOSTCFLAGS:--Wall -Wstrict-prototypes -O2 -fomit-frame-pointer}
332
333 # Kernel ARCH != portage ARCH
334 local KARCH=$(tc-arch-kernel)
335
336 # When cross-compiling, we need to set the ARCH/CROSS_COMPILE
337 # variables properly or bad things happen !
338 local xmakeopts="ARCH=${KARCH}"
339 if [[ ${CTARGET} != ${CHOST} ]]; then
340 xmakeopts="${xmakeopts} CROSS_COMPILE=${CTARGET}-"
341 elif type -p ${CHOST}-ar; then
342 xmakeopts="${xmakeopts} CROSS_COMPILE=${CHOST}-"
343 fi
344
345 if kernel_is 2 4; then
346 yes "" | make oldconfig ${xmakeopts}
347 echo ">>> make oldconfig complete"
348 use sparc && make dep ${xmakeopts}
349 elif kernel_is 2 6; then
350 # autoconf.h isnt generated unless it already exists. plus, we have
351 # no guarantee that any headers are installed on the system...
352 [[ -f ${ROOT}/usr/include/linux/autoconf.h ]] \
353 || touch include/linux/autoconf.h
354
355 # if K_DEFCONFIG isn't set, force to "defconfig"
356 # needed by mips
357 if [[ -z ${K_DEFCONFIG} ]]; then
358 K_DEFCONFIG="defconfig"
359 fi
360
361 # if there arent any installed headers, then there also isnt an asm
362 # symlink in /usr/include/, and make defconfig will fail, so we have
363 # to force an include path with $S.
364 HOSTCFLAGS="${HOSTCFLAGS} -I${S}/include/"
365 ln -sf asm-${KARCH} "${S}"/include/asm
366 make ${K_DEFCONFIG} HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "defconfig failed"
367 make prepare HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
368 make prepare-all HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
369 fi
370 }
371
372 compile_manpages() {
373 einfo "Making manpages ..."
374 env -u ARCH make mandocs
375 }
376
377 # install functions
378 #==============================================================
379 install_universal() {
380 #fix silly permissions in tarball
381 cd ${WORKDIR}
382 chown -R root:root *
383 chmod -R a+r-w+X,u+w *
384 cd ${OLDPWD}
385 }
386
387 install_headers() {
388 local ddir=$(kernel_header_destdir)
389
390 cd ${S}
391 dodir ${ddir}/linux
392 cp -ax ${S}/include/linux/* ${D}/${ddir}/linux
393 rm -rf ${D}/${ddir}/linux/modules
394
395 # Handle multilib headers
396 case $(tc-arch-kernel) in
397 sparc64)
398 dodir ${ddir}/asm-sparc
399 cp -ax ${S}/include/asm-sparc/* ${D}/${ddir}/asm-sparc
400
401 dodir ${ddir}/asm-sparc64
402 cp -ax ${S}/include/asm-sparc64/* ${D}/${ddir}/asm-sparc64
403
404 create_ml_includes ${ddir}/asm !__arch64__:${ddir}/asm-sparc __arch64__:${ddir}/asm-sparc64
405 ;;
406 x86_64)
407 dodir ${ddir}/asm-i386
408 cp -ax ${S}/include/asm-i386/* ${D}/${ddir}/asm-i386
409
410 dodir ${ddir}/asm-x86_64
411 cp -ax ${S}/include/asm-x86_64/* ${D}/${ddir}/asm-x86_64
412
413 create_ml_includes ${ddir}/asm __i386__:${ddir}/asm-i386 __x86_64__:${ddir}/asm-x86_64
414 ;;
415 arm)
416 dodir ${ddir}/asm
417 cp -ax ${S}/include/asm/* ${D}/${ddir}/asm
418 [[ ! -e ${D}/${ddir}/asm/arch ]] && ln -s arch-ebsa285 ${D}/${ddir}/asm/arch
419 [[ ! -e ${D}/${ddir}/asm/proc ]] && ln -s proc-armv ${D}/${ddir}/asm/proc
420 ;;
421 *)
422 dodir ${ddir}/asm
423 cp -ax ${S}/include/asm/* ${D}/${ddir}/asm
424 ;;
425 esac
426
427 if kernel_is 2 6; then
428 dodir ${ddir}/asm-generic
429 cp -ax ${S}/include/asm-generic/* ${D}/${ddir}/asm-generic
430 fi
431
432 # clean up
433 find "${D}" -name '*.orig' -exec rm -f {} \;
434
435 cd ${OLDPWD}
436 }
437
438 install_sources() {
439 local doc docs file
440
441 cd ${S}
442 dodir /usr/src
443 echo ">>> Copying sources ..."
444
445 file="$(find ${WORKDIR} -iname "docs" -type d)"
446 if [[ -n ${file} ]]; then
447 for file in $(find ${file} -type f); do
448 echo "${file//*docs\/}" >> ${S}/patches.txt
449 echo "===================================================" >> ${S}/patches.txt
450 cat ${file} >> ${S}/patches.txt
451 echo "===================================================" >> ${S}/patches.txt
452 echo "" >> ${S}/patches.txt
453 done
454 fi
455
456 if [[ ! -f ${S}/patches.txt ]]; then
457 # patches.txt is empty so lets use our ChangeLog
458 [[ -f ${FILESDIR}/../ChangeLog ]] && \
459 echo "Please check the ebuild ChangeLog for more details." \
460 > ${S}/patches.txt
461 fi
462
463 for doc in ${UNIPATCH_DOCS}; do [[ -f ${doc} ]] && docs="${docs} ${doc}"; done
464 if [[ -f ${S}/patches.txt ]]; then docs="${docs} ${S}/patches.txt"; fi
465 use doc && ! use arm && ! use s390 && install_manpages
466 dodoc ${docs}
467
468 mv ${WORKDIR}/linux* ${D}/usr/src
469 }
470
471 install_manpages() {
472 kernel_is lt 2 5 && return
473 sed -ie "s#/usr/local/man#${D}/usr/man#g" scripts/makeman
474 ebegin "Installing manpages"
475 env -u ARCH make installmandocs
476 eend $?
477 sed -ie "s#${D}/usr/man#/usr/local/man#g" scripts/makeman
478 }
479
480 # pkg_preinst functions
481 #==============================================================
482 preinst_headers() {
483 local ddir=$(kernel_header_destdir)
484 [[ -L ${ddir}/linux ]] && rm ${ddir}/linux
485 [[ -L ${ddir}/asm ]] && rm ${ddir}/asm
486 }
487
488 # pkg_postinst functions
489 #==============================================================
490 postinst_sources() {
491 local MAKELINK=0
492
493 # if we have USE=symlink, then force K_SYMLINK=1
494 use symlink && K_SYMLINK=1
495
496 # if we are to forcably symlink, delete it if it already exists first.
497 if [[ -n ${K_SYMLINK} ]]; then
498 [[ -h ${ROOT}usr/src/linux ]] && rm ${ROOT}usr/src/linux
499 MAKELINK=1
500 fi
501
502 # if the link doesnt exist, lets create it
503 [[ ! -h ${ROOT}usr/src/linux ]] && MAKELINK=1
504
505 if [[ ${MAKELINK} == 1 ]]; then
506 cd ${ROOT}usr/src
507 ln -sf linux-${KV_FULL} linux
508 cd ${OLDPWD}
509 fi
510
511 # Don't forget to make directory for sysfs
512 [[ ! -d ${ROOT}sys ]] && kernel_is 2 6 && mkdir ${ROOT}sys
513
514 echo
515 einfo "After installing a new kernel of any version, it is important"
516 einfo "that you have the appropriate /etc/modules.autoload.d/kernel-X.Y"
517 einfo "created (X.Y is the first 2 parts of your new kernel version)"
518 echo
519 einfo "For example, this kernel will require:"
520 einfo "/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}"
521 echo
522 einfo "If you are upgrading from a previous kernel, you may be interested"
523 einfo "in the following documents:"
524 einfo " - General upgrade guide: http://www.gentoo.org/doc/en/kernel-upgrade.xml"
525 kernel_is_2_6 && einfo " - 2.4 to 2.6 migration guide: http://www.gentoo.org/doc/en/migration-to-2.6.xml"
526 echo
527
528 # if K_EXTRAEINFO is set then lets display it now
529 if [[ -n ${K_EXTRAEINFO} ]]; then
530 echo ${K_EXTRAEINFO} | fmt |
531 while read -s ELINE; do einfo "${ELINE}"; done
532 fi
533
534 # if K_EXTRAEWARN is set then lets display it now
535 if [[ -n ${K_EXTRAEWARN} ]]; then
536 echo ${K_EXTRAEWARN} | fmt |
537 while read -s ELINE; do ewarn "${ELINE}"; done
538 fi
539 }
540
541 postinst_headers() {
542 einfo "Kernel headers are usually only used when recompiling glibc, as such, following the installation"
543 einfo "of newer headers, it is advised that you re-merge glibc as follows:"
544 einfo "emerge glibc"
545 einfo "Failure to do so will cause glibc to not make use of newer features present in the updated kernel"
546 einfo "headers."
547 }
548
549 # pkg_setup functions
550 #==============================================================
551 setup_headers() {
552 [[ -z ${H_SUPPORTEDARCH} ]] && H_SUPPORTEDARCH=${PN/-*/}
553 for i in ${H_SUPPORTEDARCH}; do
554 [[ $(tc-arch) == "${i}" ]] && H_ACCEPT_ARCH="yes"
555 done
556
557 if [[ ${H_ACCEPT_ARCH} != "yes" ]]; then
558 echo
559 eerror "This version of ${PN} does not support $(tc-arch)."
560 eerror "Please merge the appropriate sources, in most cases"
561 eerror "(but not all) this will be called $(tc-arch)-headers."
562 die "Package unsupported for $(tc-arch)"
563 fi
564 }
565
566 # unipatch
567 #==============================================================
568 unipatch() {
569 local i x y z extention PIPE_CMD UNIPATCH_DROP KPATCH_DIR PATCH_DEPTH ELINE
570 local STRICT_COUNT PATCH_LEVEL myLC_ALL myLANG
571
572 # set to a standard locale to ensure sorts are ordered properly.
573 myLC_ALL="${LC_ALL}"
574 myLANG="${LANG}"
575 LC_ALL="C"
576 LANG=""
577
578 [ -z "${KPATCH_DIR}" ] && KPATCH_DIR="${WORKDIR}/patches/"
579 [ ! -d ${KPATCH_DIR} ] && mkdir -p ${KPATCH_DIR}
580
581 # We're gonna need it when doing patches with a predefined patchlevel
582 shopt -s extglob
583
584 # This function will unpack all passed tarballs, add any passed patches, and remove any passed patchnumbers
585 # usage can be either via an env var or by params
586 # although due to the nature we pass this within this eclass
587 # it shall be by param only.
588 # -z "${UNIPATCH_LIST}" ] && UNIPATCH_LIST="${@}"
589 UNIPATCH_LIST="${@}"
590
591 #unpack any passed tarballs
592 for i in ${UNIPATCH_LIST}; do
593 if [ -n "$(echo ${i} | grep -e "\.tar" -e "\.tbz" -e "\.tgz")" ]; then
594 extention=${i/*./}
595 extention=${extention/:*/}
596 case ${extention} in
597 tbz2) PIPE_CMD="tar -xvjf";;
598 bz2) PIPE_CMD="tar -xvjf";;
599 tgz) PIPE_CMD="tar -xvzf";;
600 gz) PIPE_CMD="tar -xvzf";;
601 *) eerror "Unrecognized tarball compression"
602 die "Unrecognized tarball compression";;
603 esac
604
605 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
606 unset z
607 STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
608 for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
609 do z="${z}0";
610 done
611 PATCH_ORDER="${z}${STRICT_COUNT}"
612
613 mkdir -p ${KPATCH_DIR}/${PATCH_ORDER}/
614 ${PIPE_CMD} ${i/:*/} -C ${KPATCH_DIR}/${PATCH_ORDER}/ 1>/dev/null
615 else
616 ${PIPE_CMD} ${i/:*/} -C ${KPATCH_DIR} 1>/dev/null
617 fi
618
619 if [ $? == 0 ]; then
620 einfo "${i/*\//} unpacked"
621 [ -n "$(echo ${i} | grep ':')" ] && echo ">>> Strict patch levels not currently supported for tarballed patchsets"
622 else
623 eerror "Failed to unpack ${i/:*/}"
624 die "unable to unpack patch tarball"
625 fi
626 else
627 extention=${i/*./}
628 extention=${extention/:*/}
629 PIPE_CMD=""
630 case ${extention} in
631 bz2) PIPE_CMD="bzip2 -dc";;
632 patch) PIPE_CMD="cat";;
633 diff) PIPE_CMD="cat";;
634 gz|Z|z) PIPE_CMD="gzip -dc";;
635 ZIP|zip) PIPE_CMD="unzip -p";;
636 *) UNIPATCH_DROP="${UNIPATCH_DROP} ${i/:*/}";;
637 esac
638
639 PATCH_LEVEL=${i/*([^:])?(:)}
640 i=${i/:*/}
641 x=${i/*\//}
642 x=${x/\.${extention}/}
643
644 if [ -n "${PIPE_CMD}" ]; then
645 if [ ! -r "${i}" ]; then
646 echo
647 eerror "FATAL: unable to locate:"
648 eerror "${i}"
649 eerror "for read-only. The file either has incorrect permissions"
650 eerror "or does not exist."
651 die Unable to locate ${i}
652 fi
653
654 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
655 unset z
656 STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
657 for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
658 do z="${z}0";
659 done
660 PATCH_ORDER="${z}${STRICT_COUNT}"
661
662 mkdir -p ${KPATCH_DIR}/${PATCH_ORDER}/
663 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${PATCH_ORDER}/${x}.patch${PATCH_LEVEL})
664 else
665 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${x}.patch${PATCH_LEVEL})
666 fi
667 fi
668 fi
669 done
670
671 #populate KPATCH_DIRS so we know where to look to remove the excludes
672 x=${KPATCH_DIR}
673 KPATCH_DIR=""
674 for i in $(find ${x} -type d | sort -n); do
675 KPATCH_DIR="${KPATCH_DIR} ${i}"
676 done
677
678 #so now lets get rid of the patchno's we want to exclude
679 UNIPATCH_DROP="${UNIPATCH_EXCLUDE} ${UNIPATCH_DROP}"
680 for i in ${UNIPATCH_DROP}; do
681 ebegin "Excluding Patch #${i}"
682 for x in ${KPATCH_DIR}; do rm -f ${x}/${i}* 2>/dev/null; done
683 eend $?
684 done
685
686 # and now, finally, we patch it :)
687 for x in ${KPATCH_DIR}; do
688 for i in $(find ${x} -maxdepth 1 -iname "*.patch*" -or -iname "*.diff*" | sort -n); do
689 STDERR_T="${T}/${i/*\//}"
690 STDERR_T="${STDERR_T/.patch*/.err}"
691
692 [ -z ${i/*.patch*/} ] && PATCH_DEPTH=${i/*.patch/}
693 #[ -z ${i/*.diff*/} ] && PATCH_DEPTH=${i/*.diff/}
694
695 if [ -z "${PATCH_DEPTH}" ]; then PATCH_DEPTH=0; fi
696
697 ebegin "Applying ${i/*\//} (-p${PATCH_DEPTH}+)"
698 while [ ${PATCH_DEPTH} -lt 5 ]; do
699 echo "Attempting Dry-run:" >> ${STDERR_T}
700 echo "cmd: patch -p${PATCH_DEPTH} --dry-run -f < ${i}" >> ${STDERR_T}
701 echo "=======================================================" >> ${STDERR_T}
702 if [ $(patch -p${PATCH_DEPTH} --dry-run -f < ${i} >> ${STDERR_T}) $? -eq 0 ]; then
703 echo "Attempting patch:" > ${STDERR_T}
704 echo "cmd: patch -p${PATCH_DEPTH} -f < ${i}" >> ${STDERR_T}
705 echo "=======================================================" >> ${STDERR_T}
706 if [ $(patch -p${PATCH_DEPTH} -f < ${i} >> ${STDERR_T}) "$?" -eq 0 ]; then
707 eend 0
708 rm ${STDERR_T}
709 break
710 else
711 eend 1
712 eerror "Failed to apply patch ${i/*\//}"
713 eerror "Please attach ${STDERR_T} to any bug you may post."
714 die "Failed to apply ${i/*\//}"
715 fi
716 else
717 PATCH_DEPTH=$((${PATCH_DEPTH} + 1))
718 fi
719 done
720 if [ ${PATCH_DEPTH} -eq 5 ]; then
721 eend 1
722 eerror "Please attach ${STDERR_T} to any bug you may post."
723 die "Unable to dry-run patch."
724 fi
725 done
726 done
727
728 # clean up KPATCH_DIR's - fixes bug #53610
729 for x in ${KPATCH_DIR}; do rm -Rf ${x}; done
730
731 LC_ALL="${myLC_ALL}"
732 LANG="${myLANG}"
733 }
734
735 # getfilevar accepts 2 vars as follows:
736 # getfilevar <VARIABLE> <CONFIGFILE>
737 # pulled from linux-info
738
739 getfilevar() {
740 local workingdir basefname basedname xarch=$(tc-arch-kernel)
741
742 if [[ -z ${1} ]] && [[ ! -f ${2} ]]; then
743 echo -e "\n"
744 eerror "getfilevar requires 2 variables, with the second a valid file."
745 eerror " getfilevar <VARIABLE> <CONFIGFILE>"
746 else
747 workingdir=${PWD}
748 basefname=$(basename ${2})
749 basedname=$(dirname ${2})
750 unset ARCH
751
752 cd ${basedname}
753 echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
754 make ${BUILD_FIXES} -s -f - e 2>/dev/null
755 cd ${workingdir}
756
757 ARCH=${xarch}
758 fi
759 }
760
761 detect_arch() {
762 # This function sets ARCH_URI and ARCH_PATCH
763 # with the neccessary info for the arch sepecific compatibility
764 # patchsets.
765
766 local ALL_ARCH LOOP_ARCH COMPAT_URI i
767
768 # COMPAT_URI is the contents of ${ARCH}_URI
769 # ARCH_URI is the URI for all the ${ARCH}_URI patches
770 # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
771
772 ARCH_URI=""
773 ARCH_PATCH=""
774 ALL_ARCH="X86 PPC PPC64 SPARC MIPS ALPHA ARM HPPA AMD64 IA64 X86OBSD S390 SH"
775
776 for LOOP_ARCH in ${ALL_ARCH}; do
777 COMPAT_URI="${LOOP_ARCH}_URI"
778 COMPAT_URI="${!COMPAT_URI}"
779
780 [[ -n ${COMPAT_URI} ]] && \
781 ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr '[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
782
783 if [[ ${LOOP_ARCH} == "$(echo $(tc-arch-kernel) | tr '[:lower:]' '[:upper:]')" ]]; then
784 for i in ${COMPAT_URI}; do
785 ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
786 done
787 fi
788 done
789 }
790
791 # sparc nastiness
792 #==============================================================
793 # This script generates the files in /usr/include/asm for sparc systems
794 # during installation of sys-kernel/linux-headers.
795 # Will no longer be needed when full 64 bit support is used on sparc64
796 # systems.
797 #
798 # Shamefully ripped from Debian
799 # ----------------------------------------------------------------------
800
801 # Idea borrowed from RedHat's kernel package
802
803 # This is gonna get replaced by something in multilib.eclass soon...
804 # --eradicator
805 generate_sparc_asm() {
806 local name
807
808 cd $1 || die
809 mkdir asm
810
811 for h in `( ls asm-sparc; ls asm-sparc64 ) | grep '\.h$' | sort -u`; do
812 name="$(echo $h | tr a-z. A-Z_)"
813 # common header
814 echo "/* All asm/ files are generated and point to the corresponding
815 * file in asm-sparc or asm-sparc64.
816 */
817
818 #ifndef __SPARCSTUB__${name}__
819 #define __SPARCSTUB__${name}__
820 " > asm/${h}
821
822 # common for sparc and sparc64
823 if [ -f asm-sparc/$h -a -f asm-sparc64/$h ]; then
824 echo "#ifdef __arch64__
825 #include <asm-sparc64/$h>
826 #else
827 #include <asm-sparc/$h>
828 #endif
829 " >> asm/${h}
830
831 # sparc only
832 elif [ -f asm-sparc/$h ]; then
833 echo "#ifndef __arch64__
834 #include <asm-sparc/$h>
835 #endif
836 " >> asm/${h}
837
838 # sparc64 only
839 else
840 echo "#ifdef __arch64__
841 #include <asm-sparc64/$h>
842 #endif
843 " >> asm/${h}
844 fi
845
846 # common footer
847 echo "#endif /* !__SPARCSTUB__${name}__ */" >> asm/${h}
848 done
849 return 0
850 }
851
852 headers___fix() {
853 # Voodoo to partially fix broken upstream headers.
854 # Issues with this function should go to plasmaroo.
855 sed -i \
856 -e "s/\([ "$'\t'"]\)\(u\|s\)\(8\|16\|32\|64\)\([ "$'\t'"]\)/\1__\2\3\4/g;" \
857 -e 's/ \(u\|s\)\(8\|16\|32\|64\)$/ __\1\2/g' \
858 -e 's/\([(, ]\)\(u\|s\)64\([, )]\)/\1__\264\3/g' \
859 -e "s/^\(u\|s\)\(8\|16\|32\|64\)\([ "$'\t'"]\)/__\1\2\3/g;" \
860 "$@"
861 }
862
863 # common functions
864 #==============================================================
865 kernel-2_src_unpack() {
866 universal_unpack
867
868 [[ -n ${UNIPATCH_LIST} ]] || [[ -n ${UNIPATCH_LIST_DEFAULT} ]] && \
869 unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST}"
870
871 [[ -z ${K_NOSETEXTRAVERSION} ]] && unpack_set_extraversion
872 unpack_fix_docbook
873 unpack_fix_install_path
874
875 kernel_is 2 4 && unpack_2_4
876 }
877
878 kernel-2_src_compile() {
879 cd ${S}
880 [[ ${ETYPE} == headers ]] && compile_headers
881 [[ ${ETYPE} == sources ]] && \
882 use doc && ! use arm && ! use s390 && compile_manpages
883 }
884
885 kernel-2_pkg_preinst() {
886 [[ ${ETYPE} == headers ]] && preinst_headers
887 }
888
889 kernel-2_src_install() {
890 install_universal
891 [[ ${ETYPE} == headers ]] && install_headers
892 [[ ${ETYPE} == sources ]] && install_sources
893 }
894
895 kernel-2_pkg_postinst() {
896 [[ ${ETYPE} == headers ]] && postinst_headers
897 [[ ${ETYPE} == sources ]] && postinst_sources
898 }
899
900 kernel-2_pkg_setup() {
901 [[ ${ETYPE} == headers ]] && setup_headers
902 [[ ${ETYPE} == sources ]] && echo ">>> Preparing to unpack ..."
903 }

  ViewVC Help
Powered by ViewVC 1.1.20