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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.91 - (hide annotations) (download)
Mon Feb 7 12:44:23 2005 UTC (14 years, 4 months ago) by johnm
Branch: MAIN
Changes since 1.90: +8 -8 lines
Adding CKV support into KV_FULL and also enabling -rc-bk support

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

  ViewVC Help
Powered by ViewVC 1.1.20