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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.83 - (hide annotations) (download)
Fri Jan 14 11:19:05 2005 UTC (14 years, 4 months ago) by johnm
Branch: MAIN
Changes since 1.82: +1 -0 lines
Adding support for vserver

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.82 # $Header: /var/cvsroot/gentoo-x86/eclass/kernel-2.eclass,v 1.76 2005/01/12 05:07:24 eradicator 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     IUSE="${IUSE} 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.78 env -u ARCH 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.78 env -u ARCH 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     # 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     [ -z "${H_SUPPORTEDARCH}" ] && H_SUPPORTEDARCH="${PN/-*/}"
459     for i in ${H_SUPPORTEDARCH}
460     do
461     [ "${ARCH}" == "${i}" ] && H_ACCEPT_ARCH="yes"
462     done
463 lu_zero 1.62
464 johnm 1.12 if [ "${H_ACCEPT_ARCH}" != "yes" ]
465     then
466     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     xarch=${ARCH}
682     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     ALL_ARCH="X86 PPC PPC64 SPARC MIPS ALPHA ARM HPPA AMD64 IA64 X86OBSD S390"
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 johnm 1.55 [ -n "${COMPAT_URI}" ] && \
811     ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr '[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
812 lu_zero 1.62
813 johnm 1.54 if [ "${LOOP_ARCH}" == "$(echo ${ARCH} | 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     headers___fix() {
885     sed -i \
886     -e "s/\([ "$'\t'"]\)u8\([ "$'\t'"]\)/\1__u8\2/g;" \
887     -e "s/\([ "$'\t'"]\)u16\([ "$'\t'"]\)/\1__u16\2/g;" \
888     -e "s/\([ "$'\t'"]\)u32\([ "$'\t'"]\)/\1__u32\2/g;" \
889     -e "s/\([ "$'\t'"]\)u64\([ "$'\t'"]\)/\1__u64\2/g;" \
890     "$@"
891     }
892 johnm 1.28
893 johnm 1.1 # common functions
894     #==============================================================
895 plasmaroo 1.33 kernel-2_src_unpack() {
896 dsd 1.61 detect_version
897 johnm 1.1 universal_unpack
898 lu_zero 1.62
899 johnm 1.56 [ -n "${UNIPATCH_LIST}" -o -n "${UNIPATCH_LIST_DEFAULT}" ] && \
900     unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST}"
901 lu_zero 1.62
902 johnm 1.56 [ -z "${K_NOSETEXTRAVERSION}" ] && \
903     unpack_set_extraversion
904    
905     kernel_is 2 4 && unpack_2_4
906 johnm 1.1 }
907    
908 plasmaroo 1.33 kernel-2_src_compile() {
909 johnm 1.72 cd ${S}
910 johnm 1.1 [ "${ETYPE}" == "headers" ] && compile_headers
911 johnm 1.55 [ "${ETYPE}" == "sources" ] && \
912     use doc && ! use arm && ! use s390 && compile_manpages
913 johnm 1.1 }
914    
915 plasmaroo 1.33 kernel-2_pkg_preinst() {
916 johnm 1.1 [ "${ETYPE}" == "headers" ] && preinst_headers
917     }
918    
919 plasmaroo 1.33 kernel-2_src_install() {
920 johnm 1.1 install_universal
921     [ "${ETYPE}" == "headers" ] && install_headers
922     [ "${ETYPE}" == "sources" ] && install_sources
923     }
924    
925 plasmaroo 1.33 kernel-2_pkg_postinst() {
926 johnm 1.12 [ "${ETYPE}" == "headers" ] && postinst_headers
927 johnm 1.1 [ "${ETYPE}" == "sources" ] && postinst_sources
928     }
929 johnm 1.12
930 plasmaroo 1.33 kernel-2_pkg_setup() {
931 johnm 1.12 [ "${ETYPE}" == "headers" ] && setup_headers
932 johnm 1.54
933     # This is to fix some weird portage bug? in stable versions of portage.
934     [ "${ETYPE}" == "sources" ] && echo ">>> Preparing to unpack ..."
935 johnm 1.12 }

  ViewVC Help
Powered by ViewVC 1.1.20