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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20