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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.103 - (hide annotations) (download)
Mon Feb 21 16:24:14 2005 UTC (14 years, 3 months ago) by vapier
Branch: MAIN
Changes since 1.102: +4 -1 lines
make sure we dont include .orig cruft

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

  ViewVC Help
Powered by ViewVC 1.1.20