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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (hide annotations) (download)
Fri Dec 17 15:12:07 2004 UTC (9 years, 8 months ago) by johnm
Branch: MAIN
Changes since 1.10: +50 -19 lines
implement a qeinfo qeerror which wont print crud when portage is in certain stages. allows get_version to be used in global. although I still dont recommend it in any way

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     local RESULT
186     RESULT=1
187    
188     if [ -n "${1}" ]
189     then
190     [ "${1}" = "${KV_MAJOR}" ] && RESULT=0
191     fi
192    
193     if [ -n "${2}" ]
194     then
195     RESULT=1
196     [ "${2}" = "${KV_MINOR}" ] && RESULT=0
197     fi
198    
199     if [ -n "${3}" ]
200     then
201     RESULT=1
202     [ "${3}" = "${KV_PATCH}" ] && RESULT=0
203     fi
204     return ${RESULT}
205     }
206    
207     get_version() {
208 johnm 1.4 local kbuild_output
209    
210 johnm 1.1 # no need to execute this twice assuming KV_FULL is populated.
211     # we can force by unsetting KV_FULL
212 johnm 1.4 [ -n "${KV_FULL}" ] && return
213 johnm 1.1
214     # if we dont know KV_FULL, then we need too.
215     # make sure KV_DIR isnt set since we need to work it out via KERNEL_DIR
216     unset KV_DIR
217    
218     # KV_DIR will contain the full path to the sources directory we should use
219 johnm 1.11 qeinfo "Determining the location of the kernel source code"
220 johnm 1.1 [ -h "${KERNEL_DIR}" ] && KV_DIR="$(readlink -f ${KERNEL_DIR})"
221     [ -d "${KERNEL_DIR}" ] && KV_DIR="${KERNEL_DIR}"
222    
223     if [ -z "${KV_DIR}" ]
224     then
225 johnm 1.11 qeerror "Unable to find kernel sources at ${KERNEL_DIR}"
226     qeinfo "This package requires Linux sources."
227 johnm 1.7 if [ "${KERNEL_DIR}" == "/usr/src/linux" ] ; then
228 johnm 1.11 qeinfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "
229     qeinfo "(or the kernel you wish to build against)."
230     qeinfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"
231 johnm 1.7 else
232 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."
233 johnm 1.7 fi
234     die "Cannot locate Linux sources at ${KERNEL_DIR}"
235     fi
236    
237 johnm 1.11 qeinfo "Found kernel source directory:"
238     qeinfo " ${KV_DIR}"
239 johnm 1.7
240     if [ ! -s "${KV_DIR}/Makefile" ]
241     then
242 johnm 1.11 qeerror "Could not find a Makefile in the kernel source directory."
243     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
244 johnm 1.7 die "Makefile not found in ${KV_DIR}"
245     fi
246 johnm 1.1
247 johnm 1.4 # OK so now we know our sources directory, but they might be using
248     # KBUILD_OUTPUT, and we need this for .config and localversions-*
249     # so we better find it eh?
250     # do we pass KBUILD_OUTPUT on the CLI?
251     OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
252    
253 johnm 1.6 # And if we didn't pass it, we can take a nosey in the Makefile
254 johnm 1.4 kbuild_output="$(getfilevar KBUILD_OUTPUT ${KV_DIR}/Makefile)"
255     OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
256    
257 johnm 1.1 # And contrary to existing functions I feel we shouldn't trust the
258     # directory name to find version information as this seems insane.
259     # so we parse ${KV_DIR}/Makefile
260     KV_MAJOR="$(getfilevar VERSION ${KV_DIR}/Makefile)"
261     KV_MINOR="$(getfilevar PATCHLEVEL ${KV_DIR}/Makefile)"
262     KV_PATCH="$(getfilevar SUBLEVEL ${KV_DIR}/Makefile)"
263     KV_EXTRA="$(getfilevar EXTRAVERSION ${KV_DIR}/Makefile)"
264 johnm 1.4
265 johnm 1.7 if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
266     then
267 johnm 1.11 qeerror "Could not detect kernel version."
268     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
269 johnm 1.7 die "Could not parse version info from ${KV_DIR}/Makefile"
270     fi
271    
272 johnm 1.1 # and in newer versions we can also pull LOCALVERSION if it is set.
273 johnm 1.4 # but before we do this, we need to find if we use a different object directory.
274     # This *WILL* break if the user is using localversions, but we assume it was
275     # caught before this if they are.
276     [ "${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.${KV_EXTRA}" == "$(uname -r)" ] && \
277 johnm 1.7 OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.${KV_EXTRA}/build}"
278 johnm 1.4
279     [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
280     [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
281     if [ -n "${KV_OUT_DIR}" ];
282     then
283 johnm 1.11 qeinfo "Found kernel object directory:"
284     qeinfo " ${KV_OUT_DIR}"
285 johnm 1.4
286     KV_LOCAL="$(cat ${KV_OUT_DIR}/localversion* 2>/dev/null)"
287     fi
288     # and if we STILL haven't got it, then we better just set it to KV_DIR
289     KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
290    
291     KV_LOCAL="${KV_LOCAL}$(cat ${KV_DIR}/localversion* 2>/dev/null)"
292 johnm 1.7 KV_LOCAL="${KV_LOCAL}$(linux_chkconfig_string LOCALVERSION)"
293     KV_LOCAL="${KV_LOCAL//\"/}"
294 johnm 1.1
295     # And we should set KV_FULL to the full expanded version
296     KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
297    
298 johnm 1.11 qeinfo "Found sources for kernel version:"
299     qeinfo " ${KV_FULL}"
300 johnm 1.9
301     if [ ! -s "${KV_OUT_DIR}/.config" ]
302     then
303 johnm 1.11 qeerror "Could not find a usable .config in the kernel source directory."
304     qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources"
305 johnm 1.9 die ".config not found in ${KV_OUT_DIR}"
306     fi
307 johnm 1.1 }
308    
309    
310    
311    
312     # ebuild check functions
313     # ---------------------------------------
314    
315     check_kernel_built() {
316     # if we haven't determined the version yet, we need too.
317     get_version;
318    
319 johnm 1.4 if [ ! -f "${KV_OUT_DIR}/System.map" ]
320 johnm 1.1 then
321     eerror "These sources have not yet been compiled."
322     eerror "We cannot build against an uncompiled tree."
323     eerror "To resolve this, please type the following:"
324     eerror
325     eerror "# cd ${KV_DIR}"
326     eerror "# make oldconfig"
327     eerror "# make bzImage modules modules_install"
328     eerror
329     eerror "Then please try merging this module again."
330     die "Kernel sources need compiling first"
331     fi
332     }
333    
334     check_modules_supported() {
335     # if we haven't determined the version yet, we need too.
336     get_version;
337    
338 johnm 1.7 if ! linux_chkconfig_builtin "MODULES"
339 johnm 1.1 then
340     eerror "These sources do not support loading external modules."
341     eerror "to be able to use this module please enable \"Loadable modules support\""
342     eerror "in your kernel, recompile and then try merging this module again."
343 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
344 johnm 1.3 fi
345     }
346    
347     check_extra_config() {
348 johnm 1.7 local config negate error local_error
349 johnm 1.3
350     # if we haven't determined the version yet, we need too.
351     get_version;
352    
353     einfo "Checking for suitable kernel configuration options"
354     for config in ${CONFIG_CHECK}
355     do
356     negate="${config:0:1}"
357     if [ "${negate}" == "!" ];
358     then
359     config="${config:1}"
360 johnm 1.7 if linux_chkconfig_present ${config}
361 johnm 1.3 then
362 johnm 1.7 local_error="${config}_ERROR"
363     local_error="${!local_error}"
364     [ -n "${local_error}" ] && eerror " ${local_error}" || \
365     eerror " CONFIG_${config}:\tshould not be set in the kernel configuration, but it is."
366 johnm 1.3 error=1
367     fi
368     else
369 johnm 1.7 if ! linux_chkconfig_present ${config}
370 johnm 1.3 then
371 johnm 1.7 local_error="${config}_ERROR"
372     local_error="${!local_error}"
373     [ -n "${local_error}" ] && eerror " ${local_error}" || \
374     eerror " CONFIG_${config}:\tshould be set in the kernel configuration, but isn't"
375 johnm 1.3 error=1
376     fi
377     fi
378     done
379    
380     if [ -n "${error}" ] ;
381     then
382     eerror "Please check to make sure these options are set correctly."
383     eerror "Once you have satisfied these options, please try merging"
384     eerror "this package again."
385 johnm 1.7 die "Incorrect kernel configuration options"
386 johnm 1.1 fi
387     }
388    
389     check_zlibinflate() {
390     # if we haven't determined the version yet, we need too.
391     get_version;
392    
393     # although I restructured this code - I really really really dont support it!
394    
395     # bug #27882 - zlib routines are only linked into the kernel
396     # if something compiled into the kernel calls them
397     #
398     # plus, for the cloop module, it appears that there's no way
399     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
400     # is on
401    
402     local INFLATE
403     local DEFLATE
404    
405     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
406    
407     ebegin "checking ZLIB_INFLATE"
408     getfilevar_isbuiltin CONFIG_ZLIB_INFLATE ${KV_DIR}/.config
409     eend $?
410     [ "$?" != 0 ] && die
411    
412     ebegin "checking ZLIB_DEFLATE"
413     getfilevar_isbuiltin CONFIG_ZLIB_DEFLATE ${KV_DIR}/.config
414     eend $?
415     [ "$?" != 0 ] && die
416    
417    
418     local LINENO_START
419     local LINENO_END
420     local SYMBOLS
421     local x
422    
423     LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
424     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
425     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
426     (( LINENO_END = $LINENO_END - 1 ))
427 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
428 johnm 1.1
429     # okay, now we have a list of symbols
430     # we need to check each one in turn, to see whether it is set or not
431     for x in $SYMBOLS ; do
432     if [ "${!x}" = "y" ]; then
433     # we have a winner!
434     einfo "${x} ensures zlib is linked into your kernel - excellent"
435     return 0
436     fi
437     done
438    
439     eerror
440     eerror "This kernel module requires ZLIB library support."
441     eerror "You have enabled zlib support in your kernel, but haven't enabled"
442     eerror "enabled any option that will ensure that zlib is linked into your"
443     eerror "kernel."
444     eerror
445     eerror "Please ensure that you enable at least one of these options:"
446     eerror
447    
448     for x in $SYMBOLS ; do
449     eerror " * $x"
450     done
451    
452     eerror
453     eerror "Please remember to recompile and install your kernel, and reboot"
454     eerror "into your new kernel before attempting to load this kernel module."
455    
456     die "Kernel doesn't include zlib support"
457     }
458 johnm 1.8
459     ################################
460     # Default pkg_setup
461     # Also used when inheriting linux-mod to force a get_version call
462    
463     linux-info_pkg_setup() {
464     get_version;
465 johnm 1.10 [ -n "${CONFIG_CHECK}" ] && check_extra_config;
466 johnm 1.8 }

  ViewVC Help
Powered by ViewVC 1.1.20