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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.79 - (hide annotations) (download)
Wed Jan 12 21:37:11 2005 UTC (14 years, 5 months ago) by eradicator
Branch: MAIN
Changes since 1.78: +7 -8 lines
Recommitting my kernel-2.eclass headers fix which uses multilib.eclass.

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

  ViewVC Help
Powered by ViewVC 1.1.20