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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.13 - (hide annotations) (download)
Tue Dec 28 21:00:10 2004 UTC (9 years, 6 months ago) by johnm
Branch: MAIN
Changes since 1.12: +1 -1 lines
Preventing -eq unary errors

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

  ViewVC Help
Powered by ViewVC 1.1.20