/[gentoo-x86]/eclass/linux-info.eclass
Gentoo

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16 - (hide annotations) (download)
Thu Jan 6 13:58:15 2005 UTC (9 years, 10 months ago) by johnm
Branch: MAIN
Changes since 1.15: +15 -7 lines
Fixed bugs: 75034 76849 74655

1 johnm 1.1 # Copyright 1999-2004 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 johnm 1.16 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.15 2004/12/31 09:23:43 mrness Exp $
4 johnm 1.1 #
5 johnm 1.10 # Description: This eclass is used as a central eclass for accessing kernel
6     # related information for sources already installed.
7     # It is vital for linux-mod to function correctly, and is split
8     # out so that any ebuild behaviour "templates" are abstracted out
9     # using additional eclasses.
10 johnm 1.1 #
11 johnm 1.10 # Maintainer: John Mylchreest <johnm@gentoo.org>
12     # Copyright 2004 Gentoo Linux
13     #
14     # Please direct your bugs to the current eclass maintainer :)
15    
16     # A Couple of env vars are available to effect usage of this eclass
17     # These are as follows:
18     #
19     # Env Var Option Description
20     # KERNEL_DIR <string> The directory containing kernel the target kernel
21     # sources.
22     # CONFIG_CHECK <string> a list of .config options to check for before
23     # proceeding with the install. ie: CONFIG_CHECK="MTRR"
24     # You can also check that an option doesn't exist by
25     # prepending it with an exclamation mark (!).
26     # ie: CONFIG_CHECK="!MTRR"
27     # <CFG>_ERROR <string> The error message to display when the above check
28     # fails. <CFG> should reference the appropriate option
29     # as above. ie: MTRR_ERROR="MTRR exists in the .config
30     # but shouldn't!!"
31     # KBUILD_OUTPUT <string> This is passed on commandline, or can be set from
32     # the kernel makefile. This contains the directory
33     # which is to be used as the kernel object directory.
34    
35     # There are also a couple of variables which are set by this, and shouldn't be
36     # set by hand. These are as follows:
37     #
38     # Env Var Option Description
39     # KV_FULL <string> The full kernel version. ie: 2.6.9-gentoo-johnm-r1
40     # KV_MAJOR <integer> The kernel major version. ie: 2
41     # KV_MINOR <integer> The kernel minor version. ie: 6
42     # KV_PATCH <integer> The kernel patch version. ie: 9
43     # KV_EXTRA <string> The kernel EXTRAVERSION. ie: -gentoo
44     # KV_LOCAL <string> The kernel LOCALVERSION concatenation. ie: -johnm
45     # KV_DIR <string> The kernel source directory, will be null if
46     # KERNEL_DIR is invalid.
47     # KV_OUT_DIR <string> The kernel object directory. will be KV_DIR unless
48     # koutput is used. This should be used for referencing
49     # .config.
50    
51 johnm 1.1
52     ECLASS=linux-info
53     INHERITED="$INHERITED $ECLASS"
54 johnm 1.8 EXPORT_FUNCTIONS pkg_setup
55 johnm 1.1
56     # Overwritable environment Var's
57     # ---------------------------------------
58     KERNEL_DIR="${KERNEL_DIR:-/usr/src/linux}"
59    
60 johnm 1.7
61 johnm 1.16 # Bug fixes
62    
63     # fix to bug #75034
64     case ${ARCH} in
65     ppc) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
66     ppc64) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
67     esac
68    
69 johnm 1.7 # Pulled from eutils as it might be more useful only being here since
70     # very few ebuilds which dont use this eclass will ever ever use these functions
71     set_arch_to_kernel() {
72     export PORTAGE_ARCH="${ARCH}"
73     case ${ARCH} in
74     x86) export ARCH="i386";;
75     amd64) export ARCH="x86_64";;
76     hppa) export ARCH="parisc";;
77     mips) export ARCH="mips";;
78     *) export ARCH="${ARCH}";;
79     esac
80     }
81    
82     # set's ARCH back to what portage expects
83     set_arch_to_portage() {
84     export ARCH="${PORTAGE_ARCH}"
85     }
86    
87 johnm 1.11
88     #
89     # qeinfo "Message"
90     # -------------------
91     # qeinfo is a queit einfo call when EBUILD_PHASE
92     # should not have visible output.
93     #
94     qeinfo() {
95     local outputmsg
96     outputmsg="${@}"
97     case "${EBUILD_PHASE}" in
98     depend) unset outputmsg;;
99     clean) unset outputmsg;;
100     preinst) unset outputmsg;;
101     esac
102     [ -n "${outputmsg}" ] && einfo "${outputmsg}"
103     }
104    
105     qeerror() {
106     local outputmsg
107     outputmsg="${@}"
108     case "${EBUILD_PHASE}" in
109     depend) unset outputmsg;;
110     clean) unset outputmsg;;
111     preinst) unset outputmsg;;
112     esac
113     [ -n "${outputmsg}" ] && einfo "${outputmsg}"
114     }
115    
116    
117    
118 johnm 1.1 # File Functions
119     # ---------------------------------------
120    
121     # getfilevar accepts 2 vars as follows:
122     # getfilevar <VARIABLE> <CONFIGFILE>
123    
124     getfilevar() {
125 johnm 1.7 local ERROR workingdir basefname basedname xarch
126 johnm 1.1 ERROR=0
127 johnm 1.16
128 johnm 1.1 [ -z "${1}" ] && ERROR=1
129     [ ! -f "${2}" ] && ERROR=1
130    
131     if [ "${ERROR}" = 1 ]
132     then
133 johnm 1.6 ebeep
134     echo -e "\n"
135 johnm 1.1 eerror "getfilevar requires 2 variables, with the second a valid file."
136     eerror " getfilevar <VARIABLE> <CONFIGFILE>"
137     else
138 johnm 1.6 workingdir=${PWD}
139     basefname=$(basename ${2})
140     basedname=$(dirname ${2})
141 johnm 1.7 xarch=${ARCH}
142 johnm 1.6 unset ARCH
143    
144     cd ${basedname}
145 johnm 1.7 echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
146 johnm 1.16 make ${BUILD_FIXES} -f - e 2>/dev/null
147 johnm 1.6 cd ${workingdir}
148    
149 johnm 1.7 ARCH=${xarch}
150 johnm 1.1 fi
151     }
152    
153 johnm 1.7 linux_chkconfig_present() {
154 johnm 1.1 local RESULT
155 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
156 johnm 1.1 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
157     }
158    
159 johnm 1.7 linux_chkconfig_module() {
160 johnm 1.1 local RESULT
161 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
162 johnm 1.1 [ "${RESULT}" = "m" ] && return 0 || return 1
163     }
164    
165 johnm 1.7 linux_chkconfig_builtin() {
166 johnm 1.1 local RESULT
167 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
168 johnm 1.1 [ "${RESULT}" = "y" ] && return 0 || return 1
169     }
170    
171 johnm 1.7 linux_chkconfig_string() {
172     getfilevar "CONFIG_${1}" "${KV_OUT_DIR}/.config"
173     }
174    
175 johnm 1.1 # Versioning Functions
176     # ---------------------------------------
177    
178     # kernel_is returns true when the version is the same as the passed version
179     #
180     # For Example where KV = 2.6.9
181     # kernel_is 2 4 returns false
182     # kernel_is 2 returns true
183     # kernel_is 2 6 returns true
184     # kernel_is 2 6 8 returns false
185     # kernel_is 2 6 9 returns true
186 johnm 1.3 #
187 johnm 1.1 # got the jist yet?
188    
189     kernel_is() {
190     # if we haven't determined the version yet, we need too.
191     get_version;
192    
193 mrness 1.15 local RESULT operator test value i len
194 johnm 1.12 RESULT=0
195 johnm 1.1
196 johnm 1.13 operator="="
197 johnm 1.12 if [ "${1}" == "lt" ]
198     then
199     operator="-lt"
200     shift
201     elif [ "${1}" == "gt" ]
202     then
203     operator="-gt"
204     shift
205     elif [ "${1}" == "le" ]
206     then
207     operator="-le"
208     shift
209     elif [ "${1}" == "ge" ]
210     then
211     operator="-ge"
212     shift
213     fi
214    
215 johnm 1.1 if [ -n "${1}" ]
216     then
217 johnm 1.14 value="${value}${1}"
218     test="${test}${KV_MAJOR}"
219 johnm 1.1 fi
220     if [ -n "${2}" ]
221     then
222 mrness 1.15 len=$[ 3 - ${#2} ]
223     for((i=0; i<$len; i++)); do
224     value="${value}0"
225     done
226 johnm 1.14 value="${value}${2}"
227 mrness 1.15
228     len=$[ 3 - ${#KV_MINOR} ]
229     for((i=0; i<$len; i++)); do
230     test="${test}0"
231     done
232 johnm 1.14 test="${test}${KV_MINOR}"
233 johnm 1.1 fi
234     if [ -n "${3}" ]
235     then
236 mrness 1.15 len=$[ 3 - ${#3} ]
237     for((i=0; i<$len; i++)); do
238     value="${value}0"
239     done
240 johnm 1.14 value="${value}${3}"
241 mrness 1.15
242     len=$[ 3 - ${#KV_PATCH} ]
243     for((i=0; i<$len; i++)); do
244     test="${test}0"
245     done
246 johnm 1.14 test="${test}${KV_PATCH}"
247 johnm 1.1 fi
248 johnm 1.14
249     [ ${test} ${operator} ${value} ] && return 0 || return 1
250 johnm 1.1 }
251    
252     get_version() {
253 johnm 1.4 local kbuild_output
254    
255 johnm 1.1 # no need to execute this twice assuming KV_FULL is populated.
256     # we can force by unsetting KV_FULL
257 johnm 1.4 [ -n "${KV_FULL}" ] && return
258 johnm 1.1
259     # if we dont know KV_FULL, then we need too.
260     # make sure KV_DIR isnt set since we need to work it out via KERNEL_DIR
261     unset KV_DIR
262    
263     # KV_DIR will contain the full path to the sources directory we should use
264 johnm 1.11 qeinfo "Determining the location of the kernel source code"
265 johnm 1.1 [ -h "${KERNEL_DIR}" ] && KV_DIR="$(readlink -f ${KERNEL_DIR})"
266     [ -d "${KERNEL_DIR}" ] && KV_DIR="${KERNEL_DIR}"
267    
268     if [ -z "${KV_DIR}" ]
269     then
270 johnm 1.11 qeerror "Unable to find kernel sources at ${KERNEL_DIR}"
271     qeinfo "This package requires Linux sources."
272 johnm 1.7 if [ "${KERNEL_DIR}" == "/usr/src/linux" ] ; then
273 johnm 1.11 qeinfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "
274     qeinfo "(or the kernel you wish to build against)."
275     qeinfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"
276 johnm 1.7 else
277 johnm 1.11 qeinfo "Please ensure that the KERNEL_DIR environment variable points at full Linux sources of the kernel you wish to compile against."
278 johnm 1.7 fi
279     die "Cannot locate Linux sources at ${KERNEL_DIR}"
280     fi
281    
282 johnm 1.11 qeinfo "Found kernel source directory:"
283     qeinfo " ${KV_DIR}"
284 johnm 1.7
285     if [ ! -s "${KV_DIR}/Makefile" ]
286     then
287 johnm 1.11 qeerror "Could not find a Makefile in the kernel source directory."
288     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
289 johnm 1.7 die "Makefile not found in ${KV_DIR}"
290     fi
291 johnm 1.1
292 johnm 1.4 # OK so now we know our sources directory, but they might be using
293     # KBUILD_OUTPUT, and we need this for .config and localversions-*
294     # so we better find it eh?
295     # do we pass KBUILD_OUTPUT on the CLI?
296     OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
297    
298 johnm 1.6 # And if we didn't pass it, we can take a nosey in the Makefile
299 johnm 1.4 kbuild_output="$(getfilevar KBUILD_OUTPUT ${KV_DIR}/Makefile)"
300     OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
301    
302 johnm 1.1 # And contrary to existing functions I feel we shouldn't trust the
303     # directory name to find version information as this seems insane.
304     # so we parse ${KV_DIR}/Makefile
305     KV_MAJOR="$(getfilevar VERSION ${KV_DIR}/Makefile)"
306     KV_MINOR="$(getfilevar PATCHLEVEL ${KV_DIR}/Makefile)"
307     KV_PATCH="$(getfilevar SUBLEVEL ${KV_DIR}/Makefile)"
308     KV_EXTRA="$(getfilevar EXTRAVERSION ${KV_DIR}/Makefile)"
309 johnm 1.4
310 johnm 1.7 if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
311     then
312 johnm 1.11 qeerror "Could not detect kernel version."
313     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
314 johnm 1.7 die "Could not parse version info from ${KV_DIR}/Makefile"
315     fi
316    
317 johnm 1.1 # and in newer versions we can also pull LOCALVERSION if it is set.
318 johnm 1.4 # but before we do this, we need to find if we use a different object directory.
319     # This *WILL* break if the user is using localversions, but we assume it was
320     # caught before this if they are.
321     [ "${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.${KV_EXTRA}" == "$(uname -r)" ] && \
322 johnm 1.7 OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.${KV_EXTRA}/build}"
323 johnm 1.4
324     [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
325     [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
326     if [ -n "${KV_OUT_DIR}" ];
327     then
328 johnm 1.11 qeinfo "Found kernel object directory:"
329     qeinfo " ${KV_OUT_DIR}"
330 johnm 1.4
331     KV_LOCAL="$(cat ${KV_OUT_DIR}/localversion* 2>/dev/null)"
332     fi
333     # and if we STILL haven't got it, then we better just set it to KV_DIR
334     KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
335    
336     KV_LOCAL="${KV_LOCAL}$(cat ${KV_DIR}/localversion* 2>/dev/null)"
337 johnm 1.7 KV_LOCAL="${KV_LOCAL}$(linux_chkconfig_string LOCALVERSION)"
338     KV_LOCAL="${KV_LOCAL//\"/}"
339 johnm 1.1
340     # And we should set KV_FULL to the full expanded version
341     KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
342    
343 johnm 1.11 qeinfo "Found sources for kernel version:"
344     qeinfo " ${KV_FULL}"
345 johnm 1.9
346     if [ ! -s "${KV_OUT_DIR}/.config" ]
347     then
348 johnm 1.11 qeerror "Could not find a usable .config in the kernel source directory."
349 johnm 1.12 qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources."
350     qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that"
351     qeerror "it points to the necessary object directory so that it might find .config."
352 johnm 1.9 die ".config not found in ${KV_OUT_DIR}"
353     fi
354 johnm 1.1 }
355    
356    
357    
358    
359     # ebuild check functions
360     # ---------------------------------------
361    
362     check_kernel_built() {
363     # if we haven't determined the version yet, we need too.
364     get_version;
365    
366 johnm 1.16 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ]
367 johnm 1.1 then
368 johnm 1.16 eerror "These sources have not yet been prepared."
369     eerror "We cannot build against an unprepared tree."
370 johnm 1.1 eerror "To resolve this, please type the following:"
371     eerror
372     eerror "# cd ${KV_DIR}"
373     eerror "# make oldconfig"
374 johnm 1.16 eerror "# make modules_prepare"
375 johnm 1.1 eerror
376     eerror "Then please try merging this module again."
377     die "Kernel sources need compiling first"
378     fi
379     }
380    
381     check_modules_supported() {
382     # if we haven't determined the version yet, we need too.
383     get_version;
384    
385 johnm 1.7 if ! linux_chkconfig_builtin "MODULES"
386 johnm 1.1 then
387     eerror "These sources do not support loading external modules."
388     eerror "to be able to use this module please enable \"Loadable modules support\""
389     eerror "in your kernel, recompile and then try merging this module again."
390 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
391 johnm 1.3 fi
392     }
393    
394     check_extra_config() {
395 johnm 1.7 local config negate error local_error
396 johnm 1.3
397     # if we haven't determined the version yet, we need too.
398     get_version;
399    
400     einfo "Checking for suitable kernel configuration options"
401     for config in ${CONFIG_CHECK}
402     do
403     negate="${config:0:1}"
404     if [ "${negate}" == "!" ];
405     then
406     config="${config:1}"
407 johnm 1.7 if linux_chkconfig_present ${config}
408 johnm 1.3 then
409 johnm 1.7 local_error="${config}_ERROR"
410     local_error="${!local_error}"
411     [ -n "${local_error}" ] && eerror " ${local_error}" || \
412     eerror " CONFIG_${config}:\tshould not be set in the kernel configuration, but it is."
413 johnm 1.3 error=1
414     fi
415     else
416 johnm 1.7 if ! linux_chkconfig_present ${config}
417 johnm 1.3 then
418 johnm 1.7 local_error="${config}_ERROR"
419     local_error="${!local_error}"
420     [ -n "${local_error}" ] && eerror " ${local_error}" || \
421     eerror " CONFIG_${config}:\tshould be set in the kernel configuration, but isn't"
422 johnm 1.3 error=1
423     fi
424     fi
425     done
426    
427     if [ -n "${error}" ] ;
428     then
429     eerror "Please check to make sure these options are set correctly."
430     eerror "Once you have satisfied these options, please try merging"
431     eerror "this package again."
432 johnm 1.7 die "Incorrect kernel configuration options"
433 johnm 1.1 fi
434     }
435    
436     check_zlibinflate() {
437     # if we haven't determined the version yet, we need too.
438     get_version;
439    
440     # although I restructured this code - I really really really dont support it!
441    
442     # bug #27882 - zlib routines are only linked into the kernel
443     # if something compiled into the kernel calls them
444     #
445     # plus, for the cloop module, it appears that there's no way
446     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
447     # is on
448    
449     local INFLATE
450     local DEFLATE
451    
452     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
453    
454     ebegin "checking ZLIB_INFLATE"
455     getfilevar_isbuiltin CONFIG_ZLIB_INFLATE ${KV_DIR}/.config
456     eend $?
457     [ "$?" != 0 ] && die
458    
459     ebegin "checking ZLIB_DEFLATE"
460     getfilevar_isbuiltin CONFIG_ZLIB_DEFLATE ${KV_DIR}/.config
461     eend $?
462     [ "$?" != 0 ] && die
463    
464    
465     local LINENO_START
466     local LINENO_END
467     local SYMBOLS
468     local x
469    
470     LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
471     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
472     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
473     (( LINENO_END = $LINENO_END - 1 ))
474 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
475 johnm 1.1
476     # okay, now we have a list of symbols
477     # we need to check each one in turn, to see whether it is set or not
478     for x in $SYMBOLS ; do
479     if [ "${!x}" = "y" ]; then
480     # we have a winner!
481     einfo "${x} ensures zlib is linked into your kernel - excellent"
482     return 0
483     fi
484     done
485    
486     eerror
487     eerror "This kernel module requires ZLIB library support."
488     eerror "You have enabled zlib support in your kernel, but haven't enabled"
489     eerror "enabled any option that will ensure that zlib is linked into your"
490     eerror "kernel."
491     eerror
492     eerror "Please ensure that you enable at least one of these options:"
493     eerror
494    
495     for x in $SYMBOLS ; do
496     eerror " * $x"
497     done
498    
499     eerror
500     eerror "Please remember to recompile and install your kernel, and reboot"
501     eerror "into your new kernel before attempting to load this kernel module."
502    
503     die "Kernel doesn't include zlib support"
504     }
505 johnm 1.8
506     ################################
507     # Default pkg_setup
508     # Also used when inheriting linux-mod to force a get_version call
509    
510     linux-info_pkg_setup() {
511     get_version;
512 johnm 1.10 [ -n "${CONFIG_CHECK}" ] && check_extra_config;
513 johnm 1.8 }

  ViewVC Help
Powered by ViewVC 1.1.20