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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.23 - (hide annotations) (download)
Fri Apr 8 18:42:23 2005 UTC (9 years, 8 months ago) by johnm
Branch: MAIN
Changes since 1.22: +51 -60 lines
Adding support for get_running_version. Also included, kernel_is fixup and removal of some stupid ebeep

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

  ViewVC Help
Powered by ViewVC 1.1.20