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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.27 - (hide annotations) (download)
Wed Jul 6 20:20:03 2005 UTC (9 years, 2 months ago) by agriffis
Branch: MAIN
Changes since 1.26: +1 -2 lines
Remove ECLASS= and INHERITED= which haven't been necessary for a long time now

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

  ViewVC Help
Powered by ViewVC 1.1.20