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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.100 - (hide annotations) (download)
Sat Feb 12 22:32:12 2005 UTC (14 years, 4 months ago) by eradicator
Branch: MAIN
Changes since 1.99: +3 -1 lines
Added make prepare-all to compile_headers().  arch/sparc64 doesn't have a prepare target, and prepare0 is the one that makes version.h, so prepare-all is the correct target.  I am leaving prepare in as I am not certain why it was chozen.  Perhaps 2.4 didn't have prepare-all?

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

  ViewVC Help
Powered by ViewVC 1.1.20