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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.74 - (show annotations) (download)
Tue Jan 11 21:20:59 2005 UTC (14 years, 5 months ago) by johnm
Branch: MAIN
Changes since 1.73: +61 -3 lines
fixing cross-compile

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

  ViewVC Help
Powered by ViewVC 1.1.20