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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.97 - (hide annotations) (download)
Wed Feb 9 11:23:25 2005 UTC (14 years, 3 months ago) by johnm
Branch: MAIN
Changes since 1.96: +4 -3 lines
Fixing up _p and _r support in OKV

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

  ViewVC Help
Powered by ViewVC 1.1.20