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

Contents of /eclass/kernel-2.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.110 - (hide annotations) (download)
Wed Mar 9 22:03:28 2005 UTC (13 years, 1 month ago) by johnm
Branch: MAIN
Changes since 1.109: +3 -2 lines
Re-comitting the fix for patch strict_order. Works this time :)

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

  ViewVC Help
Powered by ViewVC 1.1.20