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

Diff of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.207

  ViewVC Help
Powered by ViewVC 1.1.20