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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.61 - (hide annotations) (download)
Sun Aug 30 22:37:06 2009 UTC (5 years, 1 month ago) by robbat2
Branch: MAIN
Changes since 1.60: +46 -14 lines
Implement a variant of getfilevar that does not use Make to fetch the variable, and thusly does not fail out due to missing dependancies. Also fix totally broken checks in check_zlibinflate, that called a non-existing function.

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

  ViewVC Help
Powered by ViewVC 1.1.20