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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.120 - (hide annotations) (download)
Wed Apr 13 08:50:22 2005 UTC (14 years, 6 months ago) by johnm
Branch: MAIN
Changes since 1.119: +10 -7 lines
Interesting one :)

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

  ViewVC Help
Powered by ViewVC 1.1.20