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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.133 - (show annotations) (download)
Wed Jul 6 20:20:03 2005 UTC (13 years, 3 months ago) by agriffis
Branch: MAIN
Changes since 1.132: +1 -2 lines
Remove ECLASS= and INHERITED= which haven't been necessary for a long time now

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

  ViewVC Help
Powered by ViewVC 1.1.20