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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.14 - (hide annotations) (download)
Wed Dec 29 11:22:41 2004 UTC (9 years, 6 months ago) by johnm
Branch: MAIN
Changes since 1.13: +9 -5 lines
Fixing up test logic in kernel_is

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

  ViewVC Help
Powered by ViewVC 1.1.20