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

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.232

  ViewVC Help
Powered by ViewVC 1.1.20