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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.73 - (hide annotations) (download)
Tue Jan 11 15:26:03 2005 UTC (14 years, 4 months ago) by johnm
Branch: MAIN
Changes since 1.72: +8 -4 lines
added wolk fix

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

  ViewVC Help
Powered by ViewVC 1.1.20