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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.99 - (hide annotations) (download)
Fri Feb 11 01:17:36 2005 UTC (14 years, 4 months ago) by eradicator
Branch: MAIN
Changes since 1.98: +27 -21 lines
Cleanup multilib header code so it works when making a cross-compile toolchain.

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

  ViewVC Help
Powered by ViewVC 1.1.20