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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.56 - (hide annotations) (download)
Fri Oct 31 22:01:32 2008 UTC (6 years, 6 months ago) by dsd
Branch: MAIN
Changes since 1.55: +151 -47 lines
Add documentation from Fabio Rossi in bug #217562

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.56 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.55 2008/03/21 11:11:27 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 johnm 1.21 local ERROR workingdir 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 workingdir="${PWD}"
163     basefname="$(basename ${2})"
164     basedname="$(dirname ${2})"
165 johnm 1.6 unset ARCH
166 johnm 1.21
167 johnm 1.34 cd "${basedname}"
168 johnm 1.42 echo -e "e:\\n\\t@echo \$(${1})\\ninclude ${basefname}" | \
169 dsd 1.50 make M="${S}" ${BUILD_FIXES} -s -f - 2>/dev/null
170 johnm 1.34 cd "${workingdir}"
171 johnm 1.21
172     ARCH=${myARCH}
173 johnm 1.1 fi
174     }
175    
176 dsd 1.53
177 dsd 1.56 # @FUNCTION: linux_config_exists
178     # @RETURN: true or false
179     # @DESCRIPTION:
180     # It returns true if .config exists otherwise false
181 dsd 1.53 linux_config_exists() {
182     [ -s "${KV_OUT_DIR}/.config" ]
183     }
184    
185 dsd 1.56 # @FUNCTION: require_configured_kernel
186     # @DESCRIPTION:
187     # This function verifies that the current kernel is configured (it checks against the existence of .config)
188     # otherwise it dies.
189 dsd 1.53 require_configured_kernel() {
190     if ! linux_config_exists; then
191     qeerror "Could not find a usable .config in the kernel source directory."
192     qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources."
193     qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that"
194     qeerror "it points to the necessary object directory so that it might find .config."
195     die "Kernel not configured; no .config found in ${KV_OUT_DIR}"
196     fi
197     }
198    
199 dsd 1.56 # @FUNCTION: linux_chkconfig_present
200     # @USAGE: option
201     # @RETURN: true or false
202     # @DESCRIPTION:
203     # It checks that CONFIG_<option>=y or CONFIG_<option>=n is present in the current kernel .config
204 johnm 1.7 linux_chkconfig_present() {
205 johnm 1.1 local RESULT
206 dsd 1.53 require_configured_kernel
207 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
208 johnm 1.1 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
209     }
210    
211 dsd 1.56 # @FUNCTION: linux_chkconfig_module
212     # @USAGE: option
213     # @RETURN: true or false
214     # @DESCRIPTION:
215     # It checks that CONFIG_<option>=m is present in the current kernel .config
216 johnm 1.7 linux_chkconfig_module() {
217 johnm 1.1 local RESULT
218 dsd 1.53 require_configured_kernel
219 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
220 johnm 1.1 [ "${RESULT}" = "m" ] && return 0 || return 1
221     }
222    
223 dsd 1.56 # @FUNCTION: linux_chkconfig_builtin
224     # @USAGE: option
225     # @RETURN: true or false
226     # @DESCRIPTION:
227     # It checks that CONFIG_<option>=y is present in the current kernel .config
228 johnm 1.7 linux_chkconfig_builtin() {
229 johnm 1.1 local RESULT
230 dsd 1.53 require_configured_kernel
231 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
232 johnm 1.1 [ "${RESULT}" = "y" ] && return 0 || return 1
233     }
234    
235 dsd 1.56 # @FUNCTION: linux_chkconfig_string
236     # @USAGE: option
237     # @RETURN: CONFIG_<option>
238     # @DESCRIPTION:
239     # It prints the CONFIG_<option> value of the current kernel .config (it requires a configured kernel).
240 johnm 1.7 linux_chkconfig_string() {
241 dsd 1.53 require_configured_kernel
242 johnm 1.7 getfilevar "CONFIG_${1}" "${KV_OUT_DIR}/.config"
243     }
244    
245 johnm 1.1 # Versioning Functions
246     # ---------------------------------------
247    
248 dsd 1.56 # @FUNCTION: kernel_is
249     # @USAGE: [-lt -gt -le -ge -eq] major_number [minor_number patch_number]
250     # @RETURN: true or false
251     # @DESCRIPTION:
252     # It returns true when the current kernel version satisfies the comparison against the passed version.
253     # -eq is the default comparison.
254 johnm 1.1 #
255 dsd 1.56 # @CODE
256 johnm 1.1 # For Example where KV = 2.6.9
257 dsd 1.56 # kernel_is 2 4 returns false
258     # kernel_is 2 returns true
259     # kernel_is 2 6 returns true
260     # kernel_is 2 6 8 returns false
261     # kernel_is 2 6 9 returns true
262     # @CODE
263    
264 johnm 1.1 # got the jist yet?
265    
266     kernel_is() {
267 dsd 1.53 # if we haven't determined the version yet, we need to.
268     get_version
269 johnm 1.23 local operator test value x=0 y=0 z=0
270    
271     case ${1} in
272     lt) operator="-lt"; shift;;
273     gt) operator="-gt"; shift;;
274     le) operator="-le"; shift;;
275     ge) operator="-ge"; shift;;
276     eq) operator="-eq"; shift;;
277     *) operator="-eq";;
278     esac
279    
280     for x in ${@}; do
281     for((y=0; y<$((3 - ${#x})); y++)); do value="${value}0"; done
282     value="${value}${x}"
283     z=$((${z} + 1))
284    
285     case ${z} in
286     1) for((y=0; y<$((3 - ${#KV_MAJOR})); y++)); do test="${test}0"; done;
287     test="${test}${KV_MAJOR}";;
288     2) for((y=0; y<$((3 - ${#KV_MINOR})); y++)); do test="${test}0"; done;
289     test="${test}${KV_MINOR}";;
290     3) for((y=0; y<$((3 - ${#KV_PATCH})); y++)); do test="${test}0"; done;
291     test="${test}${KV_PATCH}";;
292     *) die "Error in kernel-2_kernel_is(): Too many parameters.";;
293     esac
294     done
295 johnm 1.12
296 swegener 1.29 [ ${test} ${operator} ${value} ] && return 0 || return 1
297 johnm 1.1 }
298    
299 johnm 1.30 get_localversion() {
300     local lv_list i x
301    
302     # ignore files with ~ in it.
303     for i in $(ls ${1}/localversion* 2>/dev/null); do
304     [[ -n ${i//*~*} ]] && lv_list="${lv_list} ${i}"
305     done
306    
307     for i in ${lv_list}; do
308     x="${x}$(<${i})"
309     done
310     x=${x/ /}
311     echo ${x}
312     }
313    
314 dsd 1.56 # @FUNCTION: get_version
315     # @DESCRIPTION:
316     # It gets the version of the kernel inside KERNEL_DIR and populates the KV_FULL variable
317     # (if KV_FULL is already set it does nothing).
318     #
319     # The kernel version variables (KV_MAJOR, KV_MINOR, KV_PATCH, KV_EXTRA and KV_LOCAL) are also set.
320     #
321     # The KV_DIR is set using the KERNEL_DIR env var, the KV_DIR_OUT is set using a valid
322     # KBUILD_OUTPUT (in a decreasing priority list, we look for the env var, makefile var or the
323     # symlink /lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build).
324 johnm 1.1 get_version() {
325 johnm 1.4 local kbuild_output
326 swegener 1.29
327 johnm 1.1 # no need to execute this twice assuming KV_FULL is populated.
328     # we can force by unsetting KV_FULL
329 johnm 1.19 [ -n "${KV_FULL}" ] && return 0
330 johnm 1.1
331     # if we dont know KV_FULL, then we need too.
332     # make sure KV_DIR isnt set since we need to work it out via KERNEL_DIR
333     unset KV_DIR
334    
335     # KV_DIR will contain the full path to the sources directory we should use
336 johnm 1.11 qeinfo "Determining the location of the kernel source code"
337 johnm 1.1 [ -h "${KERNEL_DIR}" ] && KV_DIR="$(readlink -f ${KERNEL_DIR})"
338     [ -d "${KERNEL_DIR}" ] && KV_DIR="${KERNEL_DIR}"
339 swegener 1.29
340 johnm 1.1 if [ -z "${KV_DIR}" ]
341     then
342 johnm 1.11 qeerror "Unable to find kernel sources at ${KERNEL_DIR}"
343     qeinfo "This package requires Linux sources."
344 johnm 1.7 if [ "${KERNEL_DIR}" == "/usr/src/linux" ] ; then
345 johnm 1.11 qeinfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "
346     qeinfo "(or the kernel you wish to build against)."
347     qeinfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"
348 johnm 1.7 else
349 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."
350 johnm 1.7 fi
351 johnm 1.19 return 1
352 johnm 1.7 fi
353    
354 johnm 1.11 qeinfo "Found kernel source directory:"
355     qeinfo " ${KV_DIR}"
356 johnm 1.7
357     if [ ! -s "${KV_DIR}/Makefile" ]
358     then
359 johnm 1.11 qeerror "Could not find a Makefile in the kernel source directory."
360     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
361 johnm 1.19 return 1
362 johnm 1.7 fi
363 swegener 1.29
364 johnm 1.4 # OK so now we know our sources directory, but they might be using
365     # KBUILD_OUTPUT, and we need this for .config and localversions-*
366     # so we better find it eh?
367     # do we pass KBUILD_OUTPUT on the CLI?
368     OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
369 swegener 1.29
370 johnm 1.6 # And if we didn't pass it, we can take a nosey in the Makefile
371 johnm 1.4 kbuild_output="$(getfilevar KBUILD_OUTPUT ${KV_DIR}/Makefile)"
372     OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
373 swegener 1.29
374 johnm 1.1 # And contrary to existing functions I feel we shouldn't trust the
375     # directory name to find version information as this seems insane.
376     # so we parse ${KV_DIR}/Makefile
377     KV_MAJOR="$(getfilevar VERSION ${KV_DIR}/Makefile)"
378     KV_MINOR="$(getfilevar PATCHLEVEL ${KV_DIR}/Makefile)"
379     KV_PATCH="$(getfilevar SUBLEVEL ${KV_DIR}/Makefile)"
380     KV_EXTRA="$(getfilevar EXTRAVERSION ${KV_DIR}/Makefile)"
381 swegener 1.29
382 johnm 1.7 if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
383     then
384 johnm 1.11 qeerror "Could not detect kernel version."
385 johnm 1.19 qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources."
386     return 1
387 johnm 1.7 fi
388 swegener 1.29
389 johnm 1.1 # and in newer versions we can also pull LOCALVERSION if it is set.
390 johnm 1.4 # but before we do this, we need to find if we use a different object directory.
391     # This *WILL* break if the user is using localversions, but we assume it was
392     # caught before this if they are.
393 genstef 1.49 [ "${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}" == "$(uname -r)" ] && \
394     OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build}"
395 johnm 1.4
396     [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
397     [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
398     if [ -n "${KV_OUT_DIR}" ];
399     then
400 johnm 1.11 qeinfo "Found kernel object directory:"
401     qeinfo " ${KV_OUT_DIR}"
402 swegener 1.29
403 johnm 1.30 KV_LOCAL="$(get_localversion ${KV_OUT_DIR})"
404 johnm 1.4 fi
405 johnm 1.41 # and if we STILL have not got it, then we better just set it to KV_DIR
406 johnm 1.4 KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
407 johnm 1.21
408 dsd 1.53 KV_LOCAL="${KV_LOCAL}$(get_localversion ${KV_DIR})"
409     if linux_config_exists; then
410     KV_LOCAL="${KV_LOCAL}$(linux_chkconfig_string LOCALVERSION)"
411     KV_LOCAL="${KV_LOCAL//\"/}"
412    
413     # For things like git that can append extra stuff:
414     [ -e ${KV_DIR}/scripts/setlocalversion ] &&
415     linux_chkconfig_builtin LOCALVERSION_AUTO &&
416     KV_LOCAL="${KV_LOCAL}$(sh ${KV_DIR}/scripts/setlocalversion ${KV_DIR})"
417 johnm 1.41 fi
418    
419 johnm 1.1 # And we should set KV_FULL to the full expanded version
420     KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
421 johnm 1.21
422 johnm 1.11 qeinfo "Found sources for kernel version:"
423     qeinfo " ${KV_FULL}"
424 johnm 1.21
425 johnm 1.19 return 0
426 johnm 1.1 }
427    
428 dsd 1.56 # @FUNCTION: get_running_version
429     # @DESCRIPTION:
430     # It gets the version of the current running kernel and the result is the same as get_version() if the
431     # function can find the sources.
432 johnm 1.23 get_running_version() {
433     KV_FULL=$(uname -r)
434 johnm 1.1
435 johnm 1.23 if [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile ]]; then
436     KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
437     unset KV_FULL
438     get_version
439     return $?
440     elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
441     KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
442     unset KV_FULL
443     get_version
444     return $?
445     else
446     KV_MAJOR=$(get_version_component_range 1 ${KV_FULL})
447     KV_MINOR=$(get_version_component_range 2 ${KV_FULL})
448     KV_PATCH=$(get_version_component_range 3- ${KV_FULL})
449     KV_PATCH=${KV_PATCH//-*}
450     [[ -n ${KV_FULL#*-} ]] && [[ -n ${KV_FULL//${KV_FULL#*-}} ]] \
451     && KV_EXTRA="-${KV_FULL#*-}"
452     fi
453     return 0
454     }
455 johnm 1.1
456    
457     # ebuild check functions
458     # ---------------------------------------
459    
460 dsd 1.56 # @FUNCTION: check_kernel_built
461     # @DESCRIPTION:
462     # This function verifies that the current kernel sources have been already prepared otherwise it dies.
463 johnm 1.1 check_kernel_built() {
464 dsd 1.53 # if we haven't determined the version yet, we need to
465 dsd 1.54 require_configured_kernel
466 dsd 1.53 get_version
467 swegener 1.29
468 johnm 1.16 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ]
469 johnm 1.1 then
470 johnm 1.16 eerror "These sources have not yet been prepared."
471     eerror "We cannot build against an unprepared tree."
472 johnm 1.1 eerror "To resolve this, please type the following:"
473     eerror
474     eerror "# cd ${KV_DIR}"
475     eerror "# make oldconfig"
476 johnm 1.16 eerror "# make modules_prepare"
477 johnm 1.1 eerror
478     eerror "Then please try merging this module again."
479     die "Kernel sources need compiling first"
480     fi
481     }
482    
483 dsd 1.56 # @FUNCTION: check_modules_supported
484     # @DESCRIPTION:
485     # This function verifies that the current kernel support modules (it checks CONFIG_MODULES=y) otherwise it dies.
486 johnm 1.1 check_modules_supported() {
487     # if we haven't determined the version yet, we need too.
488 dsd 1.53 require_configured_kernel
489     get_version
490 swegener 1.29
491 johnm 1.7 if ! linux_chkconfig_builtin "MODULES"
492 johnm 1.1 then
493     eerror "These sources do not support loading external modules."
494     eerror "to be able to use this module please enable \"Loadable modules support\""
495     eerror "in your kernel, recompile and then try merging this module again."
496 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
497 johnm 1.3 fi
498     }
499    
500 dsd 1.56 # @FUNCTION: check_extra_config
501     # @DESCRIPTION:
502     # It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e.
503     # the prefix ~ is not used) doesn't satisfy the directive.
504 johnm 1.3 check_extra_config() {
505 mrness 1.45 local config negate die error reworkmodulenames
506 dsd 1.53 local soft_errors_count=0 hard_errors_count=0 config_required=0
507    
508 dsd 1.55 # if we haven't determined the version yet, we need to
509     get_version
510    
511 dsd 1.53 # Determine if we really need a .config. The only time when we don't need
512     # one is when all of the CONFIG_CHECK options are prefixed with "~".
513     for config in ${CONFIG_CHECK}
514     do
515     if [[ "${config:0:1}" != "~" ]]; then
516     config_required=1
517     break
518     fi
519     done
520    
521     if [[ ${config_required} == 0 ]]; then
522     # In the case where we don't require a .config, we can now bail out
523     # if the user has no .config as there is nothing to do. Otherwise
524     # code later will cause a failure due to missing .config.
525     if ! linux_config_exists; then
526     return 0
527     fi
528     else
529     require_configured_kernel
530     fi
531 johnm 1.3
532 mrness 1.45 einfo "Checking for suitable kernel configuration options..."
533 dsd 1.53
534 johnm 1.3 for config in ${CONFIG_CHECK}
535     do
536 johnm 1.31 # if we specify any fatal, ensure we honor them
537     die=1
538     error=0
539     negate=0
540     reworkmodulenames=0
541    
542 dsd 1.53 if [[ ${config:0:1} == "~" ]]; then
543 mrness 1.45 die=0
544 johnm 1.31 config=${config:1}
545 dsd 1.53 elif [[ ${config:0:1} == "@" ]]; then
546 mrness 1.45 die=0
547 johnm 1.31 reworkmodulenames=1
548     config=${config:1}
549     fi
550 dsd 1.53 if [[ ${config:0:1} == "!" ]]; then
551 mrness 1.45 negate=1
552 johnm 1.44 config=${config:1}
553     fi
554 johnm 1.17
555 johnm 1.31 if [[ ${negate} == 1 ]]; then
556     linux_chkconfig_present ${config} && error=2
557     elif [[ ${reworkmodulenames} == 1 ]]; then
558 mrness 1.45 local temp_config="${config//*:}" i n
559 johnm 1.17 config="${config//:*}"
560 johnm 1.31 if linux_chkconfig_present ${config}; then
561     for i in ${MODULE_NAMES}; do
562 johnm 1.17 n="${i//${temp_config}}"
563 dsd 1.38 [[ -z ${n//\(*} ]] && \
564 johnm 1.31 MODULE_IGNORE="${MODULE_IGNORE} ${temp_config}"
565 johnm 1.17 done
566 johnm 1.31 error=2
567 johnm 1.17 fi
568 johnm 1.3 else
569 johnm 1.31 linux_chkconfig_present ${config} || error=1
570     fi
571    
572 mrness 1.45 if [[ ${error} > 0 ]]; then
573     local report_func="eerror" local_error
574     local_error="ERROR_${config}"
575     local_error="${!local_error}"
576    
577     if [[ -z "${local_error}" ]]; then
578     # using old, deprecated format.
579     local_error="${config}_ERROR"
580     local_error="${!local_error}"
581     fi
582     if [[ ${die} == 0 && -z "${local_error}" ]]; then
583     #soft errors can be warnings
584     local_error="WARNING_${config}"
585 johnm 1.7 local_error="${!local_error}"
586 mrness 1.45 if [[ -n "${local_error}" ]] ; then
587     report_func="ewarn"
588 johnm 1.44 fi
589 mrness 1.45 fi
590 johnm 1.44
591 mrness 1.45 if [[ -z "${local_error}" ]]; then
592     [[ ${error} == 1 ]] \
593     && local_error="is not set when it should be." \
594     || local_error="should not be set. But it is."
595     local_error="CONFIG_${config}:\t ${local_error}"
596     fi
597     if [[ ${die} == 0 ]]; then
598     ${report_func} " ${local_error}"
599     soft_errors_count=$[soft_errors_count + 1]
600     else
601     ${report_func} " ${local_error}"
602     hard_errors_count=$[hard_errors_count + 1]
603 johnm 1.3 fi
604     fi
605     done
606    
607 mrness 1.45 if [[ ${hard_errors_count} > 0 ]]; then
608 johnm 1.3 eerror "Please check to make sure these options are set correctly."
609 johnm 1.31 eerror "Failure to do so may cause unexpected problems."
610 mrness 1.45 eerror "Once you have satisfied these options, please try merging"
611     eerror "this package again."
612     die "Incorrect kernel configuration options"
613     elif [[ ${soft_errors_count} > 0 ]]; then
614     ewarn "Please check to make sure these options are set correctly."
615     ewarn "Failure to do so may cause unexpected problems."
616     else
617     eend 0
618 johnm 1.1 fi
619     }
620    
621     check_zlibinflate() {
622 dsd 1.53 # if we haven't determined the version yet, we need to
623     require_configured_kernel
624     get_version
625 swegener 1.29
626 johnm 1.1 # although I restructured this code - I really really really dont support it!
627    
628     # bug #27882 - zlib routines are only linked into the kernel
629     # if something compiled into the kernel calls them
630     #
631     # plus, for the cloop module, it appears that there's no way
632     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
633     # is on
634 swegener 1.29
635     local INFLATE
636     local DEFLATE
637 johnm 1.1
638     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
639 swegener 1.29
640 johnm 1.1 ebegin "checking ZLIB_INFLATE"
641     getfilevar_isbuiltin CONFIG_ZLIB_INFLATE ${KV_DIR}/.config
642     eend $?
643     [ "$?" != 0 ] && die
644 swegener 1.29
645 johnm 1.1 ebegin "checking ZLIB_DEFLATE"
646     getfilevar_isbuiltin CONFIG_ZLIB_DEFLATE ${KV_DIR}/.config
647     eend $?
648     [ "$?" != 0 ] && die
649 swegener 1.29
650 johnm 1.1 local LINENO_START
651     local LINENO_END
652     local SYMBOLS
653     local x
654 swegener 1.29
655 johnm 1.1 LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
656     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
657     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
658     (( LINENO_END = $LINENO_END - 1 ))
659 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
660 johnm 1.1
661     # okay, now we have a list of symbols
662     # we need to check each one in turn, to see whether it is set or not
663     for x in $SYMBOLS ; do
664     if [ "${!x}" = "y" ]; then
665     # we have a winner!
666     einfo "${x} ensures zlib is linked into your kernel - excellent"
667     return 0
668     fi
669     done
670 swegener 1.29
671 johnm 1.1 eerror
672     eerror "This kernel module requires ZLIB library support."
673     eerror "You have enabled zlib support in your kernel, but haven't enabled"
674     eerror "enabled any option that will ensure that zlib is linked into your"
675     eerror "kernel."
676     eerror
677     eerror "Please ensure that you enable at least one of these options:"
678     eerror
679    
680     for x in $SYMBOLS ; do
681     eerror " * $x"
682     done
683    
684     eerror
685     eerror "Please remember to recompile and install your kernel, and reboot"
686     eerror "into your new kernel before attempting to load this kernel module."
687    
688     die "Kernel doesn't include zlib support"
689     }
690 johnm 1.8
691     ################################
692     # Default pkg_setup
693     # Also used when inheriting linux-mod to force a get_version call
694 dsd 1.56 # @FUNCTION: linux-info_pkg_setup
695     # @DESCRIPTION:
696     # Force a get_version() call when inherited from linux-mod.eclass and then check if the kernel is configured
697     # to support the options specified in CONFIG_CHECK (if not null)
698 johnm 1.8 linux-info_pkg_setup() {
699 johnm 1.19 get_version || die "Unable to calculate Linux Kernel version"
700 phreak 1.48
701     if kernel_is 2 4; then
702     if [ "$( gcc-major-version )" -eq "4" ] ; then
703     echo
704     ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with"
705     ewarn "linux-2.4 (or modules building against a linux-2.4 kernel)!"
706     echo
707     ewarn "Either switch to another gcc-version (via gcc-config) or use a"
708     ewarn "newer kernel that supports gcc-4."
709     echo
710     ewarn "Also be aware that bugreports about gcc-4 not working"
711     ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"
712     echo
713     epause 10
714     fi
715     fi
716    
717 johnm 1.10 [ -n "${CONFIG_CHECK}" ] && check_extra_config;
718 johnm 1.8 }

  ViewVC Help
Powered by ViewVC 1.1.20