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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.89 - (hide annotations) (download)
Mon Jan 31 20:03:47 2005 UTC (14 years, 4 months ago) by johnm
Branch: MAIN
Changes since 1.88: +8 -5 lines
Multiple fixes.

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.89 # $Header: /var/cvsroot/gentoo-x86/eclass/kernel-2.eclass,v 1.84 2005/01/14 12:15:15 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.73 if [ -z "${OKV}" ]
710     then
711     OKV=${PV/_beta/-test}
712     OKV=${OKV/_rc/-rc}
713     OKV=${OKV/_p*/}
714     OKV=${OKV/-r*/}
715     fi
716 lu_zero 1.62
717 johnm 1.78 KV_MAJOR=$(get_version_component_range 1 ${OKV})
718     KV_MINOR=$(get_version_component_range 2 ${OKV})
719     KV_PATCH=$(get_version_component_range 3- ${OKV})
720 lu_zero 1.62 KV_PATCH=${KV_PATCH/[-_]*/}
721    
722 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
723 lu_zero 1.62
724 johnm 1.1 RELEASE=${PV/${OKV}/}
725     RELEASE=${RELEASE/_beta/}
726     RELEASE=${RELEASE/_rc/-rc}
727 plasmaroo 1.33 if [ $(kernel_is_2_4) $? == 0 ]
728     then
729     RELEASE=${RELEASE/_pre/-pre}
730     else
731 johnm 1.78 RELEASE=${RELEASE/_pre/-bk}
732 plasmaroo 1.33 fi
733 johnm 1.1 RELEASETYPE=${RELEASE//[0-9]/}
734     EXTRAVERSION="${RELEASE}"
735 lu_zero 1.62
736 johnm 1.11 if [ -n "${K_PREPATCHED}" ]
737     then
738 johnm 1.21 EXTRAVERSION="${EXTRAVERSION}-${PN/-*/}${PR/r/}"
739 johnm 1.72 elif [ ${ETYPE} != "headers" ]
740     then
741 johnm 1.11 [ -z "${K_NOUSENAME}" ] && EXTRAVERSION="${EXTRAVERSION}-${PN/-*/}"
742 johnm 1.73 [ "${PN/-*/}" == "wolk" ] && EXTRAVERSION="-${PN/-*/}-${PV}"
743 johnm 1.83 [ "${PN/-*/}" == "vserver" ] && EXTRAVERSION="-${PN/-*/}-${PV}"
744 johnm 1.55 [ "${PR}" != "r0" ] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
745 johnm 1.11 fi
746 lu_zero 1.62
747 johnm 1.55 KV_FULL=${OKV}${EXTRAVERSION}
748 lu_zero 1.62
749 johnm 1.54 # -rcXX-bkXX pulls are *IMPOSSIBLE* to support within the portage naming convention
750     # these cannot be supported, but the code here can handle it up until this point
751     # and theoretically thereafter.
752 lu_zero 1.62
753 plasmaroo 1.33 if [ "${RELEASETYPE}" == "-rc" -o "${RELEASETYPE}" == "-pre" ]
754 johnm 1.1 then
755 johnm 1.54 OKV="${KV_MAJOR}.${KV_MINOR}.$([ $((${KV_PATCH} - 1)) -lt 0 ] && echo ${KV_PATCH} || echo $((${KV_PATCH} - 1)))"
756 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${PV//_/-}.bz2
757     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
758 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${PV//_/-}.bz2"
759 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
760 johnm 1.1 fi
761 lu_zero 1.62
762 johnm 1.1 if [ "${RELEASETYPE}" == "-bk" ]
763     then
764     OKV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
765     KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
766     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
767 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
768 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
769 johnm 1.1 fi
770 lu_zero 1.62
771 johnm 1.1 if [ "${RELEASETYPE}" == "-rc-bk" ]
772     then
773     OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))-${RELEASE/-bk*}"
774     EXTRAVERSION="$([ -n "${RELEASE}" ] && echo ${RELEASE/*-bk/-bk})$([ -n "${K_USENAME}" ] && echo -${PN/-*/})$([ ! "${PR}" == "r0" ] && echo -${PR})"
775 lu_zero 1.62
776 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
777     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
778 johnm 1.25 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
779 johnm 1.55 KV_FULL=${PV/[-_]*/}${EXTRAVERSION}
780 johnm 1.1 fi
781 lu_zero 1.62
782 johnm 1.55 S=${WORKDIR}/linux-${KV_FULL}
783     # we will set this for backwards compatibility.
784     KV=${KV_FULL}
785 johnm 1.1 }
786    
787 johnm 1.28 detect_arch() {
788     # This function sets ARCH_URI and ARCH_PATCH
789     # with the neccessary info for the arch sepecific compatibility
790     # patchsets.
791 lu_zero 1.62
792 johnm 1.31 local ALL_ARCH
793     local LOOP_ARCH
794     local COMPAT_URI
795 plasmaroo 1.33 local i
796    
797     # COMPAT_URI is the contents of ${ARCH}_URI
798     # ARCH_URI is the URI for all the ${ARCH}_URI patches
799     # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
800    
801     ARCH_URI=""
802     ARCH_PATCH=""
803 johnm 1.85 ALL_ARCH="X86 PPC PPC64 SPARC MIPS ALPHA ARM HPPA AMD64 IA64 X86OBSD S390 SH"
804 johnm 1.31
805     for LOOP_ARCH in ${ALL_ARCH}
806     do
807     COMPAT_URI="${LOOP_ARCH}_URI"
808     COMPAT_URI="${!COMPAT_URI}"
809 lu_zero 1.62
810 vapier 1.86 [[ -n ${COMPAT_URI} ]] && \
811 johnm 1.55 ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr '[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
812 lu_zero 1.62
813 vapier 1.86 if [[ ${LOOP_ARCH} == "$(echo $(tc-arch-kernel) | tr '[:lower:]' '[:upper:]')" ]]
814 plasmaroo 1.33 then
815     for i in ${COMPAT_URI}
816     do
817     ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
818     done
819     fi
820 johnm 1.31 done
821 johnm 1.28 }
822    
823 johnm 1.72 # sparc nastiness
824     #==============================================================
825     # This script generates the files in /usr/include/asm for sparc systems
826     # during installation of sys-kernel/linux-headers.
827     # Will no longer be needed when full 64 bit support is used on sparc64
828     # systems.
829     #
830     # Shamefully ripped from Debian
831     # ----------------------------------------------------------------------
832    
833     # Idea borrowed from RedHat's kernel package
834    
835 eradicator 1.76 # This is gonna get replaced by something in multilib.eclass soon...
836     # --eradicator
837 johnm 1.72 generate_sparc_asm() {
838     local name
839    
840     cd $1 || die
841     mkdir asm
842    
843     for h in `( ls asm-sparc; ls asm-sparc64 ) | grep '\.h$' | sort -u`; do
844     name="$(echo $h | tr a-z. A-Z_)"
845     # common header
846     echo "/* All asm/ files are generated and point to the corresponding
847     * file in asm-sparc or asm-sparc64.
848     */
849    
850     #ifndef __SPARCSTUB__${name}__
851     #define __SPARCSTUB__${name}__
852     " > asm/${h}
853    
854     # common for sparc and sparc64
855     if [ -f asm-sparc/$h -a -f asm-sparc64/$h ]; then
856     echo "#ifdef __arch64__
857     #include <asm-sparc64/$h>
858     #else
859     #include <asm-sparc/$h>
860     #endif
861     " >> asm/${h}
862    
863     # sparc only
864     elif [ -f asm-sparc/$h ]; then
865     echo "#ifndef __arch64__
866     #include <asm-sparc/$h>
867     #endif
868     " >> asm/${h}
869    
870     # sparc64 only
871     else
872     echo "#ifdef __arch64__
873     #include <asm-sparc64/$h>
874     #endif
875     " >> asm/${h}
876     fi
877    
878     # common footer
879     echo "#endif /* !__SPARCSTUB__${name}__ */" >> asm/${h}
880     done
881     return 0
882     }
883    
884 johnm 1.89 headers___fix() {
885 plasmaroo 1.88 # Voodoo to partially fix broken upstream headers.
886     # Issues with this function should go to plasmaroo.
887 johnm 1.72 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 plasmaroo 1.88 -e "s/\([ "$'\t'"]\)s64\([ "$'\t'"]\)/\1__s64\2/g;" \
893     -e 's/ \(u\|s\)\(8\|16\|32\|64\)$/ __\1\2/g' \
894     -e 's/\([(, ]\)\(u\|s\)64\([, )]\)/\1__\264\3/g' \
895 johnm 1.72 "$@"
896     }
897 johnm 1.28
898 johnm 1.1 # common functions
899     #==============================================================
900 plasmaroo 1.33 kernel-2_src_unpack() {
901 dsd 1.61 detect_version
902 johnm 1.1 universal_unpack
903 lu_zero 1.62
904 johnm 1.56 [ -n "${UNIPATCH_LIST}" -o -n "${UNIPATCH_LIST_DEFAULT}" ] && \
905     unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST}"
906 lu_zero 1.62
907 johnm 1.56 [ -z "${K_NOSETEXTRAVERSION}" ] && \
908     unpack_set_extraversion
909    
910     kernel_is 2 4 && unpack_2_4
911 johnm 1.1 }
912    
913 plasmaroo 1.33 kernel-2_src_compile() {
914 johnm 1.72 cd ${S}
915 johnm 1.1 [ "${ETYPE}" == "headers" ] && compile_headers
916 johnm 1.55 [ "${ETYPE}" == "sources" ] && \
917     use doc && ! use arm && ! use s390 && compile_manpages
918 johnm 1.1 }
919    
920 plasmaroo 1.33 kernel-2_pkg_preinst() {
921 johnm 1.1 [ "${ETYPE}" == "headers" ] && preinst_headers
922     }
923    
924 plasmaroo 1.33 kernel-2_src_install() {
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.12 [ "${ETYPE}" == "headers" ] && postinst_headers
932 johnm 1.1 [ "${ETYPE}" == "sources" ] && postinst_sources
933     }
934 johnm 1.12
935 plasmaroo 1.33 kernel-2_pkg_setup() {
936 johnm 1.12 [ "${ETYPE}" == "headers" ] && setup_headers
937 johnm 1.54
938     # This is to fix some weird portage bug? in stable versions of portage.
939     [ "${ETYPE}" == "sources" ] && echo ">>> Preparing to unpack ..."
940 johnm 1.12 }

  ViewVC Help
Powered by ViewVC 1.1.20