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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.201 - (show annotations) (download)
Thu Jan 25 22:06:35 2007 UTC (12 years, 5 months ago) by dsd
Branch: MAIN
Changes since 1.200: +4 -2 lines
save and restore shell options, thanks to Sandro in bug #162121

1 # Copyright 1999-2005 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/kernel-2.eclass,v 1.200 2007/01/02 01:43:34 dsd Exp $
4
5 # Description: kernel.eclass rewrite for a clean base regarding the 2.6
6 # series of kernel with back-compatibility for 2.4
7 #
8 # Maintainer: John Mylchreest <johnm@gentoo.org>
9 #
10 # Please direct your bugs to the current eclass maintainer :)
11
12 # added functionality:
13 # unipatch - a flexible, singular method to extract, add and remove patches.
14
15 # A Couple of env vars are available to effect usage of this eclass
16 # These are as follows:
17 #
18 # K_USEPV - When setting the EXTRAVERSION variable, it should
19 # add PV to the end.
20 # this is useful for thigns like wolk. IE:
21 # EXTRAVERSION would be something like : -wolk-4.19-r1
22 # K_NOSETEXTRAVERSION - if this is set then EXTRAVERSION will not be
23 # automatically set within the kernel Makefile
24 # K_NOUSENAME - if this is set then EXTRAVERSION will not include the
25 # first part of ${PN} in EXTRAVERSION
26 # K_NOUSEPR - if this is set then EXTRAVERSION will not include the
27 # anything based on ${PR}.
28 # K_PREPATCHED - if the patchset is prepatched (ie: mm-sources,
29 # ck-sources, ac-sources) it will use PR (ie: -r5) as
30 # the patchset version for
31 # and not use it as a true package revision
32 # K_EXTRAEINFO - this is a new-line seperated list of einfo displays in
33 # postinst and can be used to carry additional postinst
34 # messages
35 # K_EXTRAEWARN - same as K_EXTRAEINFO except ewarn's instead of einfo's
36 # K_SYMLINK - if this is set, then forcably create symlink anyway
37 #
38 # K_DEFCONFIG - Allow specifying a different defconfig target.
39 # If length zero, defaults to "defconfig".
40 # K_WANT_GENPATCHES - Apply genpatches to kernel source. Provide any
41 # combination of "base" and "extras"
42 # K_GENPATCHES_VER - The version of the genpatches tarball(s) to apply.
43 # A value of "5" would apply genpatches-2.6.12-5 to
44 # my-sources-2.6.12.ebuild
45 # K_SECURITY_UNSUPPORTED- If set, this kernel is unsupported by Gentoo Security
46
47 # H_SUPPORTEDARCH - this should be a space separated list of ARCH's which
48 # can be supported by the headers ebuild
49
50 # UNIPATCH_LIST - space delimetered list of patches to be applied to the
51 # kernel
52 # UNIPATCH_EXCLUDE - an addition var to support exlusion based completely
53 # on "<passedstring>*" and not "<passedno#>_*"
54 # - this should _NOT_ be used from the ebuild as this is
55 # reserved for end users passing excludes from the cli
56 # UNIPATCH_DOCS - space delimemeted list of docs to be installed to
57 # the doc dir
58 # UNIPATCH_STRICTORDER - if this is set places patches into directories of
59 # order, so they are applied in the order passed
60
61 inherit eutils toolchain-funcs versionator multilib
62 EXPORT_FUNCTIONS pkg_setup src_unpack src_compile src_install pkg_preinst pkg_postinst
63
64 # Added by Daniel Ostrow <dostrow@gentoo.org>
65 # This is an ugly hack to get around an issue with a 32-bit userland on ppc64.
66 # I will remove it when I come up with something more reasonable.
67 [[ ${PROFILE_ARCH} == "ppc64" ]] && CHOST="powerpc64-${CHOST#*-}"
68
69 export CTARGET=${CTARGET:-${CHOST}}
70 if [[ ${CTARGET} == ${CHOST} && ${CATEGORY/cross-} != ${CATEGORY} ]]; then
71 export CTARGET=${CATEGORY/cross-}
72 fi
73
74 HOMEPAGE="http://www.kernel.org/ http://www.gentoo.org/ ${HOMEPAGE}"
75 LICENSE="GPL-2"
76
77 # No need to run scanelf/strip on kernel sources/headers (bug #134453).
78 RESTRICT="binchecks strip"
79
80 # set LINUX_HOSTCFLAGS if not already set
81 [[ -z ${LINUX_HOSTCFLAGS} ]] && \
82 LINUX_HOSTCFLAGS="-Wall -Wstrict-prototypes -Os -fomit-frame-pointer -I${S}/include"
83
84 # debugging functions
85 #==============================================================
86 # this function exists only to help debug kernel-2.eclass
87 # if you are adding new functionality in, put a call to it
88 # at the start of src_unpack, or during SRC_URI/dep generation.
89 debug-print-kernel2-variables() {
90 debug-print "PVR: ${PVR}"
91 debug-print "CKV: ${CKV}"
92 debug-print "OKV: ${OKV}"
93 debug-print "KV: ${KV}"
94 debug-print "KV_FULL: ${KV_FULL}"
95 debug-print "RELEASETYPE: ${RELEASETYPE}"
96 debug-print "RELEASE: ${RELEASE}"
97 debug-print "UNIPATCH_LIST_DEFAULT: ${UNIPATCH_LIST_DEFAULT} "
98 debug-print "UNIPATCH_LIST_GENPATCHES: ${UNIPATCH_LIST_GENPATCHES} "
99 debug-print "UNIPATCH_LIST: ${UNIPATCH_LIST}"
100 debug-print "S: ${S}"
101 debug-print "KERNEL_URI: ${KERNEL_URI}"
102 }
103
104 #Eclass functions only from here onwards ...
105 #==============================================================
106 handle_genpatches() {
107 local tarball
108 [[ -z ${K_WANT_GENPATCHES} || -z ${K_GENPATCHES_VER} ]] && return -1
109
110 for i in ${K_WANT_GENPATCHES} ; do
111 tarball="genpatches-${OKV}-${K_GENPATCHES_VER}.${i}.tar.bz2"
112 GENPATCHES_URI="${GENPATCHES_URI} mirror://gentoo/${tarball}"
113 UNIPATCH_LIST_GENPATCHES="${UNIPATCH_LIST_GENPATCHES} ${DISTDIR}/${tarball}"
114 done
115 }
116
117 detect_version() {
118 # this function will detect and set
119 # - OKV: Original Kernel Version (2.6.0/2.6.0-test11)
120 # - KV: Kernel Version (2.6.0-gentoo/2.6.0-test11-gentoo-r1)
121 # - EXTRAVERSION: The additional version appended to OKV (-gentoo/-gentoo-r1)
122
123 if [[ -n ${KV_FULL} ]]; then
124 # we will set this for backwards compatibility.
125 KV=${KV_FULL}
126
127 # we know KV_FULL so lets stop here. but not without resetting S
128 S=${WORKDIR}/linux-${KV_FULL}
129 return
130 fi
131
132 # CKV is used as a comparison kernel version, which is used when
133 # PV doesnt reflect the genuine kernel version.
134 # this gets set to the portage style versioning. ie:
135 # CKV=2.6.11_rc4
136 CKV=${CKV:-${PV}}
137 OKV=${OKV:-${CKV}}
138 OKV=${OKV/_beta/-test}
139 OKV=${OKV/_rc/-rc}
140 OKV=${OKV/-r*}
141 OKV=${OKV/_p*}
142
143 KV_MAJOR=$(get_version_component_range 1 ${OKV})
144 KV_MINOR=$(get_version_component_range 2 ${OKV})
145 KV_PATCH=$(get_version_component_range 3 ${OKV})
146
147 if [[ ${KV_MAJOR}${KV_MINOR}${KV_PATCH} -ge 269 ]]; then
148 KV_EXTRA=$(get_version_component_range 4- ${OKV})
149 KV_EXTRA=${KV_EXTRA/[-_]*}
150 else
151 KV_PATCH=$(get_version_component_range 3- ${OKV})
152 fi
153 KV_PATCH=${KV_PATCH/[-_]*}
154
155 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
156
157 RELEASE=${CKV/${OKV}}
158 RELEASE=${RELEASE/_beta}
159 RELEASE=${RELEASE/_rc/-rc}
160 RELEASE=${RELEASE/_pre/-pre}
161 kernel_is ge 2 6 && RELEASE=${RELEASE/-pre/-git}
162 RELEASETYPE=${RELEASE//[0-9]}
163
164 # Now we know that RELEASE is the -rc/-git
165 # and RELEASETYPE is the same but with its numerics stripped
166 # we can work on better sorting EXTRAVERSION.
167 # first of all, we add the release
168 EXTRAVERSION="${RELEASE}"
169 debug-print "0 EXTRAVERSION:${EXTRAVERSION}"
170 [[ -n ${KV_EXTRA} ]] && EXTRAVERSION=".${KV_EXTRA}${EXTRAVERSION}"
171
172 debug-print "1 EXTRAVERSION:${EXTRAVERSION}"
173 if [[ -n "${K_NOUSEPR}" ]]; then
174 # Don't add anything based on PR to EXTRAVERSION
175 debug-print "1.0 EXTRAVERSION:${EXTRAVERSION}"
176 elif [[ -n ${K_PREPATCHED} ]]; then
177 debug-print "1.1 EXTRAVERSION:${EXTRAVERSION}"
178 EXTRAVERSION="${EXTRAVERSION}-${PN/-*}${PR/r}"
179 elif [[ "${ETYPE}" = "sources" ]]; then
180 debug-print "1.2 EXTRAVERSION:${EXTRAVERSION}"
181 # For some sources we want to use the PV in the extra version
182 # This is because upstream releases with a completely different
183 # versioning scheme.
184 case ${PN/-*} in
185 wolk) K_USEPV=1;;
186 vserver) K_USEPV=1;;
187 esac
188
189 [[ -z "${K_NOUSENAME}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PN/-*}"
190 [[ -n "${K_USEPV}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PV//_/-}"
191 [[ -n "${PR//r0}" ]] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
192 fi
193 debug-print "2 EXTRAVERSION:${EXTRAVERSION}"
194
195 # The only messing around which should actually effect this is for KV_EXTRA
196 # since this has to limit OKV to MAJ.MIN.PAT and strip EXTRA off else
197 # KV_FULL evaluates to MAJ.MIN.PAT.EXT.EXT after EXTRAVERSION
198 if [[ -n ${KV_EXTRA} ]]; then
199 OKV="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
200 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/patch-${CKV}.bz2
201 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.tar.bz2"
202 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV}.bz2"
203 fi
204
205 # We need to set this using OKV, but we need to set it before we do any
206 # messing around with OKV based on RELEASETYPE
207 KV_FULL=${OKV}${EXTRAVERSION}
208
209 # we will set this for backwards compatibility.
210 S=${WORKDIR}/linux-${KV_FULL}
211 KV=${KV_FULL}
212
213 # -rc-git pulls can be achieved by specifying CKV
214 # for example:
215 # CKV="2.6.11_rc3_pre2"
216 # will pull:
217 # linux-2.6.10.tar.bz2 & patch-2.6.11-rc3.bz2 & patch-2.6.11-rc3-git2.bz2
218
219 if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; then
220 OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
221 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${CKV//_/-}.bz2
222 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
223 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.bz2"
224 fi
225
226 if [[ ${RELEASETYPE} == -git ]]; then
227 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${OKV}${RELEASE}.bz2
228 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
229 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.bz2"
230 fi
231
232 if [[ ${RELEASETYPE} == -rc-git ]]; then
233 OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
234 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
235 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-git*}.bz2
236 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
237 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-git*}.bz2 ${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
238 fi
239
240 debug-print-kernel2-variables
241
242 handle_genpatches
243 }
244
245 kernel_is() {
246 [[ -z ${OKV} ]] && detect_version
247 local operator test value x=0 y=0 z=0
248
249 case ${1} in
250 lt) operator="-lt"; shift;;
251 gt) operator="-gt"; shift;;
252 le) operator="-le"; shift;;
253 ge) operator="-ge"; shift;;
254 eq) operator="-eq"; shift;;
255 *) operator="-eq";;
256 esac
257
258 for x in ${@}; do
259 for((y=0; y<$((3 - ${#x})); y++)); do value="${value}0"; done
260 value="${value}${x}"
261 z=$((${z} + 1))
262
263 case ${z} in
264 1) for((y=0; y<$((3 - ${#KV_MAJOR})); y++)); do test="${test}0"; done;
265 test="${test}${KV_MAJOR}";;
266 2) for((y=0; y<$((3 - ${#KV_MINOR})); y++)); do test="${test}0"; done;
267 test="${test}${KV_MINOR}";;
268 3) for((y=0; y<$((3 - ${#KV_PATCH})); y++)); do test="${test}0"; done;
269 test="${test}${KV_PATCH}";;
270 *) die "Error in kernel-2_kernel_is(): Too many parameters.";;
271 esac
272 done
273
274 [ ${test} ${operator} ${value} ] && return 0 || return 1
275 }
276
277 kernel_is_2_4() {
278 kernel_is 2 4
279 }
280
281 kernel_is_2_6() {
282 kernel_is 2 6 || kernel_is 2 5
283 }
284
285 # Capture the sources type and set DEPENDs
286 if [[ ${ETYPE} == sources ]]; then
287 DEPEND="!build? ( sys-apps/sed
288 >=sys-devel/binutils-2.11.90.0.31 )"
289 RDEPEND="!build? ( >=sys-libs/ncurses-5.2
290 sys-devel/make )
291 virtual/dev-manager"
292
293 PROVIDE="virtual/linux-sources"
294 kernel_is gt 2 4 && PROVIDE="${PROVIDE} virtual/alsa"
295
296 SLOT="${PVR}"
297 DESCRIPTION="Sources for the ${KV_MAJOR}.${KV_MINOR} linux kernel"
298 IUSE="symlink build"
299 elif [[ ${ETYPE} == headers ]]; then
300 DESCRIPTION="Linux system headers"
301
302 # Since we should NOT honour KBUILD_OUTPUT in headers
303 # lets unset it here.
304 unset KBUILD_OUTPUT
305
306 if [[ ${CTARGET} = ${CHOST} ]]; then
307 DEPEND="!virtual/os-headers"
308 PROVIDE="virtual/os-headers"
309 SLOT="0"
310 else
311 SLOT="${CTARGET}"
312 fi
313 else
314 eerror "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
315 die "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
316 fi
317
318 # Cross-compile support functions
319 #==============================================================
320 kernel_header_destdir() {
321 [[ ${CTARGET} == ${CHOST} ]] \
322 && echo /usr/include \
323 || echo /usr/${CTARGET}/usr/include
324 }
325
326 cross_pre_c_headers() {
327 use crosscompile_opts_headers-only && [[ ${CHOST} != ${CTARGET} ]]
328 }
329
330 env_setup_xmakeopts() {
331 # Kernel ARCH != portage ARCH
332 export KARCH=$(tc-arch-kernel)
333
334 # When cross-compiling, we need to set the ARCH/CROSS_COMPILE
335 # variables properly or bad things happen !
336 xmakeopts="ARCH=${KARCH}"
337 if [[ ${CTARGET} != ${CHOST} ]] && ! cross_pre_c_headers ; then
338 xmakeopts="${xmakeopts} CROSS_COMPILE=${CTARGET}-"
339 elif type -p ${CHOST}-ar > /dev/null ; then
340 xmakeopts="${xmakeopts} CROSS_COMPILE=${CHOST}-"
341 fi
342 export xmakeopts
343 }
344
345 # Unpack functions
346 #==============================================================
347 unpack_2_4() {
348 # this file is required for other things to build properly,
349 # so we autogenerate it
350 make -s mrproper ${xmakeopts} || die "make mrproper failed"
351 make -s symlinks ${xmakeopts} || die "make symlinks failed"
352 make -s include/linux/version.h ${xmakeopts} || die "make include/linux/version.h failed"
353 echo ">>> version.h compiled successfully."
354 }
355
356 unpack_2_6() {
357 # this file is required for other things to build properly, so we
358 # autogenerate it ... generate a .config to keep version.h build from
359 # spitting out an annoying warning
360 make -s mrproper ${xmakeopts} 2>/dev/null \
361 || die "make mrproper failed"
362
363 # quick fix for bug #132152 which triggers when it cannot include linux
364 # headers (ie, we have not installed it yet)
365 if ! make -s defconfig ${xmakeopts} &>/dev/null 2>&1 ; then
366 touch .config
367 eerror "make defconfig failed."
368 eerror "assuming you dont have any headers installed yet and continuing"
369 epause 5
370 fi
371
372 make -s include/linux/version.h ${xmakeopts} 2>/dev/null \
373 || die "make include/linux/version.h failed"
374 rm -f .config >/dev/null
375 }
376
377 universal_unpack() {
378 cd ${WORKDIR}
379 unpack linux-${OKV}.tar.bz2
380 if [[ -d "linux" ]]; then
381 mv linux linux-${KV_FULL} \
382 || die "Unable to move source tree to ${KV_FULL}."
383 elif [[ "${OKV}" != "${KV_FULL}" ]]; then
384 mv linux-${OKV} linux-${KV_FULL} \
385 || die "Unable to move source tree to ${KV_FULL}."
386 fi
387 cd "${S}"
388
389 # remove all backup files
390 find . -iname "*~" -exec rm {} \; 2> /dev/null
391
392 # fix a problem on ppc where TOUT writes to /usr/src/linux breaking sandbox
393 sed -i \
394 -e 's|TOUT := .tmp_gas_check|TOUT := $(T).tmp_gas_check|' \
395 "${S}"/arch/ppc/Makefile
396 }
397
398 unpack_set_extraversion() {
399 cd "${S}"
400 sed -i -e "s:^\(EXTRAVERSION =\).*:\1 ${EXTRAVERSION}:" Makefile
401 cd "${OLDPWD}"
402 }
403
404 # Should be done after patches have been applied
405 # Otherwise patches that modify the same area of Makefile will fail
406 unpack_fix_install_path() {
407 cd "${S}"
408 sed -i -e 's:#export\tINSTALL_PATH:export\tINSTALL_PATH:' Makefile
409 }
410
411 # Compile Functions
412 #==============================================================
413 compile_headers() {
414 env_setup_xmakeopts
415
416 # if we couldnt obtain HOSTCFLAGS from the Makefile,
417 # then set it to something sane
418 local HOSTCFLAGS=$(getfilevar HOSTCFLAGS "${S}"/Makefile)
419 HOSTCFLAGS=${HOSTCFLAGS:--Wall -Wstrict-prototypes -O2 -fomit-frame-pointer}
420
421 if kernel_is 2 4; then
422 yes "" | make oldconfig ${xmakeopts}
423 echo ">>> make oldconfig complete"
424 make dep ${xmakeopts}
425 elif kernel_is 2 6; then
426 # 2.6.18 introduces headers_install which means we dont need any
427 # of this crap anymore :D
428 kernel_is ge 2 6 18 && return 0
429
430 # autoconf.h isnt generated unless it already exists. plus, we have
431 # no guarantee that any headers are installed on the system...
432 [[ -f ${ROOT}/usr/include/linux/autoconf.h ]] \
433 || touch include/linux/autoconf.h
434
435 # if K_DEFCONFIG isn't set, force to "defconfig"
436 # needed by mips
437 if [[ -z ${K_DEFCONFIG} ]]; then
438 if [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.16) ]]; then
439 case ${CTARGET} in
440 powerpc64*) K_DEFCONFIG="ppc64_defconfig";;
441 powerpc*) K_DEFCONFIG="pmac32_defconfig";;
442 *) K_DEFCONFIG="defconfig";;
443 esac
444 else
445 K_DEFCONFIG="defconfig"
446 fi
447 fi
448
449 # if there arent any installed headers, then there also isnt an asm
450 # symlink in /usr/include/, and make defconfig will fail, so we have
451 # to force an include path with $S.
452 HOSTCFLAGS="${HOSTCFLAGS} -I${S}/include/"
453 ln -sf asm-${KARCH} "${S}"/include/asm
454 cross_pre_c_headers && return 0
455
456 make ${K_DEFCONFIG} HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "defconfig failed (${K_DEFCONFIG})"
457 if compile_headers_tweak_config ; then
458 yes "" | make oldconfig HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "2nd oldconfig failed"
459 fi
460 make prepare HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
461 make prepare-all HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
462 fi
463 }
464
465 compile_headers_tweak_config() {
466 # some targets can be very very picky, so let's finesse the
467 # .config based upon any info we may have
468 case ${CTARGET} in
469 sh*)
470 sed -i '/CONFIG_CPU_SH/d' .config
471 echo "CONFIG_CPU_SH${CTARGET:2:1}=y" >> .config
472 return 0;;
473 esac
474
475 # no changes, so lets do nothing
476 return 1
477 }
478
479 # install functions
480 #==============================================================
481 install_universal() {
482 #fix silly permissions in tarball
483 cd ${WORKDIR}
484 chown -R root:0 *
485 chmod -R a+r-w+X,u+w *
486 cd ${OLDPWD}
487 }
488
489 install_headers() {
490 local ddir=$(kernel_header_destdir)
491
492 # 2.6.18 introduces headers_install which means we dont need any
493 # of this crap anymore :D
494 if kernel_is ge 2 6 18 ; then
495 env_setup_xmakeopts
496 emake headers_install INSTALL_HDR_PATH="${D}"/${ddir}/.. ${xmakeopts} || die
497
498 # let other packages install some of these headers
499 rm -rf "${D}"/${ddir}/sound #alsa-headers
500 rm -rf "${D}"/${ddir}/scsi #glibc/uclibc/etc...
501 return 0
502 fi
503
504 # Do not use "linux/*" as that can cause problems with very long
505 # $S values where the cmdline to cp is too long
506 cd "${S}"
507 dodir ${ddir}/linux
508 cp -pPR "${S}"/include/linux "${D}"/${ddir}/ || die
509 rm -rf "${D}"/${ddir}/linux/modules
510
511 # Handle multilib headers and crap
512 local multi_dirs="" multi_defs=""
513 case $(tc-arch-kernel) in
514 sparc64)
515 multi_dirs="sparc sparc64"
516 multi_defs="!__arch64__ __arch64__"
517 ;;
518 x86_64)
519 multi_dirs="i386 x86_64"
520 multi_defs="__i386__ __x86_64__"
521 ;;
522 ppc64)
523 multi_dirs="ppc ppc64"
524 multi_defs="!__powerpc64__ __powerpc64__"
525 ;;
526 s390x)
527 multi_dirs="s390 s390x"
528 multi_defs="!__s390x__ __s390x__"
529 ;;
530 arm)
531 dodir ${ddir}/asm
532 cp -pPR "${S}"/include/asm/* "${D}"/${ddir}/asm
533 [[ ! -e ${D}/${ddir}/asm/arch ]] && ln -sf arch-ebsa285 "${D}"/${ddir}/asm/arch
534 [[ ! -e ${D}/${ddir}/asm/proc ]] && ln -sf proc-armv "${D}"/${ddir}/asm/proc
535 ;;
536 powerpc)
537 dodir ${ddir}/asm
538 cp -pPR "${S}"/include/asm/* ${D}/${ddir}/asm
539 if [[ -e "${S}"/include/asm-ppc ]] ; then
540 dodir ${ddir}/asm-ppc
541 cp -pPR "${S}"/include/asm-ppc/* ${D}/${ddir}/asm-ppc
542 fi
543 ;;
544 *)
545 dodir ${ddir}/asm
546 cp -pPR "${S}"/include/asm/* ${D}/${ddir}/asm
547 ;;
548 esac
549 if [[ -n ${multi_dirs} ]] ; then
550 local d ml_inc=""
551 for d in ${multi_dirs} ; do
552 dodir ${ddir}/asm-${d}
553 cp -pPR "${S}"/include/asm-${d}/* ${D}/${ddir}/asm-${d}/ || die "cp asm-${d} failed"
554
555 ml_inc="${ml_inc} ${multi_defs%% *}:${ddir}/asm-${d}"
556 multi_defs=${multi_defs#* }
557 done
558 create_ml_includes ${ddir}/asm ${ml_inc}
559 fi
560
561 if kernel_is 2 6; then
562 dodir ${ddir}/asm-generic
563 cp -pPR "${S}"/include/asm-generic/* ${D}/${ddir}/asm-generic
564 fi
565
566 # clean up
567 find "${D}" -name '*.orig' -exec rm -f {} \;
568
569 cd ${OLDPWD}
570 }
571
572 install_sources() {
573 local file
574
575 cd "${S}"
576 dodir /usr/src
577 echo ">>> Copying sources ..."
578
579 file="$(find ${WORKDIR} -iname "docs" -type d)"
580 if [[ -n ${file} ]]; then
581 for file in $(find ${file} -type f); do
582 echo "${file//*docs\/}" >> "${S}"/patches.txt
583 echo "===================================================" >> "${S}"/patches.txt
584 cat ${file} >> "${S}"/patches.txt
585 echo "===================================================" >> "${S}"/patches.txt
586 echo "" >> "${S}"/patches.txt
587 done
588 fi
589
590 if [[ ! -f ${S}/patches.txt ]]; then
591 # patches.txt is empty so lets use our ChangeLog
592 [[ -f ${FILESDIR}/../ChangeLog ]] && \
593 echo "Please check the ebuild ChangeLog for more details." \
594 > "${S}"/patches.txt
595 fi
596
597 mv ${WORKDIR}/linux* ${D}/usr/src
598 }
599
600 # pkg_preinst functions
601 #==============================================================
602 preinst_headers() {
603 local ddir=$(kernel_header_destdir)
604 [[ -L ${ddir}/linux ]] && rm ${ddir}/linux
605 [[ -L ${ddir}/asm ]] && rm ${ddir}/asm
606 }
607
608 # pkg_postinst functions
609 #==============================================================
610 postinst_sources() {
611 local MAKELINK=0
612
613 # if we have USE=symlink, then force K_SYMLINK=1
614 use symlink && K_SYMLINK=1
615
616 # if we are to forcably symlink, delete it if it already exists first.
617 if [[ ${K_SYMLINK} > 0 ]]; then
618 [[ -h ${ROOT}usr/src/linux ]] && rm ${ROOT}usr/src/linux
619 MAKELINK=1
620 fi
621
622 # if the link doesnt exist, lets create it
623 [[ ! -h ${ROOT}usr/src/linux ]] && MAKELINK=1
624
625 if [[ ${MAKELINK} == 1 ]]; then
626 cd ${ROOT}usr/src
627 ln -sf linux-${KV_FULL} linux
628 cd ${OLDPWD}
629 fi
630
631 # Don't forget to make directory for sysfs
632 [[ ! -d ${ROOT}sys ]] && kernel_is 2 6 && mkdir ${ROOT}sys
633
634 echo
635 einfo "If you are upgrading from a previous kernel, you may be interested"
636 einfo "in the following documents:"
637 einfo " - General upgrade guide: http://www.gentoo.org/doc/en/kernel-upgrade.xml"
638 kernel_is_2_6 && einfo " - 2.4 to 2.6 migration guide: http://www.gentoo.org/doc/en/migration-to-2.6.xml"
639 if kernel_is ge 2 6 13; then
640 ewarn "As of 2.6.13 the support for devfs has been removed."
641 ewarn "You will be required to either manage a static /dev"
642 ewarn "or to ensure that udev is starting on boot."
643 fi
644 echo
645
646 # if K_EXTRAEINFO is set then lets display it now
647 if [[ -n ${K_EXTRAEINFO} ]]; then
648 echo ${K_EXTRAEINFO} | fmt |
649 while read -s ELINE; do einfo "${ELINE}"; done
650 fi
651
652 # if K_EXTRAEWARN is set then lets display it now
653 if [[ -n ${K_EXTRAEWARN} ]]; then
654 echo ${K_EXTRAEWARN} | fmt |
655 while read -s ELINE; do ewarn "${ELINE}"; done
656 fi
657
658 # optionally display security unsupported message
659 if [[ -n ${K_SECURITY_UNSUPPORTED} ]]; then
660 echo
661 ewarn "${PN} is UNSUPPORTED by Gentoo Security."
662 ewarn "This means that it is likely to be vulnerable to recent security issues."
663 ewarn "For specific information on why this kernel is unsupported, please read:"
664 ewarn "http://www.gentoo.org/proj/en/security/kernel.xml"
665 fi
666 }
667
668 postinst_headers() {
669 einfo "Kernel headers are usually only used when recompiling glibc, as such, following the installation"
670 einfo "of newer headers, it is advised that you re-merge glibc as follows:"
671 einfo "emerge glibc"
672 einfo "Failure to do so will cause glibc to not make use of newer features present in the updated kernel"
673 einfo "headers."
674 }
675
676 # pkg_setup functions
677 #==============================================================
678 setup_headers() {
679 [[ -z ${H_SUPPORTEDARCH} ]] && H_SUPPORTEDARCH=${PN/-*/}
680 for i in ${H_SUPPORTEDARCH}; do
681 [[ $(tc-arch) == "${i}" ]] && H_ACCEPT_ARCH="yes"
682 done
683
684 if [[ ${H_ACCEPT_ARCH} != "yes" ]]; then
685 echo
686 eerror "This version of ${PN} does not support $(tc-arch)."
687 eerror "Please merge the appropriate sources, in most cases"
688 eerror "(but not all) this will be called $(tc-arch)-headers."
689 die "Package unsupported for $(tc-arch)"
690 fi
691 }
692
693 # unipatch
694 #==============================================================
695 unipatch() {
696 local i x y z extention PIPE_CMD UNIPATCH_DROP KPATCH_DIR PATCH_DEPTH ELINE
697 local STRICT_COUNT PATCH_LEVEL myLC_ALL myLANG extglob_bak
698
699 # set to a standard locale to ensure sorts are ordered properly.
700 myLC_ALL="${LC_ALL}"
701 myLANG="${LANG}"
702 LC_ALL="C"
703 LANG=""
704
705 [ -z "${KPATCH_DIR}" ] && KPATCH_DIR="${WORKDIR}/patches/"
706 [ ! -d ${KPATCH_DIR} ] && mkdir -p ${KPATCH_DIR}
707
708 # We're gonna need it when doing patches with a predefined patchlevel
709 extglob_bak=$(shopt -p extglob)
710 shopt -s extglob
711
712 # This function will unpack all passed tarballs, add any passed patches, and remove any passed patchnumbers
713 # usage can be either via an env var or by params
714 # although due to the nature we pass this within this eclass
715 # it shall be by param only.
716 # -z "${UNIPATCH_LIST}" ] && UNIPATCH_LIST="${@}"
717 UNIPATCH_LIST="${@}"
718
719 #unpack any passed tarballs
720 for i in ${UNIPATCH_LIST}; do
721 if [ -n "$(echo ${i} | grep -e "\.tar" -e "\.tbz" -e "\.tgz")" ]; then
722 extention=${i/*./}
723 extention=${extention/:*/}
724 case ${extention} in
725 tbz2) PIPE_CMD="tar -xvjf";;
726 bz2) PIPE_CMD="tar -xvjf";;
727 tgz) PIPE_CMD="tar -xvzf";;
728 gz) PIPE_CMD="tar -xvzf";;
729 *) eerror "Unrecognized tarball compression"
730 die "Unrecognized tarball compression";;
731 esac
732
733 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
734 unset z
735 STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
736 for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
737 do z="${z}0";
738 done
739 PATCH_ORDER="${z}${STRICT_COUNT}"
740
741 mkdir -p ${KPATCH_DIR}/${PATCH_ORDER}/
742 ${PIPE_CMD} ${i/:*/} -C ${KPATCH_DIR}/${PATCH_ORDER}/ 1>/dev/null
743 else
744 ${PIPE_CMD} ${i/:*/} -C ${KPATCH_DIR} 1>/dev/null
745 fi
746
747 if [ $? == 0 ]; then
748 einfo "${i/*\//} unpacked"
749 [ -n "$(echo ${i} | grep ':')" ] && echo ">>> Strict patch levels not currently supported for tarballed patchsets"
750 else
751 eerror "Failed to unpack ${i/:*/}"
752 die "unable to unpack patch tarball"
753 fi
754 else
755 extention=${i/*./}
756 extention=${extention/:*/}
757 PIPE_CMD=""
758 case ${extention} in
759 bz2) PIPE_CMD="bzip2 -dc";;
760 patch) PIPE_CMD="cat";;
761 diff) PIPE_CMD="cat";;
762 gz|Z|z) PIPE_CMD="gzip -dc";;
763 ZIP|zip) PIPE_CMD="unzip -p";;
764 *) UNIPATCH_DROP="${UNIPATCH_DROP} ${i/:*/}";;
765 esac
766
767 PATCH_LEVEL=${i/*([^:])?(:)}
768 i=${i/:*/}
769 x=${i/*\//}
770 x=${x/\.${extention}/}
771
772 if [ -n "${PIPE_CMD}" ]; then
773 if [ ! -r "${i}" ]; then
774 echo
775 eerror "FATAL: unable to locate:"
776 eerror "${i}"
777 eerror "for read-only. The file either has incorrect permissions"
778 eerror "or does not exist."
779 die Unable to locate ${i}
780 fi
781
782 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
783 unset z
784 STRICT_COUNT=$((10#${STRICT_COUNT} + 1))
785 for((y=0; y<$((6 - ${#STRICT_COUNT})); y++));
786 do z="${z}0";
787 done
788 PATCH_ORDER="${z}${STRICT_COUNT}"
789
790 mkdir -p ${KPATCH_DIR}/${PATCH_ORDER}/
791 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${PATCH_ORDER}/${x}.patch${PATCH_LEVEL})
792 else
793 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${x}.patch${PATCH_LEVEL})
794 fi
795 fi
796 fi
797 done
798
799 #populate KPATCH_DIRS so we know where to look to remove the excludes
800 x=${KPATCH_DIR}
801 KPATCH_DIR=""
802 for i in $(find ${x} -type d | sort -n); do
803 KPATCH_DIR="${KPATCH_DIR} ${i}"
804 done
805
806 #so now lets get rid of the patchno's we want to exclude
807 UNIPATCH_DROP="${UNIPATCH_EXCLUDE} ${UNIPATCH_DROP}"
808 for i in ${UNIPATCH_DROP}; do
809 ebegin "Excluding Patch #${i}"
810 for x in ${KPATCH_DIR}; do rm -f ${x}/${i}* 2>/dev/null; done
811 eend $?
812 done
813
814 # and now, finally, we patch it :)
815 for x in ${KPATCH_DIR}; do
816 for i in $(find ${x} -maxdepth 1 -iname "*.patch*" -or -iname "*.diff*" | sort -n); do
817 STDERR_T="${T}/${i/*\//}"
818 STDERR_T="${STDERR_T/.patch*/.err}"
819
820 [ -z ${i/*.patch*/} ] && PATCH_DEPTH=${i/*.patch/}
821 #[ -z ${i/*.diff*/} ] && PATCH_DEPTH=${i/*.diff/}
822
823 if [ -z "${PATCH_DEPTH}" ]; then PATCH_DEPTH=0; fi
824
825 ebegin "Applying ${i/*\//} (-p${PATCH_DEPTH}+)"
826 while [ ${PATCH_DEPTH} -lt 5 ]; do
827 echo "Attempting Dry-run:" >> ${STDERR_T}
828 echo "cmd: patch -p${PATCH_DEPTH} --no-backup-if-mismatch --dry-run -f < ${i}" >> ${STDERR_T}
829 echo "=======================================================" >> ${STDERR_T}
830 if [ $(patch -p${PATCH_DEPTH} --no-backup-if-mismatch --dry-run -f < ${i} >> ${STDERR_T}) $? -eq 0 ]; then
831 echo "Attempting patch:" > ${STDERR_T}
832 echo "cmd: patch -p${PATCH_DEPTH} --no-backup-if-mismatch -f < ${i}" >> ${STDERR_T}
833 echo "=======================================================" >> ${STDERR_T}
834 if [ $(patch -p${PATCH_DEPTH} --no-backup-if-mismatch -f < ${i} >> ${STDERR_T}) "$?" -eq 0 ]; then
835 eend 0
836 rm ${STDERR_T}
837 break
838 else
839 eend 1
840 eerror "Failed to apply patch ${i/*\//}"
841 eerror "Please attach ${STDERR_T} to any bug you may post."
842 die "Failed to apply ${i/*\//}"
843 fi
844 else
845 PATCH_DEPTH=$((${PATCH_DEPTH} + 1))
846 fi
847 done
848 if [ ${PATCH_DEPTH} -eq 5 ]; then
849 eend 1
850 eerror "Please attach ${STDERR_T} to any bug you may post."
851 die "Unable to dry-run patch."
852 fi
853 done
854 done
855
856 # This is a quick, and kind of nasty hack to deal with UNIPATCH_DOCS which
857 # sit in KPATCH_DIR's. This is handled properly in the unipatch rewrite,
858 # which is why I'm not taking too much time over this.
859 local tmp
860 for i in ${UNIPATCH_DOCS}; do
861 tmp="${tmp} ${i//*\/}"
862 cp -f ${i} ${T}/
863 done
864 UNIPATCH_DOCS="${tmp}"
865
866 # clean up KPATCH_DIR's - fixes bug #53610
867 for x in ${KPATCH_DIR}; do rm -Rf ${x}; done
868
869 LC_ALL="${myLC_ALL}"
870 LANG="${myLANG}"
871 eval ${extglob_bak}
872 }
873
874 # getfilevar accepts 2 vars as follows:
875 # getfilevar <VARIABLE> <CONFIGFILE>
876 # pulled from linux-info
877
878 getfilevar() {
879 local workingdir basefname basedname xarch=$(tc-arch-kernel)
880
881 if [[ -z ${1} ]] && [[ ! -f ${2} ]]; then
882 echo -e "\n"
883 eerror "getfilevar requires 2 variables, with the second a valid file."
884 eerror " getfilevar <VARIABLE> <CONFIGFILE>"
885 else
886 workingdir=${PWD}
887 basefname=$(basename ${2})
888 basedname=$(dirname ${2})
889 unset ARCH
890
891 cd ${basedname}
892 echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
893 make ${BUILD_FIXES} -s -f - e 2>/dev/null
894 cd ${workingdir}
895
896 ARCH=${xarch}
897 fi
898 }
899
900 detect_arch() {
901 # This function sets ARCH_URI and ARCH_PATCH
902 # with the neccessary info for the arch sepecific compatibility
903 # patchsets.
904
905 local ALL_ARCH LOOP_ARCH COMPAT_URI i
906
907 # COMPAT_URI is the contents of ${ARCH}_URI
908 # ARCH_URI is the URI for all the ${ARCH}_URI patches
909 # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
910
911 ARCH_URI=""
912 ARCH_PATCH=""
913 ALL_ARCH="ALPHA AMD64 ARM HPPA IA64 M68K MIPS PPC PPC64 S390 SH SPARC X86"
914
915 for LOOP_ARCH in ${ALL_ARCH}; do
916 COMPAT_URI="${LOOP_ARCH}_URI"
917 COMPAT_URI="${!COMPAT_URI}"
918
919 [[ -n ${COMPAT_URI} ]] && \
920 ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr '[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
921
922 if [[ ${LOOP_ARCH} == "$(echo $(tc-arch-kernel) | tr '[:lower:]' '[:upper:]')" ]]; then
923 for i in ${COMPAT_URI}; do
924 ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
925 done
926 fi
927 done
928 }
929
930 # sparc nastiness
931 #==============================================================
932 # This script generates the files in /usr/include/asm for sparc systems
933 # during installation of sys-kernel/linux-headers.
934 # Will no longer be needed when full 64 bit support is used on sparc64
935 # systems.
936 #
937 # Shamefully ripped from Debian
938 # ----------------------------------------------------------------------
939
940 # Idea borrowed from RedHat's kernel package
941
942 # This is gonna get replaced by something in multilib.eclass soon...
943 # --eradicator
944 generate_sparc_asm() {
945 local name
946
947 cd $1 || die
948 mkdir asm
949
950 for h in `( ls asm-sparc; ls asm-sparc64 ) | grep '\.h$' | sort -u`; do
951 name="$(echo $h | tr a-z. A-Z_)"
952 # common header
953 echo "/* All asm/ files are generated and point to the corresponding
954 * file in asm-sparc or asm-sparc64.
955 */
956
957 #ifndef __SPARCSTUB__${name}__
958 #define __SPARCSTUB__${name}__
959 " > asm/${h}
960
961 # common for sparc and sparc64
962 if [ -f asm-sparc/$h -a -f asm-sparc64/$h ]; then
963 echo "#ifdef __arch64__
964 #include <asm-sparc64/$h>
965 #else
966 #include <asm-sparc/$h>
967 #endif
968 " >> asm/${h}
969
970 # sparc only
971 elif [ -f asm-sparc/$h ]; then
972 echo "#ifndef __arch64__
973 #include <asm-sparc/$h>
974 #endif
975 " >> asm/${h}
976
977 # sparc64 only
978 else
979 echo "#ifdef __arch64__
980 #include <asm-sparc64/$h>
981 #endif
982 " >> asm/${h}
983 fi
984
985 # common footer
986 echo "#endif /* !__SPARCSTUB__${name}__ */" >> asm/${h}
987 done
988 return 0
989 }
990
991 headers___fix() {
992 # Voodoo to partially fix broken upstream headers.
993 # Issues with this function should go to toolchain.
994 sed -i \
995 -e '/^\#define.*_TYPES_H/{:loop n; bloop}' \
996 -e 's:\<\([us]\(8\|16\|32\|64\)\)\>:__\1:g' \
997 -e "s/ inline / __inline__ /g" \
998 "$@"
999 }
1000
1001 # common functions
1002 #==============================================================
1003 kernel-2_src_unpack() {
1004 universal_unpack
1005 debug-print "Doing unipatch"
1006
1007 [[ -n ${UNIPATCH_LIST} || -n ${UNIPATCH_LIST_DEFAULT} || -n ${UNIPATCH_LIST_GENPATCHES} ]] && \
1008 unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST_GENPATCHES} ${UNIPATCH_LIST}"
1009
1010 debug-print "Doing premake"
1011
1012 # allow ebuilds to massage the source tree after patching but before
1013 # we run misc `make` functions below
1014 [[ $(type -t kernel-2_hook_premake) == "function" ]] && kernel-2_hook_premake
1015
1016 debug-print "Doing unpack_set_extraversion"
1017
1018 [[ -z ${K_NOSETEXTRAVERSION} ]] && unpack_set_extraversion
1019 unpack_fix_install_path
1020
1021 # Setup xmakeopts and cd into sourcetree.
1022 env_setup_xmakeopts
1023 cd "${S}"
1024
1025 # We dont need a version.h for anything other than headers
1026 # at least, I should hope we dont. If this causes problems
1027 # take out the if/fi block and inform me please.
1028 # unpack_2_6 should now be 2.6.17 safe anyways
1029 if [[ ${ETYPE} == headers ]]; then
1030 kernel_is 2 4 && unpack_2_4
1031 kernel_is 2 6 && unpack_2_6
1032 fi
1033 }
1034
1035 kernel-2_src_compile() {
1036 cd "${S}"
1037 [[ ${ETYPE} == headers ]] && compile_headers
1038 }
1039
1040 kernel-2_pkg_preinst() {
1041 [[ ${ETYPE} == headers ]] && preinst_headers
1042 }
1043
1044 kernel-2_src_install() {
1045 install_universal
1046 [[ ${ETYPE} == headers ]] && install_headers
1047 [[ ${ETYPE} == sources ]] && install_sources
1048 }
1049
1050 kernel-2_pkg_postinst() {
1051 [[ ${ETYPE} == headers ]] && postinst_headers
1052 [[ ${ETYPE} == sources ]] && postinst_sources
1053 }
1054
1055 kernel-2_pkg_setup() {
1056 if kernel_is 2 4; then
1057 if [ "$( gcc-major-version )" -eq "4" ] ; then
1058 echo
1059 ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with linux-2.4!"
1060 ewarn "Either switch to another gcc-version (via gcc-config) or use a"
1061 ewarn "newer kernel that supports gcc-4."
1062 echo
1063 ewarn "Also be aware that bugreports about gcc-4 not working"
1064 ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"
1065 echo
1066 epause 10
1067 fi
1068 fi
1069
1070 ABI="${KERNEL_ABI}"
1071 [[ ${ETYPE} == headers ]] && setup_headers
1072 [[ ${ETYPE} == sources ]] && echo ">>> Preparing to unpack ..."
1073 }

  ViewVC Help
Powered by ViewVC 1.1.20