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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.117 - (hide annotations) (download)
Thu Apr 7 18:06:52 2005 UTC (14 years, 2 months ago) by johnm
Branch: MAIN
Changes since 1.116: +117 -113 lines
Adding ARCH logic to unpack 2.4, also fixing problem with incorrect PROVIDE cache by forcing setect_version if OKV isnt set. This deprecates the requirement of needing to call detect_version. CKV should still be used! Also, moved around the logic to detect X.X.X.Y patch vs extra. It's correct now :)

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

  ViewVC Help
Powered by ViewVC 1.1.20