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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.88 - (hide annotations) (download)
Mon Jan 31 19:14:55 2005 UTC (14 years, 4 months ago) by plasmaroo
Branch: MAIN
Changes since 1.87: +8 -2 lines
Improve headers___fix($f) voodoo a bit more; should now iron out any remaining asm-ia64/* bugs as all instances of [us](8|16|32|64) should now be picked up including the obscure ones such as (u64, u64) etc.

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 plasmaroo 1.88 # $Header: /var/cvsroot/gentoo-x86/eclass/kernel-2.eclass,v 1.87 2005/01/24 23:19:34 vapier 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 vapier 1.80 [[ ${MAKELINK} == 1 ]] && \
398 johnm 1.55 ln -sf ${ROOT}usr/src/linux-${KV_FULL} ${ROOT}usr/src/linux
399 johnm 1.1
400     # Don't forget to make directory for sysfs
401 johnm 1.78 [ ! -d "${ROOT}/sys" -a kernel_is_2_6 ] && mkdir /sys
402 johnm 1.1
403     echo
404     einfo "After installing a new kernel of any version, it is important"
405     einfo "that you have the appropriate /etc/modules.autoload.d/kernel-X.Y"
406     einfo "created (X.Y is the first 2 parts of your new kernel version)"
407     echo
408     einfo "For example, this kernel will require:"
409     einfo "/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}"
410     echo
411 lu_zero 1.62
412 johnm 1.2 # if K_EXTRAEINFO is set then lets display it now
413 vapier 1.80 if [[ -n ${K_EXTRAEINFO} ]] ; then
414 johnm 1.2 echo ${K_EXTRAEINFO} | fmt |
415 vapier 1.80 while read -s ELINE ; do
416 johnm 1.2 einfo "${ELINE}"
417     done
418 iggy 1.8
419     echo
420 johnm 1.2 fi
421 iggy 1.7
422 johnm 1.54 # Show policy version, if this kernel has SELinux ...
423 johnm 1.55 local secfile
424     secfile="${ROOT}usr/src/linux-${KV_FULL}/security/selinux/include/security.h"
425 mr_bones_ 1.38 if use selinux && [ -f "$secfile" ]
426 plasmaroo 1.33 then
427     local polver=$(awk '/POLICYDB_VERSION /{print $3}' $secfile)
428     einfo "The SELinux policy version of this kernel is $polver."
429     echo
430     fi
431    
432 iggy 1.7 # if K_EXTRAEWARN is set then lets display it now
433     if [ -n "${K_EXTRAEWARN}" ]
434     then
435     echo ${K_EXTRAEWARN} | fmt |
436     while read -s ELINE
437     do
438 iggy 1.8 ewarn "${ELINE}"
439 iggy 1.7 done
440 iggy 1.8
441     echo
442 iggy 1.7 fi
443 johnm 1.1 }
444    
445 johnm 1.12 postinst_headers() {
446 johnm 1.72 einfo "Kernel headers are usually only used when recompiling glibc, as such, following the installation"
447     einfo "of newer headers, it is advised that you re-merge glibc as follows:"
448     einfo "emerge glibc"
449     einfo "Failure to do so will cause glibc to not make use of newer features present in the updated kernel"
450     einfo "headers."
451 johnm 1.12 }
452    
453     # pkg_setup functions
454     #==============================================================
455     setup_headers() {
456 vapier 1.86 [[ -z ${H_SUPPORTEDARCH} ]] && H_SUPPORTEDARCH=${PN/-*/}
457     for i in ${H_SUPPORTEDARCH} ; do
458 vapier 1.87 [[ $(tc-arch) == "${i}" ]] && H_ACCEPT_ARCH="yes"
459 johnm 1.12 done
460 lu_zero 1.62
461 vapier 1.86 if [[ ${H_ACCEPT_ARCH} != "yes" ]] ; then
462 johnm 1.12 echo
463     eerror "This version of ${PN} does not support ${ARCH}."
464     eerror "Please merge the appropriate sources, in most cases"
465 johnm 1.72 eerror "(but not all) this will be called ${ARCH}-headers."
466     die "Package unsupported for ${ARCH}"
467 johnm 1.12 fi
468     }
469    
470 johnm 1.1 # unipatch
471     #==============================================================
472     unipatch() {
473     local i
474     local x
475     local extention
476     local PIPE_CMD
477 johnm 1.19 local UNIPATCH_DROP
478 johnm 1.1 local KPATCH_DIR
479     local PATCH_DEPTH
480 johnm 1.2 local ELINE
481 johnm 1.16 local STRICT_COUNT
482 johnm 1.41 local PATCH_LEVEL
483 johnm 1.78 local myLC_ALL
484    
485     # set to a standard locale to ensure sorts are ordered properly.
486     myLC_ALL="${LC_ALL}"
487     LC_ALL="C"
488 johnm 1.1
489     [ -z "${KPATCH_DIR}" ] && KPATCH_DIR="${WORKDIR}/patches/"
490     [ ! -d ${KPATCH_DIR} ] && mkdir -p ${KPATCH_DIR}
491    
492 johnm 1.41 # We're gonna need it when doing patches with a predefined patchlevel
493     shopt -s extglob
494    
495 johnm 1.54 # This function will unpack all passed tarballs, add any passed patches, and remove any passed patchnumbers
496 johnm 1.1 # usage can be either via an env var or by params
497 johnm 1.54 # although due to the nature we pass this within this eclass
498     # it shall be by param only.
499     # -z "${UNIPATCH_LIST}" ] && UNIPATCH_LIST="${@}"
500     UNIPATCH_LIST="${@}"
501 johnm 1.1
502     #unpack any passed tarballs
503     for i in ${UNIPATCH_LIST}
504     do
505 johnm 1.9 if [ -n "$(echo ${i} | grep -e "\.tar" -e "\.tbz" -e "\.tgz")" ]
506 johnm 1.1 then
507     extention=${i/*./}
508 johnm 1.41 extention=${extention/:*/}
509 johnm 1.1 case ${extention} in
510     tbz2) PIPE_CMD="tar -xvjf";;
511     bz2) PIPE_CMD="tar -xvjf";;
512     tgz) PIPE_CMD="tar -xvzf";;
513     gz) PIPE_CMD="tar -xvzf";;
514     *) eerror "Unrecognized tarball compression"
515     die "Unrecognized tarball compression";;
516     esac
517    
518 johnm 1.16 if [ -n "${UNIPATCH_STRICTORDER}" ]
519     then
520     STRICT_COUNT=$((${STRICT_COUNT} + 1))
521     mkdir -p ${KPATCH_DIR}/${STRICT_COUNT}/
522 johnm 1.54 ${PIPE_CMD} ${i/:*/} -C ${KPATCH_DIR}/${STRICT_COUNT}/ 1>/dev/null
523 johnm 1.16 else
524 johnm 1.41 ${PIPE_CMD} ${i/:*/} -C ${KPATCH_DIR} 1>/dev/null
525 johnm 1.16 fi
526    
527 johnm 1.1 if [ $? == 0 ]
528     then
529     einfo "${i/*\//} unpacked"
530 johnm 1.54 [ -n "$(echo ${i} | grep ':')" ] && echo ">>> Strict patch levels not currently supported for tarballed patchsets"
531 johnm 1.1 else
532 johnm 1.41 eerror "Failed to unpack ${i/:*/}"
533 johnm 1.1 die "unable to unpack patch tarball"
534     fi
535 johnm 1.16 else
536 johnm 1.25 extention=${i/*./}
537 johnm 1.41 extention=${extention/:*/}
538 johnm 1.25 PIPE_CMD=""
539     case ${extention} in
540     bz2) PIPE_CMD="bzip2 -dc";;
541     patch) PIPE_CMD="cat";;
542     diff) PIPE_CMD="cat";;
543     gz|Z|z) PIPE_CMD="gzip -dc";;
544     ZIP|zip) PIPE_CMD="unzip -p";;
545 johnm 1.41 *) UNIPATCH_DROP="${UNIPATCH_DROP} ${i/:*/}";;
546 johnm 1.25 esac
547 johnm 1.41
548     PATCH_LEVEL=${i/*([^:])?(:)}
549     i=${i/:*/}
550 johnm 1.25 x=${i/*\//}
551     x=${x/\.${extention}/}
552 lu_zero 1.62
553 johnm 1.29 if [ -n "${PIPE_CMD}" ]
554 johnm 1.25 then
555 johnm 1.29 if [ ! -r "${i}" ]
556     then
557     echo
558     eerror "FATAL: unable to locate:"
559     eerror "${i}"
560 johnm 1.54 eerror "for read-only. The file either has incorrect permissions"
561     eerror "or does not exist."
562 johnm 1.29 die Unable to locate ${i}
563     fi
564 lu_zero 1.62
565 johnm 1.29 if [ -n "${UNIPATCH_STRICTORDER}" ]
566     then
567     STRICT_COUNT=$((${STRICT_COUNT} + 1))
568     mkdir -p ${KPATCH_DIR}/${STRICT_COUNT}/
569 johnm 1.54 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${STRICT_COUNT}/${x}.patch${PATCH_LEVEL})
570 johnm 1.29 else
571 johnm 1.41 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${x}.patch${PATCH_LEVEL})
572 johnm 1.29 fi
573 johnm 1.25 fi
574 johnm 1.16 fi
575 johnm 1.1 done
576    
577     #populate KPATCH_DIRS so we know where to look to remove the excludes
578     x=${KPATCH_DIR}
579     KPATCH_DIR=""
580 johnm 1.25 for i in $(find ${x} -type d | sort -n)
581 johnm 1.1 do
582     KPATCH_DIR="${KPATCH_DIR} ${i}"
583     done
584    
585     #so now lets get rid of the patchno's we want to exclude
586 johnm 1.19 UNIPATCH_DROP="${UNIPATCH_EXCLUDE} ${UNIPATCH_DROP}"
587     for i in ${UNIPATCH_DROP}
588 johnm 1.1 do
589 johnm 1.55 ebegin "Excluding Patch #${i}"
590 johnm 1.1 for x in ${KPATCH_DIR}
591     do
592 tseng 1.36 rm -f ${x}/${i}* 2>/dev/null
593 johnm 1.1 done
594 johnm 1.55 eend $?
595 johnm 1.1 done
596    
597     # and now, finally, we patch it :)
598     for x in ${KPATCH_DIR}
599     do
600 johnm 1.47 for i in $(find ${x} -maxdepth 1 -iname "*.patch*" -or -iname "*.diff*" | sort -n)
601 johnm 1.1 do
602 johnm 1.25 STDERR_T="${T}/${i/*\//}"
603 johnm 1.41 STDERR_T="${STDERR_T/.patch*/.err}"
604    
605 lu_zero 1.62 [ -z ${i/*.patch*/} ] && PATCH_DEPTH=${i/*.patch/}
606     [ -z ${i/*.diff*/} ] && PATCH_DEPTH=${i/*.diff/}
607 johnm 1.41
608     if [ -z "${PATCH_DEPTH}" ]; then
609     PATCH_DEPTH=0
610     fi
611    
612     ebegin "Applying ${i/*\//} (-p${PATCH_DEPTH}+)"
613 johnm 1.1 while [ ${PATCH_DEPTH} -lt 5 ]
614     do
615 plasmaroo 1.33 echo "Attempting Dry-run:" >> ${STDERR_T}
616 johnm 1.25 echo "cmd: patch -p${PATCH_DEPTH} --dry-run -f < ${i}" >> ${STDERR_T}
617 johnm 1.54 echo "=======================================================" >> ${STDERR_T}
618 johnm 1.26 if [ $(patch -p${PATCH_DEPTH} --dry-run -f < ${i} >> ${STDERR_T}) $? -eq 0 ]
619 johnm 1.1 then
620 johnm 1.25 echo "Attempting patch:" > ${STDERR_T}
621     echo "cmd: patch -p${PATCH_DEPTH} -f < ${i}" >> ${STDERR_T}
622 johnm 1.54 echo "=======================================================" >> ${STDERR_T}
623 johnm 1.26 if [ $(patch -p${PATCH_DEPTH} -f < ${i} >> ${STDERR_T}) "$?" -eq 0 ]
624 johnm 1.1 then
625     eend 0
626 johnm 1.25 rm ${STDERR_T}
627 johnm 1.1 break
628     else
629     eend 1
630     eerror "Failed to apply patch ${i/*\//}"
631 johnm 1.54 eerror "Please attach ${STDERR_T} to any bug you may post."
632 johnm 1.1 die "Failed to apply ${i/*\//}"
633     fi
634     else
635     PATCH_DEPTH=$((${PATCH_DEPTH} + 1))
636     fi
637     done
638     if [ ${PATCH_DEPTH} -eq 5 ]
639     then
640     eend 1
641 johnm 1.54 eerror "Please attach ${STDERR_T} to any bug you may post."
642 johnm 1.1 die "Unable to dry-run patch."
643     fi
644     done
645     done
646 johnm 1.43
647     # clean up KPATCH_DIR's - fixes bug #53610
648     for x in ${KPATCH_DIR}
649     do
650     rm -Rf ${x}
651     done
652 johnm 1.78
653     LC_ALL="${myLC_ALL}"
654 johnm 1.1 }
655    
656 johnm 1.74 # getfilevar accepts 2 vars as follows:
657     # getfilevar <VARIABLE> <CONFIGFILE>
658     # pulled from linux-info
659    
660     getfilevar() {
661     local ERROR workingdir basefname basedname xarch
662     ERROR=0
663    
664     [ -z "${1}" ] && ERROR=1
665     [ ! -f "${2}" ] && ERROR=1
666    
667     if [ "${ERROR}" = 1 ]
668     then
669     ebeep
670     echo -e "\n"
671     eerror "getfilevar requires 2 variables, with the second a valid file."
672     eerror " getfilevar <VARIABLE> <CONFIGFILE>"
673     else
674     workingdir=${PWD}
675     basefname=$(basename ${2})
676     basedname=$(dirname ${2})
677 vapier 1.86 xarch=$(tc-arch-kernel)
678 johnm 1.74 unset ARCH
679    
680     cd ${basedname}
681     echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
682     make ${BUILD_FIXES} -f - e 2>/dev/null
683     cd ${workingdir}
684    
685     ARCH=${xarch}
686     fi
687     }
688    
689 johnm 1.1 detect_version() {
690     # this function will detect and set
691 johnm 1.54 # - OKV: Original Kernel Version (2.6.0/2.6.0-test11)
692     # - KV: Kernel Version (2.6.0-gentoo/2.6.0-test11-gentoo-r1)
693     # - EXTRAVERSION: The additional version appended to OKV (-gentoo/-gentoo-r1)
694 lu_zero 1.62
695 johnm 1.55 if [ -n "${KV_FULL}" ] ;
696     then
697     # we will set this for backwards compatibility.
698     KV=${KV_FULL}
699 lu_zero 1.62
700 johnm 1.55 # we know KV_FULL so lets stop here. but not without resetting S
701     S=${WORKDIR}/linux-${KV_FULL}
702     return
703     fi
704 lu_zero 1.62
705 johnm 1.73 if [ -z "${OKV}" ]
706     then
707     OKV=${PV/_beta/-test}
708     OKV=${OKV/_rc/-rc}
709     OKV=${OKV/_p*/}
710     OKV=${OKV/-r*/}
711     fi
712 lu_zero 1.62
713 johnm 1.78 KV_MAJOR=$(get_version_component_range 1 ${OKV})
714     KV_MINOR=$(get_version_component_range 2 ${OKV})
715     KV_PATCH=$(get_version_component_range 3- ${OKV})
716 lu_zero 1.62 KV_PATCH=${KV_PATCH/[-_]*/}
717    
718 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
719 lu_zero 1.62
720 johnm 1.1 RELEASE=${PV/${OKV}/}
721     RELEASE=${RELEASE/_beta/}
722     RELEASE=${RELEASE/_rc/-rc}
723 plasmaroo 1.33 if [ $(kernel_is_2_4) $? == 0 ]
724     then
725     RELEASE=${RELEASE/_pre/-pre}
726     else
727 johnm 1.78 RELEASE=${RELEASE/_pre/-bk}
728 plasmaroo 1.33 fi
729 johnm 1.1 RELEASETYPE=${RELEASE//[0-9]/}
730     EXTRAVERSION="${RELEASE}"
731 lu_zero 1.62
732 johnm 1.11 if [ -n "${K_PREPATCHED}" ]
733     then
734 johnm 1.21 EXTRAVERSION="${EXTRAVERSION}-${PN/-*/}${PR/r/}"
735 johnm 1.72 elif [ ${ETYPE} != "headers" ]
736     then
737 johnm 1.11 [ -z "${K_NOUSENAME}" ] && EXTRAVERSION="${EXTRAVERSION}-${PN/-*/}"
738 johnm 1.73 [ "${PN/-*/}" == "wolk" ] && EXTRAVERSION="-${PN/-*/}-${PV}"
739 johnm 1.83 [ "${PN/-*/}" == "vserver" ] && EXTRAVERSION="-${PN/-*/}-${PV}"
740 johnm 1.55 [ "${PR}" != "r0" ] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
741 johnm 1.11 fi
742 lu_zero 1.62
743 johnm 1.55 KV_FULL=${OKV}${EXTRAVERSION}
744 lu_zero 1.62
745 johnm 1.54 # -rcXX-bkXX pulls are *IMPOSSIBLE* to support within the portage naming convention
746     # these cannot be supported, but the code here can handle it up until this point
747     # and theoretically thereafter.
748 lu_zero 1.62
749 plasmaroo 1.33 if [ "${RELEASETYPE}" == "-rc" -o "${RELEASETYPE}" == "-pre" ]
750 johnm 1.1 then
751 johnm 1.54 OKV="${KV_MAJOR}.${KV_MINOR}.$([ $((${KV_PATCH} - 1)) -lt 0 ] && echo ${KV_PATCH} || echo $((${KV_PATCH} - 1)))"
752 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${PV//_/-}.bz2
753     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
754 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${PV//_/-}.bz2"
755 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
756 johnm 1.1 fi
757 lu_zero 1.62
758 johnm 1.1 if [ "${RELEASETYPE}" == "-bk" ]
759     then
760     OKV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
761     KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
762     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
763 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
764 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
765 johnm 1.1 fi
766 lu_zero 1.62
767 johnm 1.1 if [ "${RELEASETYPE}" == "-rc-bk" ]
768     then
769     OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))-${RELEASE/-bk*}"
770     EXTRAVERSION="$([ -n "${RELEASE}" ] && echo ${RELEASE/*-bk/-bk})$([ -n "${K_USENAME}" ] && echo -${PN/-*/})$([ ! "${PR}" == "r0" ] && echo -${PR})"
771 lu_zero 1.62
772 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
773     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
774 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
775 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
776 johnm 1.1 fi
777 lu_zero 1.62
778 johnm 1.55 S=${WORKDIR}/linux-${KV_FULL}
779     # we will set this for backwards compatibility.
780     KV=${KV_FULL}
781 johnm 1.1 }
782    
783 johnm 1.28 detect_arch() {
784     # This function sets ARCH_URI and ARCH_PATCH
785     # with the neccessary info for the arch sepecific compatibility
786     # patchsets.
787 lu_zero 1.62
788 johnm 1.31 local ALL_ARCH
789     local LOOP_ARCH
790     local COMPAT_URI
791 plasmaroo 1.33 local i
792    
793     # COMPAT_URI is the contents of ${ARCH}_URI
794     # ARCH_URI is the URI for all the ${ARCH}_URI patches
795     # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
796    
797     ARCH_URI=""
798     ARCH_PATCH=""
799 johnm 1.85 ALL_ARCH="X86 PPC PPC64 SPARC MIPS ALPHA ARM HPPA AMD64 IA64 X86OBSD S390 SH"
800 johnm 1.31
801     for LOOP_ARCH in ${ALL_ARCH}
802     do
803     COMPAT_URI="${LOOP_ARCH}_URI"
804     COMPAT_URI="${!COMPAT_URI}"
805 lu_zero 1.62
806 vapier 1.86 [[ -n ${COMPAT_URI} ]] && \
807 johnm 1.55 ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr '[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
808 lu_zero 1.62
809 vapier 1.86 if [[ ${LOOP_ARCH} == "$(echo $(tc-arch-kernel) | tr '[:lower:]' '[:upper:]')" ]]
810 plasmaroo 1.33 then
811     for i in ${COMPAT_URI}
812     do
813     ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
814     done
815     fi
816 johnm 1.31 done
817 johnm 1.28 }
818    
819 johnm 1.72 # sparc nastiness
820     #==============================================================
821     # This script generates the files in /usr/include/asm for sparc systems
822     # during installation of sys-kernel/linux-headers.
823     # Will no longer be needed when full 64 bit support is used on sparc64
824     # systems.
825     #
826     # Shamefully ripped from Debian
827     # ----------------------------------------------------------------------
828    
829     # Idea borrowed from RedHat's kernel package
830    
831 eradicator 1.76 # This is gonna get replaced by something in multilib.eclass soon...
832     # --eradicator
833 johnm 1.72 generate_sparc_asm() {
834     local name
835    
836     cd $1 || die
837     mkdir asm
838    
839     for h in `( ls asm-sparc; ls asm-sparc64 ) | grep '\.h$' | sort -u`; do
840     name="$(echo $h | tr a-z. A-Z_)"
841     # common header
842     echo "/* All asm/ files are generated and point to the corresponding
843     * file in asm-sparc or asm-sparc64.
844     */
845    
846     #ifndef __SPARCSTUB__${name}__
847     #define __SPARCSTUB__${name}__
848     " > asm/${h}
849    
850     # common for sparc and sparc64
851     if [ -f asm-sparc/$h -a -f asm-sparc64/$h ]; then
852     echo "#ifdef __arch64__
853     #include <asm-sparc64/$h>
854     #else
855     #include <asm-sparc/$h>
856     #endif
857     " >> asm/${h}
858    
859     # sparc only
860     elif [ -f asm-sparc/$h ]; then
861     echo "#ifndef __arch64__
862     #include <asm-sparc/$h>
863     #endif
864     " >> asm/${h}
865    
866     # sparc64 only
867     else
868     echo "#ifdef __arch64__
869     #include <asm-sparc64/$h>
870     #endif
871     " >> asm/${h}
872     fi
873    
874     # common footer
875     echo "#endif /* !__SPARCSTUB__${name}__ */" >> asm/${h}
876     done
877     return 0
878     }
879    
880 plasmaroo 1.88 headers___fix()
881     {
882     # Voodoo to partially fix broken upstream headers.
883     # Issues with this function should go to plasmaroo.
884 johnm 1.72 sed -i \
885     -e "s/\([ "$'\t'"]\)u8\([ "$'\t'"]\)/\1__u8\2/g;" \
886     -e "s/\([ "$'\t'"]\)u16\([ "$'\t'"]\)/\1__u16\2/g;" \
887     -e "s/\([ "$'\t'"]\)u32\([ "$'\t'"]\)/\1__u32\2/g;" \
888     -e "s/\([ "$'\t'"]\)u64\([ "$'\t'"]\)/\1__u64\2/g;" \
889 plasmaroo 1.88 -e "s/\([ "$'\t'"]\)s64\([ "$'\t'"]\)/\1__s64\2/g;" \
890     -e 's/ \(u\|s\)\(8\|16\|32\|64\)$/ __\1\2/g' \
891     -e 's/\([(, ]\)\(u\|s\)64\([, )]\)/\1__\264\3/g' \
892 johnm 1.72 "$@"
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 cd ${S}
912 johnm 1.1 [ "${ETYPE}" == "headers" ] && compile_headers
913 johnm 1.55 [ "${ETYPE}" == "sources" ] && \
914     use doc && ! use arm && ! use s390 && compile_manpages
915 johnm 1.1 }
916    
917 plasmaroo 1.33 kernel-2_pkg_preinst() {
918 johnm 1.1 [ "${ETYPE}" == "headers" ] && preinst_headers
919     }
920    
921 plasmaroo 1.33 kernel-2_src_install() {
922 johnm 1.1 install_universal
923     [ "${ETYPE}" == "headers" ] && install_headers
924     [ "${ETYPE}" == "sources" ] && install_sources
925     }
926    
927 plasmaroo 1.33 kernel-2_pkg_postinst() {
928 johnm 1.12 [ "${ETYPE}" == "headers" ] && postinst_headers
929 johnm 1.1 [ "${ETYPE}" == "sources" ] && postinst_sources
930     }
931 johnm 1.12
932 plasmaroo 1.33 kernel-2_pkg_setup() {
933 johnm 1.12 [ "${ETYPE}" == "headers" ] && setup_headers
934 johnm 1.54
935     # This is to fix some weird portage bug? in stable versions of portage.
936     [ "${ETYPE}" == "sources" ] && echo ">>> Preparing to unpack ..."
937 johnm 1.12 }

  ViewVC Help
Powered by ViewVC 1.1.20