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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.104 - (hide annotations) (download)
Thu Feb 24 01:17:32 2005 UTC (14 years, 4 months ago) by dsd
Branch: MAIN
Changes since 1.103: +11 -5 lines
Makefile sed fix thanks to   joecool <joecool1029@gmail.com> in bug 82701

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

  ViewVC Help
Powered by ViewVC 1.1.20