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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.98 - (hide annotations) (download)
Wed Feb 9 21:07:14 2005 UTC (14 years, 4 months ago) by hollow
Branch: MAIN
Changes since 1.97: +4 -2 lines
fixed universal_unpack

1 vapier 1.75 # Copyright 1999-2005 Gentoo Foundation
2 johnm 1.13 # Distributed under the terms of the GNU General Public License v2
3 hollow 1.98 # $Header: /var/cvsroot/gentoo-x86/eclass/kernel-2.eclass,v 1.97 2005/02/09 11:23:25 johnm Exp $
4 johnm 1.13
5 johnm 1.54 # Description: kernel.eclass rewrite for a clean base regarding the 2.6
6     # series of kernel with back-compatibility for 2.4
7 johnm 1.3 #
8 johnm 1.54 # Maintainer: John Mylchreest <johnm@gentoo.org>
9 johnm 1.93 # Copyright 2005 Gentoo Linux
10 johnm 1.3 #
11     # Please direct your bugs to the current eclass maintainer :)
12 johnm 1.1
13     # added functionality:
14     # unipatch - a flexible, singular method to extract, add and remove patches.
15    
16 johnm 1.54 # A Couple of env vars are available to effect usage of this eclass
17 johnm 1.1 # These are as follows:
18     #
19 johnm 1.93 # 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
23 johnm 1.55 # K_NOSETEXTRAVERSION - if this is set then EXTRAVERSION will not be
24     # automatically set within the kernel Makefile
25     # K_NOUSENAME - if this is set then EXTRAVERSION will not include the
26     # first part of ${PN} in EXTRAVERSION
27 lu_zero 1.62 # K_PREPATCHED - if the patchset is prepatched (ie: mm-sources,
28     # ck-sources, ac-sources) it will use PR (ie: -r5) as
29     # the patchset version for
30 johnm 1.93 # and not use it as a true package revision
31 johnm 1.55 # K_EXTRAEINFO - this is a new-line seperated list of einfo displays in
32 lu_zero 1.62 # postinst and can be used to carry additional postinst
33 johnm 1.55 # messages
34     # K_EXTRAEWARN - same as K_EXTRAEINFO except ewarn's instead of einfo's
35 johnm 1.78 # K_SYMLINK - if this is set, then forcably create symlink anyway
36 johnm 1.55
37     # H_SUPPORTEDARCH - this should be a space separated list of ARCH's which
38     # can be supported by the headers ebuild
39    
40     # UNIPATCH_LIST - space delimetered list of patches to be applied to the
41     # kernel
42     # UNIPATCH_EXCLUDE - an addition var to support exlusion based completely
43     # on "<passedstring>*" and not "<passedno#>_*"
44 lu_zero 1.62 # - this should _NOT_ be used from the ebuild as this is
45 johnm 1.55 # reserved for end users passing excludes from the cli
46 lu_zero 1.62 # UNIPATCH_DOCS - space delimemeted list of docs to be installed to
47 johnm 1.55 # the doc dir
48 lu_zero 1.62 # UNIPATCH_STRICTORDER - if this is set places patches into directories of
49 johnm 1.55 # order, so they are applied in the order passed
50 johnm 1.1
51 eradicator 1.79 inherit toolchain-funcs versionator multilib
52 johnm 1.1 ECLASS="kernel-2"
53 plasmaroo 1.33 INHERITED="$INHERITED $ECLASS"
54 johnm 1.93 EXPORT_FUNCTIONS pkg_setup src_unpack src_compile src_install \
55     pkg_preinst pkg_postinst
56 johnm 1.1
57 vapier 1.75 export CTARGET=${CTARGET:-${CHOST}}
58 hollow 1.96 if [[ ${CTARGET} == ${CHOST} && ${CATEGORY/cross-} != ${CATEGORY} ]]; then
59 hollow 1.95 export CTARGET=${CATEGORY/cross-}
60 vapier 1.75 fi
61 vapier 1.60
62 lu_zero 1.62 HOMEPAGE="http://www.kernel.org/ http://www.gentoo.org/"
63 johnm 1.1 LICENSE="GPL-2"
64    
65 johnm 1.18 # set LINUX_HOSTCFLAGS if not already set
66 johnm 1.93 [ -z "$LINUX_HOSTCFLAGS" ] && \
67     LINUX_HOSTCFLAGS="-Wall -Wstrict-prototypes -Os -fomit-frame-pointer -I${S}/include"
68 johnm 1.18
69 johnm 1.54 #Eclass functions only from here onwards ...
70 plasmaroo 1.33 #==============================================================
71     kernel_is() {
72 johnm 1.94 [[ -z ${OKV} ]] && return 1
73 johnm 1.93 local operator test value x=0 y=0 z=0
74 johnm 1.67
75 johnm 1.93 case ${1} in
76     lt) operator="-lt"; shift;;
77     gt) operator="-gt"; shift;;
78     le) operator="-le"; shift;;
79     ge) operator="-ge"; shift;;
80     eq) operator="-eq"; shift;;
81     *) operator="-eq";;
82     esac
83    
84     for x in ${@}; do
85     for((y=0; y<$((3 - ${#x})); y++)); do value="${value}0"; done
86     value="${value}${x}"
87     z=$((${z} + 1))
88    
89     case ${z} in
90     1) for((y=0; y<$((3 - ${#KV_MAJOR})); y++)); do test="${test}0"; done;
91     test="${test}${KV_MAJOR}";;
92     2) for((y=0; y<$((3 - ${#KV_MINOR})); y++)); do test="${test}0"; done;
93     test="${test}${KV_MINOR}";;
94     3) for((y=0; y<$((3 - ${#KV_PATCH})); y++)); do test="${test}0"; done;
95     test="${test}${KV_PATCH}";;
96     *) die "Error in kernel-2_kernel_is(): Too many parameters.";;
97     esac
98     done
99 johnm 1.69
100 johnm 1.93 [ ${test} ${operator} ${value} ] && return 0 || return 1
101 plasmaroo 1.33 }
102 johnm 1.18
103 johnm 1.64
104 johnm 1.18 kernel_is_2_4() {
105 johnm 1.56 kernel_is 2 4
106 johnm 1.18 }
107    
108     kernel_is_2_6() {
109 johnm 1.78 kernel_is 2 6 || kernel_is 2 5
110 johnm 1.18 }
111    
112 vapier 1.60 kernel_header_destdir() {
113 vapier 1.75 [[ ${CTARGET} == ${CHOST} ]] \
114 vapier 1.60 && echo /usr/include \
115     || echo /usr/${CTARGET}/include
116     }
117    
118 plasmaroo 1.33 # Capture the sources type and set DEPENDs
119 hollow 1.95 if [[ ${ETYPE} == sources ]]; then
120 johnm 1.1 DEPEND="!build? ( sys-apps/sed
121 johnm 1.93 >=sys-devel/binutils-2.11.90.0.31 )
122     doc? ( app-text/docbook-sgml-utils )"
123 johnm 1.1 RDEPEND="${DEPEND}
124 johnm 1.93 !build? ( >=sys-libs/ncurses-5.2
125     sys-devel/make )"
126 lu_zero 1.62
127 johnm 1.78 PROVIDE="virtual/linux-sources"
128     kernel_is gt 2 4 && PROVIDE="${PROVIDE} virtual/alsa"
129 johnm 1.72 SLOT="${PVR}"
130     DESCRIPTION="Sources for the Linux kernel"
131 johnm 1.84 IUSE="${IUSE} symlink build doc"
132 hollow 1.95 elif [[ ${ETYPE} == headers ]]; then
133 johnm 1.72 DESCRIPTION="Linux system headers"
134     IUSE="${IUSE}"
135    
136 hollow 1.95 if [[ ${CTARGET} = ${CHOST} ]]; then
137 johnm 1.72 DEPEND="!virtual/os-headers"
138     PROVIDE="virtual/kernel virtual/os-headers"
139     SLOT="0"
140     else
141     SLOT="${CTARGET}"
142     fi
143 johnm 1.1 else
144 johnm 1.55 eerror "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
145 johnm 1.93 die "Unknown ETYPE=\"${ETYPE}\", must be \"sources\" or \"headers\""
146 johnm 1.1 fi
147    
148     # Unpack functions
149     #==============================================================
150     unpack_2_4() {
151     cd ${S}
152 lu_zero 1.62 # this file is required for other things to build properly,
153 johnm 1.1 # so we autogenerate it
154     make mrproper || die "make mrproper died"
155     make include/linux/version.h || die "make include/linux/version.h failed"
156     echo ">>> version.h compiled successfully."
157     }
158    
159     universal_unpack() {
160 plasmaroo 1.33 cd ${WORKDIR}
161     unpack linux-${OKV}.tar.bz2
162 hollow 1.98 if [[ "${OKV}" != "${KV_FULL}" ]]; then
163     mv linux-${OKV} linux-${KV_FULL} \
164 johnm 1.55 || die "Unable to move source tree to ${KV_FULL}."
165 hollow 1.98 fi
166 plasmaroo 1.33 cd ${S}
167 lu_zero 1.62
168 johnm 1.41 # change incorrect install path
169 johnm 1.55 sed -ie 's:#export\tINSTALL_PATH:export\tINSTALL_PATH:' Makefile
170 lu_zero 1.62
171 johnm 1.1 # remove all backup files
172     find . -iname "*~" -exec rm {} \; 2> /dev/null
173    
174 johnm 1.93 if [[ -d ${S}/Documentation/DocBook ]]; then
175 johnm 1.1 cd ${S}/Documentation/DocBook
176 johnm 1.93 sed -ie "s:db2:docbook2:g" Makefile
177     cd ${OLDPWD}
178 johnm 1.1 fi
179 johnm 1.93
180 johnm 1.78 # fix a problem on ppc where TOUT writes to /usr/src/linux breaking sandbox
181 lu_zero 1.62 use ppc && \
182 johnm 1.93 sed -ie 's|TOUT := .tmp_gas_check|TOUT := $(T).tmp_gas_check|' \
183     ${S}/arch/ppc/Makefile
184 johnm 1.1 }
185    
186     unpack_set_extraversion() {
187     cd ${S}
188 johnm 1.55 sed -ie "s:^\(EXTRAVERSION =\).*:\1 ${EXTRAVERSION}:" Makefile
189 johnm 1.93 cd ${OLDPWD}
190 johnm 1.1 }
191    
192     # Compile Functions
193     #==============================================================
194     compile_headers() {
195 vapier 1.75 # if we couldnt obtain HOSTCFLAGS from the Makefile,
196     # then set it to something sane
197 johnm 1.74 local HOSTCFLAGS=$(getfilevar HOSTCFLAGS ${S}/Makefile)
198 vapier 1.75 HOSTCFLAGS=${HOSTCFLAGS:--Wall -Wstrict-prototypes -O2 -fomit-frame-pointer}
199    
200     # Kernel ARCH != portage ARCH
201 vapier 1.86 local KARCH=$(tc-arch-kernel)
202 vapier 1.75
203     # When cross-compiling, we need to set the ARCH/CROSS_COMPILE
204     # variables properly or bad things happen !
205     local xmakeopts="ARCH=${KARCH}"
206 johnm 1.93 if [[ ${CTARGET} != ${CHOST} ]]; then
207 vapier 1.75 xmakeopts="${xmakeopts} CROSS_COMPILE=${CTARGET}-"
208 hollow 1.95 elif type -p ${CHOST}-ar; then
209 vapier 1.75 xmakeopts="${xmakeopts} CROSS_COMPILE=${CHOST}-"
210     fi
211    
212 johnm 1.93 if kernel_is 2 4; then
213 vapier 1.75 yes "" | make oldconfig ${xmakeopts}
214 johnm 1.72 echo ">>> make oldconfig complete"
215 vapier 1.75 use sparc && make dep ${xmakeopts}
216 hollow 1.95 elif kernel_is 2 6; then
217 johnm 1.72 # autoconf.h isnt generated unless it already exists. plus, we have
218     # no guarantee that any headers are installed on the system...
219 vapier 1.75 [[ -f ${ROOT}/usr/include/linux/autoconf.h ]] \
220 johnm 1.72 || touch include/linux/autoconf.h
221    
222     # if there arent any installed headers, then there also isnt an asm
223     # symlink in /usr/include/, and make defconfig will fail, so we have
224     # to force an include path with $S.
225 vapier 1.75 HOSTCFLAGS="${HOSTCFLAGS} -I${S}/include/"
226     ln -sf asm-${KARCH} "${S}"/include/asm
227     make defconfig HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "defconfig failed"
228     make prepare HOSTCFLAGS="${HOSTCFLAGS}" ${xmakeopts} || die "prepare failed"
229 johnm 1.72 fi
230 johnm 1.1 }
231    
232 spock 1.37 compile_manpages() {
233 johnm 1.54 einfo "Making manpages ..."
234 vapier 1.75 env -u ARCH make mandocs
235 spock 1.37 }
236    
237 johnm 1.1 # install functions
238     #==============================================================
239     install_universal() {
240     #fix silly permissions in tarball
241     cd ${WORKDIR}
242     chown -R root:root *
243     chmod -R a+r-w+X,u+w *
244 johnm 1.93 cd ${OLDPWD}
245 johnm 1.1 }
246    
247     install_headers() {
248 johnm 1.72 local ddir=$(kernel_header_destdir)
249 vapier 1.60
250 johnm 1.1 cd ${S}
251 vapier 1.60 dodir ${ddir}/linux
252     cp -ax ${S}/include/linux/* ${D}/${ddir}/linux
253     rm -rf ${D}/${ddir}/linux/modules
254 johnm 1.72 dodir ${ddir}/asm
255 lu_zero 1.62
256 johnm 1.93 if [[ $(tc-arch-kernel) == "sparc64" ]]; then
257 eradicator 1.76 rm -Rf ${D}/${ddir}/asm
258 johnm 1.72 dodir ${ddir}/asm-sparc
259     dodir ${ddir}/asm-sparc64
260     cp -ax ${S}/include/asm-sparc/* ${D}/usr/include/asm-sparc
261     cp -ax ${S}/include/asm-sparc64/* ${D}/usr/include/asm-sparc64
262 eradicator 1.79 #generate_sparc_asm ${D}/usr/include
263     create_ml_includes /usr/include/asm __sparc__:/usr/include/asm-sparc __sparc64__:/usr/include/asm-sparc64
264 johnm 1.93 elif [[ $(tc-arch-kernel) == "x86_64" ]]; then
265 eradicator 1.76 rm -Rf ${D}/${ddir}/asm
266     dodir ${ddir}/asm-i386
267     dodir ${ddir}/asm-x86_64
268     cp -ax ${S}/include/asm-i386/* ${D}/usr/include/asm-i386
269     cp -ax ${S}/include/asm-x86_64/* ${D}/usr/include/asm-x86_64
270 eradicator 1.79 #/bin/sh ${FILESDIR}/generate-asm-amd64 ${D}/usr/include
271     create_ml_includes /usr/include/asm __i386__:/usr/include/asm-i386 __x86_64__:/usr/include/asm-x86_64
272 eradicator 1.76 else
273     cp -ax ${S}/include/asm/* ${D}/${ddir}/asm
274     fi
275    
276 johnm 1.93 if kernel_is 2 6; then
277 vapier 1.60 dodir ${ddir}/asm-generic
278     cp -ax ${S}/include/asm-generic/* ${D}/${ddir}/asm-generic
279 johnm 1.12 fi
280 johnm 1.93 cd ${OLDPWD}
281 johnm 1.1 }
282    
283     install_sources() {
284 johnm 1.93 local doc docs file
285 johnm 1.1
286 johnm 1.12 cd ${S}
287     dodir /usr/src
288 johnm 1.54 echo ">>> Copying sources ..."
289 johnm 1.93
290 johnm 1.27 file="$(find ${WORKDIR} -iname "docs" -type d)"
291 johnm 1.93 if [[ -n ${file} ]]; then
292     for file in $(find ${file} -type f); do
293     echo "${file//*docs\/}" >> ${S}/patches.txt
294 johnm 1.54 echo "===================================================" >> ${S}/patches.txt
295 johnm 1.27 cat ${file} >> ${S}/patches.txt
296 johnm 1.54 echo "===================================================" >> ${S}/patches.txt
297 johnm 1.12 echo "" >> ${S}/patches.txt
298 johnm 1.1 done
299 johnm 1.12 fi
300 johnm 1.1
301 johnm 1.93 if [[ ! -f ${S}/patches.txt ]]; then
302 johnm 1.12 # patches.txt is empty so lets use our ChangeLog
303 johnm 1.93 [[ -f ${FILESDIR}/../ChangeLog ]] && \
304     echo "Please check the ebuild ChangeLog for more details." \
305     > ${S}/patches.txt
306 johnm 1.12 fi
307    
308 hollow 1.95 for doc in ${UNIPATCH_DOCS}; do [[ -f ${doc} ]] && docs="${docs} ${doc}"; done
309     if [[ -f ${S}/patches.txt ]]; then docs="${docs} ${S}/patches.txt"; fi
310     use doc && ! use arm && ! use s390 && install_manpages
311     dodoc ${docs}
312 johnm 1.12
313     mv ${WORKDIR}/linux* ${D}/usr/src
314 johnm 1.1 }
315    
316 spock 1.37 install_manpages() {
317 johnm 1.85 sed -ie "s#/usr/local/man#${D}/usr/man#g" scripts/makeman
318 spock 1.39 ebegin "Installing manpages"
319 johnm 1.78 env -u ARCH make installmandocs
320 spock 1.37 eend $?
321 johnm 1.85 sed -ie "s#${D}/usr/man#/usr/local/man#g" scripts/makeman
322 spock 1.37 }
323    
324 johnm 1.1 # pkg_preinst functions
325     #==============================================================
326     preinst_headers() {
327 vapier 1.60 local ddir=$(kernel_header_destdir)
328 johnm 1.72 [[ -L ${ddir}/linux ]] && rm ${ddir}/linux
329     [[ -L ${ddir}/asm ]] && rm ${ddir}/asm
330 johnm 1.1 }
331    
332     # pkg_postinst functions
333     #==============================================================
334     postinst_sources() {
335 vapier 1.80 local MAKELINK=0
336 johnm 1.78
337 johnm 1.84 # if we have USE=symlink, then force K_SYMLINK=1
338     use symlink && K_SYMLINK=1
339    
340 johnm 1.78 # if we are to forcably symlink, delete it if it already exists first.
341 johnm 1.93 if [[ -n ${K_SYMLINK} ]]; then
342 vapier 1.80 [[ -h ${ROOT}usr/src/linux ]] && rm ${ROOT}usr/src/linux
343 johnm 1.78 MAKELINK=1
344     fi
345    
346     # if the link doesnt exist, lets create it
347 vapier 1.80 [[ ! -h ${ROOT}usr/src/linux ]] && MAKELINK=1
348 johnm 1.78
349 johnm 1.93 if [[ ${MAKELINK} == 1 ]]; then
350 johnm 1.89 cd ${ROOT}usr/src
351     ln -sf linux-${KV_FULL} linux
352     cd ${OLDPWD}
353     fi
354 johnm 1.1
355     # Don't forget to make directory for sysfs
356 hollow 1.95 [[ ! -d ${ROOT}sys ]] && kernel_is 2 6 && mkdir /sys
357 johnm 1.1
358     echo
359     einfo "After installing a new kernel of any version, it is important"
360     einfo "that you have the appropriate /etc/modules.autoload.d/kernel-X.Y"
361     einfo "created (X.Y is the first 2 parts of your new kernel version)"
362     echo
363     einfo "For example, this kernel will require:"
364     einfo "/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}"
365     echo
366 lu_zero 1.62
367 johnm 1.2 # if K_EXTRAEINFO is set then lets display it now
368 hollow 1.95 if [[ -n ${K_EXTRAEINFO} ]]; then
369 johnm 1.2 echo ${K_EXTRAEINFO} | fmt |
370 hollow 1.95 while read -s ELINE; do einfo "${ELINE}"; done
371 plasmaroo 1.33 fi
372    
373 iggy 1.7 # if K_EXTRAEWARN is set then lets display it now
374 hollow 1.95 if [[ -n ${K_EXTRAEWARN} ]]; then
375 iggy 1.7 echo ${K_EXTRAEWARN} | fmt |
376 hollow 1.95 while read -s ELINE; do ewarn "${ELINE}"; done
377 iggy 1.7 fi
378 johnm 1.1 }
379    
380 johnm 1.12 postinst_headers() {
381 johnm 1.72 einfo "Kernel headers are usually only used when recompiling glibc, as such, following the installation"
382     einfo "of newer headers, it is advised that you re-merge glibc as follows:"
383     einfo "emerge glibc"
384     einfo "Failure to do so will cause glibc to not make use of newer features present in the updated kernel"
385     einfo "headers."
386 johnm 1.12 }
387    
388     # pkg_setup functions
389     #==============================================================
390     setup_headers() {
391 vapier 1.86 [[ -z ${H_SUPPORTEDARCH} ]] && H_SUPPORTEDARCH=${PN/-*/}
392 hollow 1.95 for i in ${H_SUPPORTEDARCH}; do
393 vapier 1.87 [[ $(tc-arch) == "${i}" ]] && H_ACCEPT_ARCH="yes"
394 johnm 1.12 done
395 lu_zero 1.62
396 johnm 1.93 if [[ ${H_ACCEPT_ARCH} != "yes" ]]; then
397 johnm 1.12 echo
398     eerror "This version of ${PN} does not support ${ARCH}."
399     eerror "Please merge the appropriate sources, in most cases"
400 johnm 1.72 eerror "(but not all) this will be called ${ARCH}-headers."
401     die "Package unsupported for ${ARCH}"
402 johnm 1.12 fi
403     }
404    
405 johnm 1.1 # unipatch
406     #==============================================================
407     unipatch() {
408 hollow 1.95 local i x extention PIPE_CMD UNIPATCH_DROP KPATCH_DIR PATCH_DEPTH ELINE
409     local STRICT_COUNT PATCH_LEVEL myLC_ALL
410 johnm 1.78
411     # set to a standard locale to ensure sorts are ordered properly.
412     myLC_ALL="${LC_ALL}"
413     LC_ALL="C"
414 johnm 1.1
415     [ -z "${KPATCH_DIR}" ] && KPATCH_DIR="${WORKDIR}/patches/"
416     [ ! -d ${KPATCH_DIR} ] && mkdir -p ${KPATCH_DIR}
417    
418 johnm 1.41 # We're gonna need it when doing patches with a predefined patchlevel
419     shopt -s extglob
420    
421 johnm 1.54 # This function will unpack all passed tarballs, add any passed patches, and remove any passed patchnumbers
422 johnm 1.1 # usage can be either via an env var or by params
423 johnm 1.54 # although due to the nature we pass this within this eclass
424     # it shall be by param only.
425     # -z "${UNIPATCH_LIST}" ] && UNIPATCH_LIST="${@}"
426     UNIPATCH_LIST="${@}"
427 johnm 1.1
428     #unpack any passed tarballs
429 hollow 1.95 for i in ${UNIPATCH_LIST}; do
430     if [ -n "$(echo ${i} | grep -e "\.tar" -e "\.tbz" -e "\.tgz")" ]; then
431 johnm 1.1 extention=${i/*./}
432 johnm 1.41 extention=${extention/:*/}
433 johnm 1.1 case ${extention} in
434     tbz2) PIPE_CMD="tar -xvjf";;
435     bz2) PIPE_CMD="tar -xvjf";;
436     tgz) PIPE_CMD="tar -xvzf";;
437     gz) PIPE_CMD="tar -xvzf";;
438     *) eerror "Unrecognized tarball compression"
439     die "Unrecognized tarball compression";;
440     esac
441    
442 hollow 1.95 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
443 johnm 1.16 STRICT_COUNT=$((${STRICT_COUNT} + 1))
444     mkdir -p ${KPATCH_DIR}/${STRICT_COUNT}/
445 johnm 1.54 ${PIPE_CMD} ${i/:*/} -C ${KPATCH_DIR}/${STRICT_COUNT}/ 1>/dev/null
446 johnm 1.16 else
447 johnm 1.41 ${PIPE_CMD} ${i/:*/} -C ${KPATCH_DIR} 1>/dev/null
448 johnm 1.16 fi
449    
450 hollow 1.95 if [ $? == 0 ]; then
451 johnm 1.1 einfo "${i/*\//} unpacked"
452 johnm 1.54 [ -n "$(echo ${i} | grep ':')" ] && echo ">>> Strict patch levels not currently supported for tarballed patchsets"
453 johnm 1.1 else
454 johnm 1.41 eerror "Failed to unpack ${i/:*/}"
455 johnm 1.1 die "unable to unpack patch tarball"
456     fi
457 johnm 1.16 else
458 johnm 1.25 extention=${i/*./}
459 johnm 1.41 extention=${extention/:*/}
460 johnm 1.25 PIPE_CMD=""
461     case ${extention} in
462     bz2) PIPE_CMD="bzip2 -dc";;
463     patch) PIPE_CMD="cat";;
464     diff) PIPE_CMD="cat";;
465     gz|Z|z) PIPE_CMD="gzip -dc";;
466     ZIP|zip) PIPE_CMD="unzip -p";;
467 johnm 1.41 *) UNIPATCH_DROP="${UNIPATCH_DROP} ${i/:*/}";;
468 johnm 1.25 esac
469 johnm 1.41
470     PATCH_LEVEL=${i/*([^:])?(:)}
471     i=${i/:*/}
472 johnm 1.25 x=${i/*\//}
473     x=${x/\.${extention}/}
474 lu_zero 1.62
475 hollow 1.95 if [ -n "${PIPE_CMD}" ]; then
476     if [ ! -r "${i}" ]; then
477 johnm 1.29 echo
478     eerror "FATAL: unable to locate:"
479     eerror "${i}"
480 johnm 1.54 eerror "for read-only. The file either has incorrect permissions"
481     eerror "or does not exist."
482 johnm 1.29 die Unable to locate ${i}
483     fi
484 lu_zero 1.62
485 hollow 1.95 if [ -n "${UNIPATCH_STRICTORDER}" ]; then
486 johnm 1.29 STRICT_COUNT=$((${STRICT_COUNT} + 1))
487     mkdir -p ${KPATCH_DIR}/${STRICT_COUNT}/
488 johnm 1.54 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${STRICT_COUNT}/${x}.patch${PATCH_LEVEL})
489 johnm 1.29 else
490 johnm 1.41 $(${PIPE_CMD} ${i} > ${KPATCH_DIR}/${x}.patch${PATCH_LEVEL})
491 johnm 1.29 fi
492 johnm 1.25 fi
493 johnm 1.16 fi
494 johnm 1.1 done
495    
496     #populate KPATCH_DIRS so we know where to look to remove the excludes
497     x=${KPATCH_DIR}
498     KPATCH_DIR=""
499 hollow 1.95 for i in $(find ${x} -type d | sort -n); do
500 johnm 1.1 KPATCH_DIR="${KPATCH_DIR} ${i}"
501     done
502    
503     #so now lets get rid of the patchno's we want to exclude
504 johnm 1.19 UNIPATCH_DROP="${UNIPATCH_EXCLUDE} ${UNIPATCH_DROP}"
505 hollow 1.95 for i in ${UNIPATCH_DROP}; do
506 johnm 1.55 ebegin "Excluding Patch #${i}"
507 hollow 1.95 for x in ${KPATCH_DIR}; do rm -f ${x}/${i}* 2>/dev/null; done
508 johnm 1.55 eend $?
509 johnm 1.1 done
510    
511     # and now, finally, we patch it :)
512 hollow 1.95 for x in ${KPATCH_DIR}; do
513     for i in $(find ${x} -maxdepth 1 -iname "*.patch*" -or -iname "*.diff*" | sort -n); do
514 johnm 1.25 STDERR_T="${T}/${i/*\//}"
515 johnm 1.41 STDERR_T="${STDERR_T/.patch*/.err}"
516    
517 lu_zero 1.62 [ -z ${i/*.patch*/} ] && PATCH_DEPTH=${i/*.patch/}
518     [ -z ${i/*.diff*/} ] && PATCH_DEPTH=${i/*.diff/}
519 johnm 1.41
520 hollow 1.96 if [ -z "${PATCH_DEPTH}" ]; then PATCH_DEPTH=0; fi
521 johnm 1.41
522     ebegin "Applying ${i/*\//} (-p${PATCH_DEPTH}+)"
523 hollow 1.95 while [ ${PATCH_DEPTH} -lt 5 ]; do
524 plasmaroo 1.33 echo "Attempting Dry-run:" >> ${STDERR_T}
525 johnm 1.25 echo "cmd: patch -p${PATCH_DEPTH} --dry-run -f < ${i}" >> ${STDERR_T}
526 johnm 1.54 echo "=======================================================" >> ${STDERR_T}
527 hollow 1.95 if [ $(patch -p${PATCH_DEPTH} --dry-run -f < ${i} >> ${STDERR_T}) $? -eq 0 ]; then
528 johnm 1.25 echo "Attempting patch:" > ${STDERR_T}
529     echo "cmd: patch -p${PATCH_DEPTH} -f < ${i}" >> ${STDERR_T}
530 johnm 1.54 echo "=======================================================" >> ${STDERR_T}
531 hollow 1.95 if [ $(patch -p${PATCH_DEPTH} -f < ${i} >> ${STDERR_T}) "$?" -eq 0 ]; then
532 johnm 1.1 eend 0
533 johnm 1.25 rm ${STDERR_T}
534 johnm 1.1 break
535     else
536     eend 1
537     eerror "Failed to apply patch ${i/*\//}"
538 johnm 1.54 eerror "Please attach ${STDERR_T} to any bug you may post."
539 johnm 1.1 die "Failed to apply ${i/*\//}"
540     fi
541     else
542     PATCH_DEPTH=$((${PATCH_DEPTH} + 1))
543     fi
544     done
545 hollow 1.95 if [ ${PATCH_DEPTH} -eq 5 ]; then
546 johnm 1.1 eend 1
547 johnm 1.54 eerror "Please attach ${STDERR_T} to any bug you may post."
548 johnm 1.1 die "Unable to dry-run patch."
549     fi
550     done
551     done
552 johnm 1.43
553     # clean up KPATCH_DIR's - fixes bug #53610
554 hollow 1.95 for x in ${KPATCH_DIR}; do rm -Rf ${x}; done
555 johnm 1.78
556     LC_ALL="${myLC_ALL}"
557 johnm 1.1 }
558    
559 johnm 1.74 # getfilevar accepts 2 vars as follows:
560     # getfilevar <VARIABLE> <CONFIGFILE>
561     # pulled from linux-info
562    
563     getfilevar() {
564 johnm 1.93 local workingdir basefname basedname xarch=$(tc-arch-kernel)
565 johnm 1.74
566 johnm 1.93 if [[ -z ${1} ]] && [[ ! -f ${2} ]]; then
567 johnm 1.74 ebeep
568     echo -e "\n"
569     eerror "getfilevar requires 2 variables, with the second a valid file."
570     eerror " getfilevar <VARIABLE> <CONFIGFILE>"
571     else
572     workingdir=${PWD}
573     basefname=$(basename ${2})
574     basedname=$(dirname ${2})
575     unset ARCH
576    
577     cd ${basedname}
578     echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
579     make ${BUILD_FIXES} -f - e 2>/dev/null
580     cd ${workingdir}
581    
582     ARCH=${xarch}
583     fi
584     }
585    
586 johnm 1.1 detect_version() {
587     # this function will detect and set
588 johnm 1.54 # - OKV: Original Kernel Version (2.6.0/2.6.0-test11)
589     # - KV: Kernel Version (2.6.0-gentoo/2.6.0-test11-gentoo-r1)
590     # - EXTRAVERSION: The additional version appended to OKV (-gentoo/-gentoo-r1)
591 lu_zero 1.62
592 johnm 1.93 if [[ -n ${KV_FULL} ]]; then
593 johnm 1.55 # we will set this for backwards compatibility.
594     KV=${KV_FULL}
595 lu_zero 1.62
596 johnm 1.55 # we know KV_FULL so lets stop here. but not without resetting S
597     S=${WORKDIR}/linux-${KV_FULL}
598     return
599     fi
600 lu_zero 1.62
601 johnm 1.93 # CKV is used as a comparison kernel version, which is used when
602     # PV doesnt reflect the genuine kernel version.
603     # this gets set to the portage style versioning. ie:
604     # CKV=2.6.11_rc4
605 johnm 1.90 CKV=${CKV:-${PV}}
606 johnm 1.93 OKV=${OKV:-${CKV}}
607     OKV=${OKV/_beta/-test}
608 johnm 1.97 OKV=${OKV/_rc/-rc}
609     OKV=${OKV/-r*}
610     OKV=${OKV/_p*}
611 lu_zero 1.62
612 johnm 1.78 KV_MAJOR=$(get_version_component_range 1 ${OKV})
613     KV_MINOR=$(get_version_component_range 2 ${OKV})
614     KV_PATCH=$(get_version_component_range 3- ${OKV})
615 johnm 1.93 KV_PATCH=${KV_PATCH/[-_]*}
616 lu_zero 1.62
617 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
618 lu_zero 1.62
619 johnm 1.93 RELEASE=${CKV/${OKV}}
620     RELEASE=${RELEASE/_beta}
621 johnm 1.1 RELEASE=${RELEASE/_rc/-rc}
622 johnm 1.93 RELEASE=${RELEASE/_pre/-pre}
623     kernel_is_2_6 && RELEASE=${RELEASE/-pre/-bk}
624     RELEASETYPE=${RELEASE//[0-9]}
625    
626     # Now we know that RELEASE is the -rc/-bk
627     # and RELEASETYPE is the same but with its numerics stripped
628     # we can work on better sorting EXTRAVERSION.
629     # first of all, we add the release
630 johnm 1.1 EXTRAVERSION="${RELEASE}"
631 lu_zero 1.62
632 johnm 1.93 if [[ -n ${K_PREPATCHED} ]]; then
633     EXTRAVERSION="${EXTRAVERSION}-${PN/-*}${PR/r}"
634 hollow 1.95 elif [[ "${ETYPE}" = "sources" ]]; then
635 johnm 1.93 # For some sources we want to use the PV in the extra version
636     # This is because upstream releases with a completely different
637     # versioning scheme.
638     case ${PN/-*} in
639     wolk) K_USEPV=1;;
640     vserver) K_USEPV=1;;
641     esac
642    
643 hollow 1.95 [[ -z ${K_NOUSENAME} ]] && EXTRAVERSION="${EXTRAVERSION}-${PN/-*}"
644     [[ -n ${K_USEPV} ]] && EXTRAVERSION="${EXTRAVERSION}-${PV//_/-}"
645     [[ -n ${PR//r0} ]] && EXTRAVERSION="${EXTRAVERSION}-${PR}"
646 johnm 1.11 fi
647 lu_zero 1.62
648 johnm 1.92 KV_FULL=${OKV}${EXTRAVERSION}
649 lu_zero 1.62
650 johnm 1.93 # -rc-bk pulls can be achieved by specifying CKV
651 johnm 1.91 # for example:
652     # CKV="2.6.11_rc3_pre2"
653     # will pull:
654 johnm 1.93 # linux-2.6.10.tar.bz2 & patch-2.6.11-rc3.bz2 & patch-2.6.11-rc3-bk2.bz2
655 lu_zero 1.62
656 hollow 1.95 if [[ ${RELEASETYPE} == -rc ]] || [[ ${RELEASETYPE} == -pre ]]; then
657 johnm 1.93 OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
658 johnm 1.90 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${CKV//_/-}.bz2
659 johnm 1.93 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
660 johnm 1.90 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${CKV//_/-}.bz2"
661 johnm 1.1 fi
662 lu_zero 1.62
663 hollow 1.95 if [[ ${RELEASETYPE} == -bk ]]; then
664 johnm 1.93 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${OKV}${RELEASE}.bz2
665     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
666     UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${OKV}${RELEASE}.bz2"
667 johnm 1.1 fi
668 lu_zero 1.62
669 hollow 1.95 if [[ ${RELEASETYPE} == -rc-bk ]]; then
670 johnm 1.93 OKV="${KV_MAJOR}.${KV_MINOR}.$((${KV_PATCH} - 1))"
671 johnm 1.1 KERNEL_URI="mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/snapshots/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2
672 johnm 1.93 mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/testing/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-bk*}.bz2
673     mirror://kernel/linux/kernel/v${KV_MAJOR}.${KV_MINOR}/linux-${OKV}.tar.bz2"
674 hollow 1.95 UNIPATCH_LIST_DEFAULT="${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE/-bk*}.bz2 ${DISTDIR}/patch-${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${RELEASE}.bz2"
675 johnm 1.1 fi
676 lu_zero 1.62
677 johnm 1.93 # we will set this for backwards compatibility.
678 johnm 1.55 S=${WORKDIR}/linux-${KV_FULL}
679     KV=${KV_FULL}
680 johnm 1.1 }
681    
682 johnm 1.28 detect_arch() {
683     # This function sets ARCH_URI and ARCH_PATCH
684     # with the neccessary info for the arch sepecific compatibility
685     # patchsets.
686 lu_zero 1.62
687 johnm 1.93 local ALL_ARCH LOOP_ARCH COMPAT_URI i
688 plasmaroo 1.33
689     # COMPAT_URI is the contents of ${ARCH}_URI
690     # ARCH_URI is the URI for all the ${ARCH}_URI patches
691     # ARCH_PATCH is ARCH_URI broken into files for UNIPATCH
692    
693     ARCH_URI=""
694     ARCH_PATCH=""
695 johnm 1.85 ALL_ARCH="X86 PPC PPC64 SPARC MIPS ALPHA ARM HPPA AMD64 IA64 X86OBSD S390 SH"
696 johnm 1.31
697 hollow 1.95 for LOOP_ARCH in ${ALL_ARCH}; do
698 johnm 1.31 COMPAT_URI="${LOOP_ARCH}_URI"
699     COMPAT_URI="${!COMPAT_URI}"
700 lu_zero 1.62
701 vapier 1.86 [[ -n ${COMPAT_URI} ]] && \
702 johnm 1.55 ARCH_URI="${ARCH_URI} $(echo ${LOOP_ARCH} | tr '[:upper:]' '[:lower:]')? ( ${COMPAT_URI} )"
703 lu_zero 1.62
704 johnm 1.93 if [[ ${LOOP_ARCH} == "$(echo $(tc-arch-kernel) | tr '[:lower:]' '[:upper:]')" ]]; then
705     for i in ${COMPAT_URI}; do
706 plasmaroo 1.33 ARCH_PATCH="${ARCH_PATCH} ${DISTDIR}/${i/*\//}"
707     done
708     fi
709 johnm 1.31 done
710 johnm 1.28 }
711    
712 johnm 1.72 # sparc nastiness
713     #==============================================================
714     # This script generates the files in /usr/include/asm for sparc systems
715     # during installation of sys-kernel/linux-headers.
716     # Will no longer be needed when full 64 bit support is used on sparc64
717     # systems.
718     #
719     # Shamefully ripped from Debian
720     # ----------------------------------------------------------------------
721    
722     # Idea borrowed from RedHat's kernel package
723    
724 eradicator 1.76 # This is gonna get replaced by something in multilib.eclass soon...
725     # --eradicator
726 johnm 1.72 generate_sparc_asm() {
727     local name
728    
729     cd $1 || die
730     mkdir asm
731    
732     for h in `( ls asm-sparc; ls asm-sparc64 ) | grep '\.h$' | sort -u`; do
733     name="$(echo $h | tr a-z. A-Z_)"
734     # common header
735     echo "/* All asm/ files are generated and point to the corresponding
736     * file in asm-sparc or asm-sparc64.
737     */
738    
739     #ifndef __SPARCSTUB__${name}__
740     #define __SPARCSTUB__${name}__
741     " > asm/${h}
742    
743     # common for sparc and sparc64
744     if [ -f asm-sparc/$h -a -f asm-sparc64/$h ]; then
745     echo "#ifdef __arch64__
746     #include <asm-sparc64/$h>
747     #else
748     #include <asm-sparc/$h>
749     #endif
750     " >> asm/${h}
751    
752     # sparc only
753     elif [ -f asm-sparc/$h ]; then
754     echo "#ifndef __arch64__
755     #include <asm-sparc/$h>
756     #endif
757     " >> asm/${h}
758    
759     # sparc64 only
760     else
761     echo "#ifdef __arch64__
762     #include <asm-sparc64/$h>
763     #endif
764     " >> asm/${h}
765     fi
766    
767     # common footer
768     echo "#endif /* !__SPARCSTUB__${name}__ */" >> asm/${h}
769     done
770     return 0
771     }
772    
773 johnm 1.89 headers___fix() {
774 plasmaroo 1.88 # Voodoo to partially fix broken upstream headers.
775     # Issues with this function should go to plasmaroo.
776 johnm 1.72 sed -i \
777     -e "s/\([ "$'\t'"]\)u8\([ "$'\t'"]\)/\1__u8\2/g;" \
778     -e "s/\([ "$'\t'"]\)u16\([ "$'\t'"]\)/\1__u16\2/g;" \
779     -e "s/\([ "$'\t'"]\)u32\([ "$'\t'"]\)/\1__u32\2/g;" \
780     -e "s/\([ "$'\t'"]\)u64\([ "$'\t'"]\)/\1__u64\2/g;" \
781 plasmaroo 1.88 -e "s/\([ "$'\t'"]\)s64\([ "$'\t'"]\)/\1__s64\2/g;" \
782     -e 's/ \(u\|s\)\(8\|16\|32\|64\)$/ __\1\2/g' \
783     -e 's/\([(, ]\)\(u\|s\)64\([, )]\)/\1__\264\3/g' \
784 johnm 1.72 "$@"
785     }
786 johnm 1.28
787 johnm 1.1 # common functions
788     #==============================================================
789 plasmaroo 1.33 kernel-2_src_unpack() {
790 johnm 1.1 universal_unpack
791 lu_zero 1.62
792 johnm 1.93 [[ -n ${UNIPATCH_LIST} ]] || [[ -n ${UNIPATCH_LIST_DEFAULT} ]] && \
793 johnm 1.56 unipatch "${UNIPATCH_LIST_DEFAULT} ${UNIPATCH_LIST}"
794 lu_zero 1.62
795 johnm 1.56 [ -z "${K_NOSETEXTRAVERSION}" ] && \
796     unpack_set_extraversion
797    
798     kernel_is 2 4 && unpack_2_4
799 johnm 1.1 }
800    
801 plasmaroo 1.33 kernel-2_src_compile() {
802 johnm 1.72 cd ${S}
803 johnm 1.93 [[ ${ETYPE} == headers ]] && compile_headers
804     [[ ${ETYPE} == sources ]] && \
805 johnm 1.55 use doc && ! use arm && ! use s390 && compile_manpages
806 johnm 1.1 }
807    
808 plasmaroo 1.33 kernel-2_pkg_preinst() {
809 johnm 1.93 [[ ${ETYPE} == headers ]] && preinst_headers
810 johnm 1.1 }
811    
812 plasmaroo 1.33 kernel-2_src_install() {
813 johnm 1.1 install_universal
814 johnm 1.93 [[ ${ETYPE} == headers ]] && install_headers
815     [[ ${ETYPE} == sources ]] && install_sources
816 johnm 1.1 }
817    
818 plasmaroo 1.33 kernel-2_pkg_postinst() {
819 johnm 1.93 [[ ${ETYPE} == headers ]] && postinst_headers
820     [[ ${ETYPE} == sources ]] && postinst_sources
821 johnm 1.1 }
822 johnm 1.12
823 plasmaroo 1.33 kernel-2_pkg_setup() {
824 johnm 1.93 [[ ${ETYPE} == headers ]] && setup_headers
825     [[ ${ETYPE} == sources ]] && echo ">>> Preparing to unpack ..."
826 johnm 1.12 }

  ViewVC Help
Powered by ViewVC 1.1.20