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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.72 - (hide annotations) (download)
Tue Jan 11 15:12:17 2005 UTC (14 years, 4 months ago) by johnm
Branch: MAIN
Changes since 1.71: +152 -42 lines
Adding extra support for linux-header ebuilds

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.54 OKV=${PV/_beta/-test}
656     OKV=${OKV/_rc/-rc}
657 johnm 1.63 OKV=${OKV/_p*/}
658 johnm 1.54 OKV=${OKV/-r*/}
659 lu_zero 1.62
660 johnm 1.1 KV_MAJOR=$(echo ${OKV} | cut -d. -f1)
661     KV_MINOR=$(echo ${OKV} | cut -d. -f2)
662 johnm 1.51 KV_PATCH=$(echo ${OKV} | cut -d. -f3-)
663 lu_zero 1.62 KV_PATCH=${KV_PATCH/[-_]*/}
664    
665 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
666 lu_zero 1.62
667 johnm 1.1 RELEASE=${PV/${OKV}/}
668     RELEASE=${RELEASE/_beta/}
669     RELEASE=${RELEASE/_rc/-rc}
670 plasmaroo 1.33 if [ $(kernel_is_2_4) $? == 0 ]
671     then
672     RELEASE=${RELEASE/_pre/-pre}
673     else
674 johnm 1.54 RELEASE=${RELEASE/_pre/-bk}
675 plasmaroo 1.33 fi
676 johnm 1.1 RELEASETYPE=${RELEASE//[0-9]/}
677     EXTRAVERSION="${RELEASE}"
678 lu_zero 1.62
679 johnm 1.11 if [ -n "${K_PREPATCHED}" ]
680     then
681 johnm 1.21 EXTRAVERSION="${EXTRAVERSION}-${PN/-*/}${PR/r/}"
682 johnm 1.72 elif [ ${ETYPE} != "headers" ]
683     then
684 johnm 1.11 [ -z "${K_NOUSENAME}" ] && EXTRAVERSION="${EXTRAVERSION}-${PN/-*/}"
685 johnm 1.55 [ "${PR}" != "r0" ] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
686 johnm 1.11 fi
687 lu_zero 1.62
688 johnm 1.55 KV_FULL=${OKV}${EXTRAVERSION}
689 lu_zero 1.62
690 johnm 1.54 # -rcXX-bkXX pulls are *IMPOSSIBLE* to support within the portage naming convention
691     # these cannot be supported, but the code here can handle it up until this point
692     # and theoretically thereafter.
693 lu_zero 1.62
694 plasmaroo 1.33 if [ "${RELEASETYPE}" == "-rc" -o "${RELEASETYPE}" == "-pre" ]
695 johnm 1.1 then
696 johnm 1.54 OKV="${KV_MAJOR}.${KV_MINOR}.$([ $((${KV_PATCH} - 1)) -lt 0 ] && echo ${KV_PATCH} || echo $((${KV_PATCH} - 1)))"
697 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${PV//_/-}.bz2
698     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
699 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${PV//_/-}.bz2"
700 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
701 johnm 1.1 fi
702 lu_zero 1.62
703 johnm 1.1 if [ "${RELEASETYPE}" == "-bk" ]
704     then
705     OKV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
706     KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
707     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
708 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
709 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
710 johnm 1.1 fi
711 lu_zero 1.62
712 johnm 1.1 if [ "${RELEASETYPE}" == "-rc-bk" ]
713     then
714     OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))-${RELEASE/-bk*}"
715     EXTRAVERSION="$([ -n "${RELEASE}" ] && echo ${RELEASE/*-bk/-bk})$([ -n "${K_USENAME}" ] && echo -${PN/-*/})$([ ! "${PR}" == "r0" ] && echo -${PR})"
716 lu_zero 1.62
717 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
718     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
719 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
720 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
721 johnm 1.1 fi
722 lu_zero 1.62
723 johnm 1.55 S=${WORKDIR}/linux-${KV_FULL}
724     # we will set this for backwards compatibility.
725     KV=${KV_FULL}
726 johnm 1.1 }
727    
728 johnm 1.28 detect_arch() {
729     # This function sets ARCH_URI and ARCH_PATCH
730     # with the neccessary info for the arch sepecific compatibility
731     # patchsets.
732 lu_zero 1.62
733 johnm 1.31 local ALL_ARCH
734     local LOOP_ARCH
735     local COMPAT_URI
736 plasmaroo 1.33 local i
737    
738     # COMPAT_URI is the contents of ${ARCH}_URI
739     # ARCH_URI is the URI for all the ${ARCH}_URI patches
740     # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
741    
742     ARCH_URI=""
743     ARCH_PATCH=""
744     ALL_ARCH="X86 PPC PPC64 SPARC MIPS ALPHA ARM HPPA AMD64 IA64 X86OBSD S390"
745 johnm 1.31
746     for LOOP_ARCH in ${ALL_ARCH}
747     do
748     COMPAT_URI="${LOOP_ARCH}_URI"
749     COMPAT_URI="${!COMPAT_URI}"
750 lu_zero 1.62
751 johnm 1.55 [ -n "${COMPAT_URI}" ] && \
752     ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr '[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
753 lu_zero 1.62
754 johnm 1.54 if [ "${LOOP_ARCH}" == "$(echo ${ARCH} | tr '[:lower:]' '[:upper:]')" ]
755 plasmaroo 1.33 then
756     for i in ${COMPAT_URI}
757     do
758     ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
759     done
760     fi
761 johnm 1.31 done
762 johnm 1.28 }
763    
764 johnm 1.72 # sparc nastiness
765     #==============================================================
766     # This script generates the files in /usr/include/asm for sparc systems
767     # during installation of sys-kernel/linux-headers.
768     # Will no longer be needed when full 64 bit support is used on sparc64
769     # systems.
770     #
771     # Shamefully ripped from Debian
772     # ----------------------------------------------------------------------
773    
774     # Idea borrowed from RedHat's kernel package
775    
776     generate_sparc_asm() {
777     local name
778    
779     cd $1 || die
780     mkdir asm
781    
782     for h in `( ls asm-sparc; ls asm-sparc64 ) | grep '\.h$' | sort -u`; do
783     name="$(echo $h | tr a-z. A-Z_)"
784     # common header
785     echo "/* All asm/ files are generated and point to the corresponding
786     * file in asm-sparc or asm-sparc64.
787     */
788    
789     #ifndef __SPARCSTUB__${name}__
790     #define __SPARCSTUB__${name}__
791     " > asm/${h}
792    
793     # common for sparc and sparc64
794     if [ -f asm-sparc/$h -a -f asm-sparc64/$h ]; then
795     echo "#ifdef __arch64__
796     #include <asm-sparc64/$h>
797     #else
798     #include <asm-sparc/$h>
799     #endif
800     " >> asm/${h}
801    
802     # sparc only
803     elif [ -f asm-sparc/$h ]; then
804     echo "#ifndef __arch64__
805     #include <asm-sparc/$h>
806     #endif
807     " >> asm/${h}
808    
809     # sparc64 only
810     else
811     echo "#ifdef __arch64__
812     #include <asm-sparc64/$h>
813     #endif
814     " >> asm/${h}
815     fi
816    
817     # common footer
818     echo "#endif /* !__SPARCSTUB__${name}__ */" >> asm/${h}
819     done
820     return 0
821     }
822    
823     headers___fix() {
824     sed -i \
825     -e "s/\([ "$'\t'"]\)u8\([ "$'\t'"]\)/\1__u8\2/g;" \
826     -e "s/\([ "$'\t'"]\)u16\([ "$'\t'"]\)/\1__u16\2/g;" \
827     -e "s/\([ "$'\t'"]\)u32\([ "$'\t'"]\)/\1__u32\2/g;" \
828     -e "s/\([ "$'\t'"]\)u64\([ "$'\t'"]\)/\1__u64\2/g;" \
829     "$@"
830     }
831 johnm 1.28
832 johnm 1.1 # common functions
833     #==============================================================
834 plasmaroo 1.33 kernel-2_src_unpack() {
835 dsd 1.61 detect_version
836 johnm 1.1 universal_unpack
837 lu_zero 1.62
838 johnm 1.56 [ -n "${UNIPATCH_LIST}" -o -n "${UNIPATCH_LIST_DEFAULT}" ] && \
839     unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST}"
840 lu_zero 1.62
841 johnm 1.56 [ -z "${K_NOSETEXTRAVERSION}" ] && \
842     unpack_set_extraversion
843    
844     kernel_is 2 4 && unpack_2_4
845 johnm 1.1 }
846    
847 plasmaroo 1.33 kernel-2_src_compile() {
848 johnm 1.72 detect_version
849     cd ${S}
850 johnm 1.1 [ "${ETYPE}" == "headers" ] && compile_headers
851 johnm 1.55 [ "${ETYPE}" == "sources" ] && \
852     use doc && ! use arm && ! use s390 && compile_manpages
853 johnm 1.1 }
854    
855 plasmaroo 1.33 kernel-2_pkg_preinst() {
856 johnm 1.72 detect_version
857 johnm 1.1 [ "${ETYPE}" == "headers" ] && preinst_headers
858     }
859    
860 plasmaroo 1.33 kernel-2_src_install() {
861 johnm 1.72 detect_version
862 johnm 1.1 install_universal
863     [ "${ETYPE}" == "headers" ] && install_headers
864     [ "${ETYPE}" == "sources" ] && install_sources
865     }
866    
867 plasmaroo 1.33 kernel-2_pkg_postinst() {
868 johnm 1.72 detect_version
869 johnm 1.12 [ "${ETYPE}" == "headers" ] && postinst_headers
870 johnm 1.1 [ "${ETYPE}" == "sources" ] && postinst_sources
871     }
872 johnm 1.12
873 plasmaroo 1.33 kernel-2_pkg_setup() {
874 johnm 1.72 detect_version
875 johnm 1.12 [ "${ETYPE}" == "headers" ] && setup_headers
876 johnm 1.54
877     # This is to fix some weird portage bug? in stable versions of portage.
878     [ "${ETYPE}" == "sources" ] && echo ">>> Preparing to unpack ..."
879 johnm 1.12 }
880 johnm 1.54
881    

  ViewVC Help
Powered by ViewVC 1.1.20