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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.86 - (hide annotations) (download)
Mon Jan 24 04:46:36 2005 UTC (14 years, 4 months ago) by vapier
Branch: MAIN
Changes since 1.85: +14 -19 lines
change $ARCH to tc-arch() to fix cross-compiling again

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

  ViewVC Help
Powered by ViewVC 1.1.20