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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.19 - (hide annotations) (download)
Tue Jan 18 21:38:59 2005 UTC (9 years, 5 months ago) by johnm
Branch: MAIN
Changes since 1.18: +9 -7 lines
fixing die in get_version, to properly return result. can now base external ebuild logic on get_version

1 johnm 1.1 # Copyright 1999-2004 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 johnm 1.17 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.16 2005/01/06 13:58:15 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 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.19 [ -n "${KV_FULL}" ] && return 0
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 johnm 1.19 return 1
280 johnm 1.7 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.19 return 1
290 johnm 1.7 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 johnm 1.19 qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources."
314     return 1
315 johnm 1.7 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.19 return 1
353 johnm 1.9 fi
354 johnm 1.19
355     return 0
356 johnm 1.1 }
357    
358    
359    
360    
361     # ebuild check functions
362     # ---------------------------------------
363    
364     check_kernel_built() {
365     # if we haven't determined the version yet, we need too.
366     get_version;
367    
368 johnm 1.16 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ]
369 johnm 1.1 then
370 johnm 1.16 eerror "These sources have not yet been prepared."
371     eerror "We cannot build against an unprepared tree."
372 johnm 1.1 eerror "To resolve this, please type the following:"
373     eerror
374     eerror "# cd ${KV_DIR}"
375     eerror "# make oldconfig"
376 johnm 1.16 eerror "# make modules_prepare"
377 johnm 1.1 eerror
378     eerror "Then please try merging this module again."
379     die "Kernel sources need compiling first"
380     fi
381     }
382    
383     check_modules_supported() {
384     # if we haven't determined the version yet, we need too.
385     get_version;
386    
387 johnm 1.7 if ! linux_chkconfig_builtin "MODULES"
388 johnm 1.1 then
389     eerror "These sources do not support loading external modules."
390     eerror "to be able to use this module please enable \"Loadable modules support\""
391     eerror "in your kernel, recompile and then try merging this module again."
392 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
393 johnm 1.3 fi
394     }
395    
396     check_extra_config() {
397 johnm 1.17 local config negate error local_error i n temp_config
398 johnm 1.3
399     # if we haven't determined the version yet, we need too.
400     get_version;
401    
402     einfo "Checking for suitable kernel configuration options"
403     for config in ${CONFIG_CHECK}
404     do
405     negate="${config:0:1}"
406     if [ "${negate}" == "!" ];
407     then
408     config="${config:1}"
409 johnm 1.7 if linux_chkconfig_present ${config}
410 johnm 1.3 then
411 johnm 1.7 local_error="${config}_ERROR"
412     local_error="${!local_error}"
413     [ -n "${local_error}" ] && eerror " ${local_error}" || \
414     eerror " CONFIG_${config}:\tshould not be set in the kernel configuration, but it is."
415 johnm 1.3 error=1
416     fi
417 johnm 1.17 elif [ "${negate}" == "@" ];
418     then
419     # we never call this unless we are using MODULE_NAMES
420    
421     config="${config:1}"
422     temp_config="${config//*:}"
423     config="${config//:*}"
424     if linux_chkconfig_present ${config}
425     then
426     local_error="${config}_ERROR"
427     local_error="${!local_error}"
428     [ -n "${local_error}" ] && eerror " ${local_error}" || \
429     eerror " CONFIG_${config}:\tshould not be set in the kernel configuration, but it is."
430    
431     for i in ${MODULE_NAMES}
432     do
433     n="${i//${temp_config}}"
434 johnm 1.18 [ -z "${n//(*}" ] && MODULE_IGNORE="${MODULE_IGNORE} ${temp_config}"
435 johnm 1.17 done
436     error=0
437     fi
438 johnm 1.3 else
439 johnm 1.7 if ! linux_chkconfig_present ${config}
440 johnm 1.3 then
441 johnm 1.7 local_error="${config}_ERROR"
442     local_error="${!local_error}"
443     [ -n "${local_error}" ] && eerror " ${local_error}" || \
444     eerror " CONFIG_${config}:\tshould be set in the kernel configuration, but isn't"
445 johnm 1.3 error=1
446     fi
447     fi
448     done
449    
450 johnm 1.17 if [ "${error}" == 1 ] ;
451 johnm 1.3 then
452     eerror "Please check to make sure these options are set correctly."
453     eerror "Once you have satisfied these options, please try merging"
454     eerror "this package again."
455 johnm 1.7 die "Incorrect kernel configuration options"
456 johnm 1.1 fi
457     }
458    
459     check_zlibinflate() {
460     # if we haven't determined the version yet, we need too.
461     get_version;
462    
463     # although I restructured this code - I really really really dont support it!
464    
465     # bug #27882 - zlib routines are only linked into the kernel
466     # if something compiled into the kernel calls them
467     #
468     # plus, for the cloop module, it appears that there's no way
469     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
470     # is on
471    
472     local INFLATE
473     local DEFLATE
474    
475     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
476    
477     ebegin "checking ZLIB_INFLATE"
478     getfilevar_isbuiltin CONFIG_ZLIB_INFLATE ${KV_DIR}/.config
479     eend $?
480     [ "$?" != 0 ] && die
481    
482     ebegin "checking ZLIB_DEFLATE"
483     getfilevar_isbuiltin CONFIG_ZLIB_DEFLATE ${KV_DIR}/.config
484     eend $?
485     [ "$?" != 0 ] && die
486    
487    
488     local LINENO_START
489     local LINENO_END
490     local SYMBOLS
491     local x
492    
493     LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
494     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
495     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
496     (( LINENO_END = $LINENO_END - 1 ))
497 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
498 johnm 1.1
499     # okay, now we have a list of symbols
500     # we need to check each one in turn, to see whether it is set or not
501     for x in $SYMBOLS ; do
502     if [ "${!x}" = "y" ]; then
503     # we have a winner!
504     einfo "${x} ensures zlib is linked into your kernel - excellent"
505     return 0
506     fi
507     done
508    
509     eerror
510     eerror "This kernel module requires ZLIB library support."
511     eerror "You have enabled zlib support in your kernel, but haven't enabled"
512     eerror "enabled any option that will ensure that zlib is linked into your"
513     eerror "kernel."
514     eerror
515     eerror "Please ensure that you enable at least one of these options:"
516     eerror
517    
518     for x in $SYMBOLS ; do
519     eerror " * $x"
520     done
521    
522     eerror
523     eerror "Please remember to recompile and install your kernel, and reboot"
524     eerror "into your new kernel before attempting to load this kernel module."
525    
526     die "Kernel doesn't include zlib support"
527     }
528 johnm 1.8
529     ################################
530     # Default pkg_setup
531     # Also used when inheriting linux-mod to force a get_version call
532    
533     linux-info_pkg_setup() {
534 johnm 1.19 get_version || die "Unable to calculate Linux Kernel version"
535 johnm 1.10 [ -n "${CONFIG_CHECK}" ] && check_extra_config;
536 johnm 1.8 }

  ViewVC Help
Powered by ViewVC 1.1.20