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

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

  ViewVC Help
Powered by ViewVC 1.1.20