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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.107 - (hide annotations) (download)
Sun Mar 6 11:28:39 2005 UTC (13 years, 9 months ago) by johnm
Branch: MAIN
Changes since 1.106: +12 -11 lines
Fixes bug #84189

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

  ViewVC Help
Powered by ViewVC 1.1.20