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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.57 - (hide annotations) (download)
Wed Dec 3 18:11:47 2008 UTC (5 years, 10 months ago) by dsd
Branch: MAIN
Changes since 1.56: +3 -6 lines
avoid changing of directory, reported by Tanktalus in bug #229223

1 vapier 1.37 # Copyright 1999-2006 Gentoo Foundation
2 johnm 1.1 # Distributed under the terms of the GNU General Public License v2
3 dsd 1.57 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.56 2008/10/31 22:01:32 dsd Exp $
4 johnm 1.1 #
5 phreak 1.52 # Original author: John Mylchreest <johnm@gentoo.org>
6     # Maintainer: kernel-misc@gentoo.org
7 johnm 1.10 #
8     # Please direct your bugs to the current eclass maintainer :)
9    
10 dsd 1.56 # @ECLASS: linux-info.eclass
11     # @MAINTAINER:
12     # kernel-misc@gentoo.org
13     # @BLURB: eclass used for accessing kernel related information
14     # @DESCRIPTION:
15     # This eclass is used as a central eclass for accessing kernel
16     # related information for sources already installed.
17     # It is vital for linux-mod.eclass to function correctly, and is split
18     # out so that any ebuild behaviour "templates" are abstracted out
19     # using additional eclasses.
20    
21 johnm 1.10 # A Couple of env vars are available to effect usage of this eclass
22     # These are as follows:
23 dsd 1.56
24     # @ECLASS-VARIABLE: KERNEL_DIR
25     # @DESCRIPTION:
26     # A string containing the directory of the target kernel sources. The default value is
27     # "/usr/src/linux"
28    
29     # @ECLASS-VARIABLE: CONFIG_CHECK
30     # @DESCRIPTION:
31     # A string containing a list of .config options to check for before
32     # proceeding with the install.
33     #
34     # e.g.: CONFIG_CHECK="MTRR"
35     #
36     # You can also check that an option doesn't exist by
37     # prepending it with an exclamation mark (!).
38     #
39     # e.g.: CONFIG_CHECK="!MTRR"
40     #
41     # To simply warn about a missing option, prepend a '~'.
42    
43     # @ECLASS-VARIABLE: ERROR_<CFG>
44     # @DESCRIPTION:
45     # A string containing the error message to display when the check against CONFIG_CHECK
46     # fails. <CFG> should reference the appropriate option used in CONFIG_CHECK.
47 swegener 1.29 #
48 dsd 1.56 # e.g.: ERROR_MTRR="MTRR exists in the .config but shouldn't!!"
49    
50     # @ECLASS-VARIABLE: KBUILD_OUTPUT
51     # @DESCRIPTION:
52     # A string passed on commandline, or set from the kernel makefile. It contains the directory
53     # which is to be used as the kernel object directory.
54 johnm 1.10
55     # There are also a couple of variables which are set by this, and shouldn't be
56     # set by hand. These are as follows:
57 dsd 1.56
58     # @ECLASS-VARIABLE: KV_FULL
59     # @DESCRIPTION:
60     # A read-only variable. It's a string containing the full kernel version. ie: 2.6.9-gentoo-johnm-r1
61    
62     # @ECLASS-VARIABLE: KV_MAJOR
63     # @DESCRIPTION:
64     # A read-only variable. It's an integer containing the kernel major version. ie: 2
65    
66     # @ECLASS-VARIABLE: KV_MINOR
67     # @DESCRIPTION:
68     # A read-only variable. It's an integer containing the kernel minor version. ie: 6
69    
70     # @ECLASS-VARIABLE: KV_PATCH
71     # @DESCRIPTION:
72     # A read-only variable. It's an integer containing the kernel patch version. ie: 9
73    
74     # @ECLASS-VARIABLE: KV_EXTRA
75     # @DESCRIPTION:
76     # A read-only variable. It's a string containing the kernel EXTRAVERSION. ie: -gentoo
77    
78     # @ECLASS-VARIABLE: KV_LOCAL
79     # @DESCRIPTION:
80     # A read-only variable. It's a string containing the kernel LOCALVERSION concatenation. ie: -johnm
81    
82     # @ECLASS-VARIABLE: KV_DIR
83     # @DESCRIPTION:
84     # A read-only variable. It's a string containing the kernel source directory, will be null if
85     # KERNEL_DIR is invalid.
86    
87     # @ECLASS-VARIABLE: KV_OUT_DIR
88     # @DESCRIPTION:
89     # A read-only variable. It's a string containing the kernel object directory, will be KV_DIR unless
90     # KBUILD_OUTPUT is used. This should be used for referencing .config.
91 johnm 1.10
92 johnm 1.21 # And to ensure all the weirdness with crosscompile
93 johnm 1.23 inherit toolchain-funcs versionator
94 johnm 1.1
95 johnm 1.8 EXPORT_FUNCTIONS pkg_setup
96 johnm 1.1
97 exg 1.40 DEPEND="kernel_linux? ( virtual/linux-sources )"
98 brix 1.39 RDEPEND=""
99    
100 johnm 1.1 # Overwritable environment Var's
101     # ---------------------------------------
102 johnm 1.21 KERNEL_DIR="${KERNEL_DIR:-${ROOT}usr/src/linux}"
103 johnm 1.1
104 johnm 1.7
105 johnm 1.16 # Bug fixes
106     # fix to bug #75034
107     case ${ARCH} in
108 swegener 1.29 ppc) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
109     ppc64) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
110 johnm 1.16 esac
111    
112 vapier 1.51 # @FUNCTION: set_arch_to_kernel
113     # @DESCRIPTION:
114     # Set the env ARCH to match what the kernel expects.
115     set_arch_to_kernel() { export ARCH=$(tc-arch-kernel); }
116     # @FUNCTION: set_arch_to_portage
117     # @DESCRIPTION:
118     # Set the env ARCH to match what portage expects.
119     set_arch_to_portage() { export ARCH=$(tc-arch); }
120 johnm 1.11
121     # qeinfo "Message"
122     # -------------------
123 johnm 1.21 # qeinfo is a quiet einfo call when EBUILD_PHASE
124 johnm 1.11 # should not have visible output.
125 johnm 1.21 qout() {
126     local outputmsg type
127     type=${1}
128     shift
129     outputmsg="${@}"
130 wolf31o2 1.26 case "${EBUILD_PHASE}" in
131     depend) unset outputmsg;;
132     clean) unset outputmsg;;
133     preinst) unset outputmsg;;
134     esac
135     [ -n "${outputmsg}" ] && ${type} "${outputmsg}"
136 johnm 1.11 }
137    
138 johnm 1.21 qeinfo() { qout einfo "${@}" ; }
139     qeerror() { qout eerror "${@}" ; }
140 johnm 1.11
141 johnm 1.1 # File Functions
142     # ---------------------------------------
143    
144 dsd 1.56 # @FUNCTION: getfilevar
145     # @USAGE: variable configfile
146     # @RETURN: the value of the variable
147     # @DESCRIPTION:
148     # It detects the value of the variable defined in the file configfile
149 johnm 1.1 getfilevar() {
150 dsd 1.57 local ERROR basefname basedname myARCH="${ARCH}"
151 johnm 1.1 ERROR=0
152 johnm 1.16
153 johnm 1.1 [ -z "${1}" ] && ERROR=1
154     [ ! -f "${2}" ] && ERROR=1
155    
156     if [ "${ERROR}" = 1 ]
157     then
158 johnm 1.6 echo -e "\n"
159 johnm 1.1 eerror "getfilevar requires 2 variables, with the second a valid file."
160     eerror " getfilevar <VARIABLE> <CONFIGFILE>"
161     else
162 johnm 1.34 basefname="$(basename ${2})"
163     basedname="$(dirname ${2})"
164 johnm 1.6 unset ARCH
165 johnm 1.21
166 johnm 1.42 echo -e "e:\\n\\t@echo \$(${1})\\ninclude ${basefname}" | \
167 dsd 1.57 make -C "${basedname}" M="${S}" ${BUILD_FIXES} -s -f - 2>/dev/null
168 johnm 1.21
169     ARCH=${myARCH}
170 johnm 1.1 fi
171     }
172    
173 dsd 1.53
174 dsd 1.56 # @FUNCTION: linux_config_exists
175     # @RETURN: true or false
176     # @DESCRIPTION:
177     # It returns true if .config exists otherwise false
178 dsd 1.53 linux_config_exists() {
179     [ -s "${KV_OUT_DIR}/.config" ]
180     }
181    
182 dsd 1.56 # @FUNCTION: require_configured_kernel
183     # @DESCRIPTION:
184     # This function verifies that the current kernel is configured (it checks against the existence of .config)
185     # otherwise it dies.
186 dsd 1.53 require_configured_kernel() {
187     if ! linux_config_exists; then
188     qeerror "Could not find a usable .config in the kernel source directory."
189     qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources."
190     qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that"
191     qeerror "it points to the necessary object directory so that it might find .config."
192     die "Kernel not configured; no .config found in ${KV_OUT_DIR}"
193     fi
194     }
195    
196 dsd 1.56 # @FUNCTION: linux_chkconfig_present
197     # @USAGE: option
198     # @RETURN: true or false
199     # @DESCRIPTION:
200     # It checks that CONFIG_<option>=y or CONFIG_<option>=n is present in the current kernel .config
201 johnm 1.7 linux_chkconfig_present() {
202 johnm 1.1 local RESULT
203 dsd 1.53 require_configured_kernel
204 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
205 johnm 1.1 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
206     }
207    
208 dsd 1.56 # @FUNCTION: linux_chkconfig_module
209     # @USAGE: option
210     # @RETURN: true or false
211     # @DESCRIPTION:
212     # It checks that CONFIG_<option>=m is present in the current kernel .config
213 johnm 1.7 linux_chkconfig_module() {
214 johnm 1.1 local RESULT
215 dsd 1.53 require_configured_kernel
216 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
217 johnm 1.1 [ "${RESULT}" = "m" ] && return 0 || return 1
218     }
219    
220 dsd 1.56 # @FUNCTION: linux_chkconfig_builtin
221     # @USAGE: option
222     # @RETURN: true or false
223     # @DESCRIPTION:
224     # It checks that CONFIG_<option>=y is present in the current kernel .config
225 johnm 1.7 linux_chkconfig_builtin() {
226 johnm 1.1 local RESULT
227 dsd 1.53 require_configured_kernel
228 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
229 johnm 1.1 [ "${RESULT}" = "y" ] && return 0 || return 1
230     }
231    
232 dsd 1.56 # @FUNCTION: linux_chkconfig_string
233     # @USAGE: option
234     # @RETURN: CONFIG_<option>
235     # @DESCRIPTION:
236     # It prints the CONFIG_<option> value of the current kernel .config (it requires a configured kernel).
237 johnm 1.7 linux_chkconfig_string() {
238 dsd 1.53 require_configured_kernel
239 johnm 1.7 getfilevar "CONFIG_${1}" "${KV_OUT_DIR}/.config"
240     }
241    
242 johnm 1.1 # Versioning Functions
243     # ---------------------------------------
244    
245 dsd 1.56 # @FUNCTION: kernel_is
246     # @USAGE: [-lt -gt -le -ge -eq] major_number [minor_number patch_number]
247     # @RETURN: true or false
248     # @DESCRIPTION:
249     # It returns true when the current kernel version satisfies the comparison against the passed version.
250     # -eq is the default comparison.
251 johnm 1.1 #
252 dsd 1.56 # @CODE
253 johnm 1.1 # For Example where KV = 2.6.9
254 dsd 1.56 # kernel_is 2 4 returns false
255     # kernel_is 2 returns true
256     # kernel_is 2 6 returns true
257     # kernel_is 2 6 8 returns false
258     # kernel_is 2 6 9 returns true
259     # @CODE
260    
261 johnm 1.1 # got the jist yet?
262    
263     kernel_is() {
264 dsd 1.53 # if we haven't determined the version yet, we need to.
265     get_version
266 johnm 1.23 local operator test value x=0 y=0 z=0
267    
268     case ${1} in
269     lt) operator="-lt"; shift;;
270     gt) operator="-gt"; shift;;
271     le) operator="-le"; shift;;
272     ge) operator="-ge"; shift;;
273     eq) operator="-eq"; shift;;
274     *) operator="-eq";;
275     esac
276    
277     for x in ${@}; do
278     for((y=0; y<$((3 - ${#x})); y++)); do value="${value}0"; done
279     value="${value}${x}"
280     z=$((${z} + 1))
281    
282     case ${z} in
283     1) for((y=0; y<$((3 - ${#KV_MAJOR})); y++)); do test="${test}0"; done;
284     test="${test}${KV_MAJOR}";;
285     2) for((y=0; y<$((3 - ${#KV_MINOR})); y++)); do test="${test}0"; done;
286     test="${test}${KV_MINOR}";;
287     3) for((y=0; y<$((3 - ${#KV_PATCH})); y++)); do test="${test}0"; done;
288     test="${test}${KV_PATCH}";;
289     *) die "Error in kernel-2_kernel_is(): Too many parameters.";;
290     esac
291     done
292 johnm 1.12
293 swegener 1.29 [ ${test} ${operator} ${value} ] && return 0 || return 1
294 johnm 1.1 }
295    
296 johnm 1.30 get_localversion() {
297     local lv_list i x
298    
299     # ignore files with ~ in it.
300     for i in $(ls ${1}/localversion* 2>/dev/null); do
301     [[ -n ${i//*~*} ]] && lv_list="${lv_list} ${i}"
302     done
303    
304     for i in ${lv_list}; do
305     x="${x}$(<${i})"
306     done
307     x=${x/ /}
308     echo ${x}
309     }
310    
311 dsd 1.56 # @FUNCTION: get_version
312     # @DESCRIPTION:
313     # It gets the version of the kernel inside KERNEL_DIR and populates the KV_FULL variable
314     # (if KV_FULL is already set it does nothing).
315     #
316     # The kernel version variables (KV_MAJOR, KV_MINOR, KV_PATCH, KV_EXTRA and KV_LOCAL) are also set.
317     #
318     # The KV_DIR is set using the KERNEL_DIR env var, the KV_DIR_OUT is set using a valid
319     # KBUILD_OUTPUT (in a decreasing priority list, we look for the env var, makefile var or the
320     # symlink /lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build).
321 johnm 1.1 get_version() {
322 johnm 1.4 local kbuild_output
323 swegener 1.29
324 johnm 1.1 # no need to execute this twice assuming KV_FULL is populated.
325     # we can force by unsetting KV_FULL
326 johnm 1.19 [ -n "${KV_FULL}" ] && return 0
327 johnm 1.1
328     # if we dont know KV_FULL, then we need too.
329     # make sure KV_DIR isnt set since we need to work it out via KERNEL_DIR
330     unset KV_DIR
331    
332     # KV_DIR will contain the full path to the sources directory we should use
333 johnm 1.11 qeinfo "Determining the location of the kernel source code"
334 johnm 1.1 [ -h "${KERNEL_DIR}" ] && KV_DIR="$(readlink -f ${KERNEL_DIR})"
335     [ -d "${KERNEL_DIR}" ] && KV_DIR="${KERNEL_DIR}"
336 swegener 1.29
337 johnm 1.1 if [ -z "${KV_DIR}" ]
338     then
339 johnm 1.11 qeerror "Unable to find kernel sources at ${KERNEL_DIR}"
340     qeinfo "This package requires Linux sources."
341 johnm 1.7 if [ "${KERNEL_DIR}" == "/usr/src/linux" ] ; then
342 johnm 1.11 qeinfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "
343     qeinfo "(or the kernel you wish to build against)."
344     qeinfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"
345 johnm 1.7 else
346 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."
347 johnm 1.7 fi
348 johnm 1.19 return 1
349 johnm 1.7 fi
350    
351 johnm 1.11 qeinfo "Found kernel source directory:"
352     qeinfo " ${KV_DIR}"
353 johnm 1.7
354     if [ ! -s "${KV_DIR}/Makefile" ]
355     then
356 johnm 1.11 qeerror "Could not find a Makefile in the kernel source directory."
357     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
358 johnm 1.19 return 1
359 johnm 1.7 fi
360 swegener 1.29
361 johnm 1.4 # OK so now we know our sources directory, but they might be using
362     # KBUILD_OUTPUT, and we need this for .config and localversions-*
363     # so we better find it eh?
364     # do we pass KBUILD_OUTPUT on the CLI?
365     OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
366 swegener 1.29
367 johnm 1.6 # And if we didn't pass it, we can take a nosey in the Makefile
368 johnm 1.4 kbuild_output="$(getfilevar KBUILD_OUTPUT ${KV_DIR}/Makefile)"
369     OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
370 swegener 1.29
371 johnm 1.1 # And contrary to existing functions I feel we shouldn't trust the
372     # directory name to find version information as this seems insane.
373     # so we parse ${KV_DIR}/Makefile
374     KV_MAJOR="$(getfilevar VERSION ${KV_DIR}/Makefile)"
375     KV_MINOR="$(getfilevar PATCHLEVEL ${KV_DIR}/Makefile)"
376     KV_PATCH="$(getfilevar SUBLEVEL ${KV_DIR}/Makefile)"
377     KV_EXTRA="$(getfilevar EXTRAVERSION ${KV_DIR}/Makefile)"
378 swegener 1.29
379 johnm 1.7 if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
380     then
381 johnm 1.11 qeerror "Could not detect kernel version."
382 johnm 1.19 qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources."
383     return 1
384 johnm 1.7 fi
385 swegener 1.29
386 johnm 1.1 # and in newer versions we can also pull LOCALVERSION if it is set.
387 johnm 1.4 # but before we do this, we need to find if we use a different object directory.
388     # This *WILL* break if the user is using localversions, but we assume it was
389     # caught before this if they are.
390 genstef 1.49 [ "${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}" == "$(uname -r)" ] && \
391     OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build}"
392 johnm 1.4
393     [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
394     [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
395     if [ -n "${KV_OUT_DIR}" ];
396     then
397 johnm 1.11 qeinfo "Found kernel object directory:"
398     qeinfo " ${KV_OUT_DIR}"
399 swegener 1.29
400 johnm 1.30 KV_LOCAL="$(get_localversion ${KV_OUT_DIR})"
401 johnm 1.4 fi
402 johnm 1.41 # and if we STILL have not got it, then we better just set it to KV_DIR
403 johnm 1.4 KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
404 johnm 1.21
405 dsd 1.53 KV_LOCAL="${KV_LOCAL}$(get_localversion ${KV_DIR})"
406     if linux_config_exists; then
407     KV_LOCAL="${KV_LOCAL}$(linux_chkconfig_string LOCALVERSION)"
408     KV_LOCAL="${KV_LOCAL//\"/}"
409    
410     # For things like git that can append extra stuff:
411     [ -e ${KV_DIR}/scripts/setlocalversion ] &&
412     linux_chkconfig_builtin LOCALVERSION_AUTO &&
413     KV_LOCAL="${KV_LOCAL}$(sh ${KV_DIR}/scripts/setlocalversion ${KV_DIR})"
414 johnm 1.41 fi
415    
416 johnm 1.1 # And we should set KV_FULL to the full expanded version
417     KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
418 johnm 1.21
419 johnm 1.11 qeinfo "Found sources for kernel version:"
420     qeinfo " ${KV_FULL}"
421 johnm 1.21
422 johnm 1.19 return 0
423 johnm 1.1 }
424    
425 dsd 1.56 # @FUNCTION: get_running_version
426     # @DESCRIPTION:
427     # It gets the version of the current running kernel and the result is the same as get_version() if the
428     # function can find the sources.
429 johnm 1.23 get_running_version() {
430     KV_FULL=$(uname -r)
431 johnm 1.1
432 johnm 1.23 if [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile ]]; then
433     KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
434     unset KV_FULL
435     get_version
436     return $?
437     elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
438     KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
439     unset KV_FULL
440     get_version
441     return $?
442     else
443     KV_MAJOR=$(get_version_component_range 1 ${KV_FULL})
444     KV_MINOR=$(get_version_component_range 2 ${KV_FULL})
445     KV_PATCH=$(get_version_component_range 3- ${KV_FULL})
446     KV_PATCH=${KV_PATCH//-*}
447     [[ -n ${KV_FULL#*-} ]] && [[ -n ${KV_FULL//${KV_FULL#*-}} ]] \
448     && KV_EXTRA="-${KV_FULL#*-}"
449     fi
450     return 0
451     }
452 johnm 1.1
453    
454     # ebuild check functions
455     # ---------------------------------------
456    
457 dsd 1.56 # @FUNCTION: check_kernel_built
458     # @DESCRIPTION:
459     # This function verifies that the current kernel sources have been already prepared otherwise it dies.
460 johnm 1.1 check_kernel_built() {
461 dsd 1.53 # if we haven't determined the version yet, we need to
462 dsd 1.54 require_configured_kernel
463 dsd 1.53 get_version
464 swegener 1.29
465 johnm 1.16 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ]
466 johnm 1.1 then
467 johnm 1.16 eerror "These sources have not yet been prepared."
468     eerror "We cannot build against an unprepared tree."
469 johnm 1.1 eerror "To resolve this, please type the following:"
470     eerror
471     eerror "# cd ${KV_DIR}"
472     eerror "# make oldconfig"
473 johnm 1.16 eerror "# make modules_prepare"
474 johnm 1.1 eerror
475     eerror "Then please try merging this module again."
476     die "Kernel sources need compiling first"
477     fi
478     }
479    
480 dsd 1.56 # @FUNCTION: check_modules_supported
481     # @DESCRIPTION:
482     # This function verifies that the current kernel support modules (it checks CONFIG_MODULES=y) otherwise it dies.
483 johnm 1.1 check_modules_supported() {
484     # if we haven't determined the version yet, we need too.
485 dsd 1.53 require_configured_kernel
486     get_version
487 swegener 1.29
488 johnm 1.7 if ! linux_chkconfig_builtin "MODULES"
489 johnm 1.1 then
490     eerror "These sources do not support loading external modules."
491     eerror "to be able to use this module please enable \"Loadable modules support\""
492     eerror "in your kernel, recompile and then try merging this module again."
493 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
494 johnm 1.3 fi
495     }
496    
497 dsd 1.56 # @FUNCTION: check_extra_config
498     # @DESCRIPTION:
499     # It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e.
500     # the prefix ~ is not used) doesn't satisfy the directive.
501 johnm 1.3 check_extra_config() {
502 mrness 1.45 local config negate die error reworkmodulenames
503 dsd 1.53 local soft_errors_count=0 hard_errors_count=0 config_required=0
504    
505 dsd 1.55 # if we haven't determined the version yet, we need to
506     get_version
507    
508 dsd 1.53 # Determine if we really need a .config. The only time when we don't need
509     # one is when all of the CONFIG_CHECK options are prefixed with "~".
510     for config in ${CONFIG_CHECK}
511     do
512     if [[ "${config:0:1}" != "~" ]]; then
513     config_required=1
514     break
515     fi
516     done
517    
518     if [[ ${config_required} == 0 ]]; then
519     # In the case where we don't require a .config, we can now bail out
520     # if the user has no .config as there is nothing to do. Otherwise
521     # code later will cause a failure due to missing .config.
522     if ! linux_config_exists; then
523     return 0
524     fi
525     else
526     require_configured_kernel
527     fi
528 johnm 1.3
529 mrness 1.45 einfo "Checking for suitable kernel configuration options..."
530 dsd 1.53
531 johnm 1.3 for config in ${CONFIG_CHECK}
532     do
533 johnm 1.31 # if we specify any fatal, ensure we honor them
534     die=1
535     error=0
536     negate=0
537     reworkmodulenames=0
538    
539 dsd 1.53 if [[ ${config:0:1} == "~" ]]; then
540 mrness 1.45 die=0
541 johnm 1.31 config=${config:1}
542 dsd 1.53 elif [[ ${config:0:1} == "@" ]]; then
543 mrness 1.45 die=0
544 johnm 1.31 reworkmodulenames=1
545     config=${config:1}
546     fi
547 dsd 1.53 if [[ ${config:0:1} == "!" ]]; then
548 mrness 1.45 negate=1
549 johnm 1.44 config=${config:1}
550     fi
551 johnm 1.17
552 johnm 1.31 if [[ ${negate} == 1 ]]; then
553     linux_chkconfig_present ${config} && error=2
554     elif [[ ${reworkmodulenames} == 1 ]]; then
555 mrness 1.45 local temp_config="${config//*:}" i n
556 johnm 1.17 config="${config//:*}"
557 johnm 1.31 if linux_chkconfig_present ${config}; then
558     for i in ${MODULE_NAMES}; do
559 johnm 1.17 n="${i//${temp_config}}"
560 dsd 1.38 [[ -z ${n//\(*} ]] && \
561 johnm 1.31 MODULE_IGNORE="${MODULE_IGNORE} ${temp_config}"
562 johnm 1.17 done
563 johnm 1.31 error=2
564 johnm 1.17 fi
565 johnm 1.3 else
566 johnm 1.31 linux_chkconfig_present ${config} || error=1
567     fi
568    
569 mrness 1.45 if [[ ${error} > 0 ]]; then
570     local report_func="eerror" local_error
571     local_error="ERROR_${config}"
572     local_error="${!local_error}"
573    
574     if [[ -z "${local_error}" ]]; then
575     # using old, deprecated format.
576     local_error="${config}_ERROR"
577     local_error="${!local_error}"
578     fi
579     if [[ ${die} == 0 && -z "${local_error}" ]]; then
580     #soft errors can be warnings
581     local_error="WARNING_${config}"
582 johnm 1.7 local_error="${!local_error}"
583 mrness 1.45 if [[ -n "${local_error}" ]] ; then
584     report_func="ewarn"
585 johnm 1.44 fi
586 mrness 1.45 fi
587 johnm 1.44
588 mrness 1.45 if [[ -z "${local_error}" ]]; then
589     [[ ${error} == 1 ]] \
590     && local_error="is not set when it should be." \
591     || local_error="should not be set. But it is."
592     local_error="CONFIG_${config}:\t ${local_error}"
593     fi
594     if [[ ${die} == 0 ]]; then
595     ${report_func} " ${local_error}"
596     soft_errors_count=$[soft_errors_count + 1]
597     else
598     ${report_func} " ${local_error}"
599     hard_errors_count=$[hard_errors_count + 1]
600 johnm 1.3 fi
601     fi
602     done
603    
604 mrness 1.45 if [[ ${hard_errors_count} > 0 ]]; then
605 johnm 1.3 eerror "Please check to make sure these options are set correctly."
606 johnm 1.31 eerror "Failure to do so may cause unexpected problems."
607 mrness 1.45 eerror "Once you have satisfied these options, please try merging"
608     eerror "this package again."
609     die "Incorrect kernel configuration options"
610     elif [[ ${soft_errors_count} > 0 ]]; then
611     ewarn "Please check to make sure these options are set correctly."
612     ewarn "Failure to do so may cause unexpected problems."
613     else
614     eend 0
615 johnm 1.1 fi
616     }
617    
618     check_zlibinflate() {
619 dsd 1.53 # if we haven't determined the version yet, we need to
620     require_configured_kernel
621     get_version
622 swegener 1.29
623 johnm 1.1 # although I restructured this code - I really really really dont support it!
624    
625     # bug #27882 - zlib routines are only linked into the kernel
626     # if something compiled into the kernel calls them
627     #
628     # plus, for the cloop module, it appears that there's no way
629     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
630     # is on
631 swegener 1.29
632     local INFLATE
633     local DEFLATE
634 johnm 1.1
635     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
636 swegener 1.29
637 johnm 1.1 ebegin "checking ZLIB_INFLATE"
638     getfilevar_isbuiltin CONFIG_ZLIB_INFLATE ${KV_DIR}/.config
639     eend $?
640     [ "$?" != 0 ] && die
641 swegener 1.29
642 johnm 1.1 ebegin "checking ZLIB_DEFLATE"
643     getfilevar_isbuiltin CONFIG_ZLIB_DEFLATE ${KV_DIR}/.config
644     eend $?
645     [ "$?" != 0 ] && die
646 swegener 1.29
647 johnm 1.1 local LINENO_START
648     local LINENO_END
649     local SYMBOLS
650     local x
651 swegener 1.29
652 johnm 1.1 LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
653     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
654     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
655     (( LINENO_END = $LINENO_END - 1 ))
656 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
657 johnm 1.1
658     # okay, now we have a list of symbols
659     # we need to check each one in turn, to see whether it is set or not
660     for x in $SYMBOLS ; do
661     if [ "${!x}" = "y" ]; then
662     # we have a winner!
663     einfo "${x} ensures zlib is linked into your kernel - excellent"
664     return 0
665     fi
666     done
667 swegener 1.29
668 johnm 1.1 eerror
669     eerror "This kernel module requires ZLIB library support."
670     eerror "You have enabled zlib support in your kernel, but haven't enabled"
671     eerror "enabled any option that will ensure that zlib is linked into your"
672     eerror "kernel."
673     eerror
674     eerror "Please ensure that you enable at least one of these options:"
675     eerror
676    
677     for x in $SYMBOLS ; do
678     eerror " * $x"
679     done
680    
681     eerror
682     eerror "Please remember to recompile and install your kernel, and reboot"
683     eerror "into your new kernel before attempting to load this kernel module."
684    
685     die "Kernel doesn't include zlib support"
686     }
687 johnm 1.8
688     ################################
689     # Default pkg_setup
690     # Also used when inheriting linux-mod to force a get_version call
691 dsd 1.56 # @FUNCTION: linux-info_pkg_setup
692     # @DESCRIPTION:
693     # Force a get_version() call when inherited from linux-mod.eclass and then check if the kernel is configured
694     # to support the options specified in CONFIG_CHECK (if not null)
695 johnm 1.8 linux-info_pkg_setup() {
696 johnm 1.19 get_version || die "Unable to calculate Linux Kernel version"
697 phreak 1.48
698     if kernel_is 2 4; then
699     if [ "$( gcc-major-version )" -eq "4" ] ; then
700     echo
701     ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with"
702     ewarn "linux-2.4 (or modules building against a linux-2.4 kernel)!"
703     echo
704     ewarn "Either switch to another gcc-version (via gcc-config) or use a"
705     ewarn "newer kernel that supports gcc-4."
706     echo
707     ewarn "Also be aware that bugreports about gcc-4 not working"
708     ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"
709     echo
710     epause 10
711     fi
712     fi
713    
714 johnm 1.10 [ -n "${CONFIG_CHECK}" ] && check_extra_config;
715 johnm 1.8 }

  ViewVC Help
Powered by ViewVC 1.1.20