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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.85 - (hide annotations) (download)
Sun Jan 16 19:36:27 2005 UTC (14 years, 5 months ago) by johnm
Branch: MAIN
Changes since 1.84: +4 -4 lines
add new arch into detect_arch. 'sh'

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

  ViewVC Help
Powered by ViewVC 1.1.20