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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.172 - (show annotations) (download)
Wed May 3 11:10:11 2006 UTC (13 years, 1 month ago) by johnm
Branch: MAIN
Changes since 1.171: +19 -16 lines
provide fix for 2.6.17 make of version.h depending on oldconfig and throwing an error if the .config is not valid, dont call the special unpack conditions for sources (we dont need to). This should be 2.4-2.6.17+ safe

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

  ViewVC Help
Powered by ViewVC 1.1.20