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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.91 - (hide annotations) (download)
Mon Dec 12 22:01:37 2011 UTC (2 years, 8 months ago) by vapier
Branch: MAIN
Changes since 1.90: +15 -28 lines
merge kernel_is updates between kernel-2 and linux-info eclasses

1 vapier 1.90 # Copyright 1999-2011 Gentoo Foundation
2 johnm 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.91 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.90 2011/08/22 04:46:32 vapier Exp $
4 johnm 1.10
5 dsd 1.56 # @ECLASS: linux-info.eclass
6     # @MAINTAINER:
7     # kernel-misc@gentoo.org
8 vapier 1.90 # @AUTHOR:
9     # Original author: John Mylchreest <johnm@gentoo.org>
10 dsd 1.56 # @BLURB: eclass used for accessing kernel related information
11     # @DESCRIPTION:
12     # This eclass is used as a central eclass for accessing kernel
13 robbat2 1.62 # related information for source or binary already installed.
14 dsd 1.56 # It is vital for linux-mod.eclass to function correctly, and is split
15     # out so that any ebuild behaviour "templates" are abstracted out
16     # using additional eclasses.
17 robbat2 1.62 #
18     # "kernel config" in this file means:
19     # The .config of the currently installed sources is used as the first
20     # preference, with a fall-back to bundled config (/proc/config.gz) if available.
21 dsd 1.56
22 johnm 1.10 # A Couple of env vars are available to effect usage of this eclass
23     # These are as follows:
24 dsd 1.56
25     # @ECLASS-VARIABLE: KERNEL_DIR
26     # @DESCRIPTION:
27     # A string containing the directory of the target kernel sources. The default value is
28     # "/usr/src/linux"
29    
30     # @ECLASS-VARIABLE: CONFIG_CHECK
31     # @DESCRIPTION:
32     # A string containing a list of .config options to check for before
33     # proceeding with the install.
34     #
35     # e.g.: CONFIG_CHECK="MTRR"
36     #
37     # You can also check that an option doesn't exist by
38     # prepending it with an exclamation mark (!).
39     #
40     # e.g.: CONFIG_CHECK="!MTRR"
41     #
42 vapier 1.89 # To simply warn about a missing option, prepend a '~'.
43 robbat2 1.62 # It may be combined with '!'.
44     #
45     # In general, most checks should be non-fatal. The only time fatal checks should
46     # be used is for building kernel modules or cases that a compile will fail
47     # without the option.
48     #
49     # This is to allow usage of binary kernels, and minimal systems without kernel
50     # sources.
51 dsd 1.56
52     # @ECLASS-VARIABLE: ERROR_<CFG>
53     # @DESCRIPTION:
54     # A string containing the error message to display when the check against CONFIG_CHECK
55     # fails. <CFG> should reference the appropriate option used in CONFIG_CHECK.
56 swegener 1.29 #
57 dsd 1.56 # e.g.: ERROR_MTRR="MTRR exists in the .config but shouldn't!!"
58    
59     # @ECLASS-VARIABLE: KBUILD_OUTPUT
60     # @DESCRIPTION:
61     # A string passed on commandline, or set from the kernel makefile. It contains the directory
62     # which is to be used as the kernel object directory.
63 johnm 1.10
64     # There are also a couple of variables which are set by this, and shouldn't be
65     # set by hand. These are as follows:
66 dsd 1.56
67     # @ECLASS-VARIABLE: KV_FULL
68     # @DESCRIPTION:
69     # A read-only variable. It's a string containing the full kernel version. ie: 2.6.9-gentoo-johnm-r1
70    
71     # @ECLASS-VARIABLE: KV_MAJOR
72     # @DESCRIPTION:
73     # A read-only variable. It's an integer containing the kernel major version. ie: 2
74    
75     # @ECLASS-VARIABLE: KV_MINOR
76     # @DESCRIPTION:
77     # A read-only variable. It's an integer containing the kernel minor version. ie: 6
78    
79     # @ECLASS-VARIABLE: KV_PATCH
80     # @DESCRIPTION:
81     # A read-only variable. It's an integer containing the kernel patch version. ie: 9
82    
83     # @ECLASS-VARIABLE: KV_EXTRA
84     # @DESCRIPTION:
85     # A read-only variable. It's a string containing the kernel EXTRAVERSION. ie: -gentoo
86    
87     # @ECLASS-VARIABLE: KV_LOCAL
88     # @DESCRIPTION:
89     # A read-only variable. It's a string containing the kernel LOCALVERSION concatenation. ie: -johnm
90    
91     # @ECLASS-VARIABLE: KV_DIR
92     # @DESCRIPTION:
93     # A read-only variable. It's a string containing the kernel source directory, will be null if
94     # KERNEL_DIR is invalid.
95    
96     # @ECLASS-VARIABLE: KV_OUT_DIR
97     # @DESCRIPTION:
98     # A read-only variable. It's a string containing the kernel object directory, will be KV_DIR unless
99     # KBUILD_OUTPUT is used. This should be used for referencing .config.
100 johnm 1.10
101 johnm 1.21 # And to ensure all the weirdness with crosscompile
102 johnm 1.23 inherit toolchain-funcs versionator
103 johnm 1.1
104 johnm 1.8 EXPORT_FUNCTIONS pkg_setup
105 johnm 1.1
106 robbat2 1.65 DEPEND=""
107     RDEPEND=""
108    
109 johnm 1.1 # Overwritable environment Var's
110     # ---------------------------------------
111 johnm 1.21 KERNEL_DIR="${KERNEL_DIR:-${ROOT}usr/src/linux}"
112 johnm 1.1
113 johnm 1.7
114 johnm 1.16 # Bug fixes
115     # fix to bug #75034
116     case ${ARCH} in
117 swegener 1.29 ppc) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
118     ppc64) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
119 johnm 1.16 esac
120    
121 vapier 1.51 # @FUNCTION: set_arch_to_kernel
122     # @DESCRIPTION:
123     # Set the env ARCH to match what the kernel expects.
124     set_arch_to_kernel() { export ARCH=$(tc-arch-kernel); }
125     # @FUNCTION: set_arch_to_portage
126     # @DESCRIPTION:
127     # Set the env ARCH to match what portage expects.
128     set_arch_to_portage() { export ARCH=$(tc-arch); }
129 johnm 1.11
130     # qeinfo "Message"
131     # -------------------
132 johnm 1.21 # qeinfo is a quiet einfo call when EBUILD_PHASE
133 johnm 1.11 # should not have visible output.
134 johnm 1.21 qout() {
135     local outputmsg type
136     type=${1}
137     shift
138     outputmsg="${@}"
139 wolf31o2 1.26 case "${EBUILD_PHASE}" in
140     depend) unset outputmsg;;
141     clean) unset outputmsg;;
142     preinst) unset outputmsg;;
143     esac
144     [ -n "${outputmsg}" ] && ${type} "${outputmsg}"
145 johnm 1.11 }
146    
147 johnm 1.21 qeinfo() { qout einfo "${@}" ; }
148 robbat2 1.82 qewarn() { qout ewarn "${@}" ; }
149 johnm 1.21 qeerror() { qout eerror "${@}" ; }
150 johnm 1.11
151 johnm 1.1 # File Functions
152     # ---------------------------------------
153    
154 dsd 1.56 # @FUNCTION: getfilevar
155     # @USAGE: variable configfile
156     # @RETURN: the value of the variable
157     # @DESCRIPTION:
158 robbat2 1.61 # It detects the value of the variable defined in the file configfile. This is
159     # done by including the configfile, and printing the variable with Make.
160     # It WILL break if your makefile has missing dependencies!
161 johnm 1.1 getfilevar() {
162 dsd 1.57 local ERROR basefname basedname myARCH="${ARCH}"
163 johnm 1.1 ERROR=0
164 johnm 1.16
165 johnm 1.1 [ -z "${1}" ] && ERROR=1
166     [ ! -f "${2}" ] && ERROR=1
167    
168     if [ "${ERROR}" = 1 ]
169     then
170 johnm 1.6 echo -e "\n"
171 johnm 1.1 eerror "getfilevar requires 2 variables, with the second a valid file."
172     eerror " getfilevar <VARIABLE> <CONFIGFILE>"
173     else
174 johnm 1.34 basefname="$(basename ${2})"
175     basedname="$(dirname ${2})"
176 johnm 1.6 unset ARCH
177 johnm 1.21
178 johnm 1.42 echo -e "e:\\n\\t@echo \$(${1})\\ninclude ${basefname}" | \
179 dsd 1.57 make -C "${basedname}" M="${S}" ${BUILD_FIXES} -s -f - 2>/dev/null
180 johnm 1.21
181     ARCH=${myARCH}
182 johnm 1.1 fi
183     }
184    
185 robbat2 1.61 # @FUNCTION: getfilevar_noexec
186     # @USAGE: variable configfile
187     # @RETURN: the value of the variable
188     # @DESCRIPTION:
189     # It detects the value of the variable defined in the file configfile.
190     # This is done with sed matching an expression only. If the variable is defined,
191     # you will run into problems. See getfilevar for those cases.
192     getfilevar_noexec() {
193 robbat2 1.62 local ERROR basefname basedname mycat myARCH="${ARCH}"
194 robbat2 1.61 ERROR=0
195 robbat2 1.62 mycat='cat'
196 robbat2 1.61
197     [ -z "${1}" ] && ERROR=1
198     [ ! -f "${2}" ] && ERROR=1
199 robbat2 1.64 [ "${2%.gz}" != "${2}" ] && mycat='zcat'
200 robbat2 1.61
201     if [ "${ERROR}" = 1 ]
202     then
203     echo -e "\n"
204     eerror "getfilevar_noexec requires 2 variables, with the second a valid file."
205     eerror " getfilevar_noexec <VARIABLE> <CONFIGFILE>"
206     else
207 robbat2 1.62 ${mycat} "${2}" | \
208 robbat2 1.61 sed -n \
209 vapier 1.89 -e "/^[[:space:]]*${1}[[:space:]]*:\\?=[[:space:]]*\(.*\)\$/{
210 robbat2 1.61 s,^[^=]*[[:space:]]*=[[:space:]]*,,g ;
211     s,[[:space:]]*\$,,g ;
212     p
213 robbat2 1.62 }"
214 robbat2 1.61 fi
215     }
216    
217 vapier 1.90 # @ECLASS-VARIABLE: _LINUX_CONFIG_EXISTS_DONE
218     # @INTERNAL
219 robbat2 1.75 # @DESCRIPTION:
220     # This is only set if one of the linux_config_*exists functions has been called.
221     # We use it for a QA warning that the check for a config has not been performed,
222     # as linux_chkconfig* in non-legacy mode WILL return an undefined value if no
223     # config is available at all.
224     _LINUX_CONFIG_EXISTS_DONE=
225    
226     linux_config_qa_check() {
227 robbat2 1.76 local f="$1"
228 robbat2 1.75 if [ -z "${_LINUX_CONFIG_EXISTS_DONE}" ]; then
229 robbat2 1.76 ewarn "QA: You called $f before any linux_config_exists!"
230 cardoe 1.87 ewarn "QA: The return value of $f will NOT guaranteed later!"
231 robbat2 1.75 fi
232     }
233 dsd 1.53
234 robbat2 1.62 # @FUNCTION: linux_config_src_exists
235     # @RETURN: true or false
236     # @DESCRIPTION:
237     # It returns true if .config exists in a build directory otherwise false
238     linux_config_src_exists() {
239 robbat2 1.75 export _LINUX_CONFIG_EXISTS_DONE=1
240 robbat2 1.62 [ -s "${KV_OUT_DIR}/.config" ]
241     }
242    
243     # @FUNCTION: linux_config_bin_exists
244     # @RETURN: true or false
245     # @DESCRIPTION:
246     # It returns true if .config exists in /proc, otherwise false
247     linux_config_bin_exists() {
248 robbat2 1.75 export _LINUX_CONFIG_EXISTS_DONE=1
249 robbat2 1.79 [ -s "/proc/config.gz" ]
250 robbat2 1.62 }
251    
252 dsd 1.56 # @FUNCTION: linux_config_exists
253     # @RETURN: true or false
254     # @DESCRIPTION:
255     # It returns true if .config exists otherwise false
256 robbat2 1.62 #
257     # This function MUST be checked before using any of the linux_chkconfig_*
258     # functions.
259 dsd 1.53 linux_config_exists() {
260 robbat2 1.62 linux_config_src_exists || linux_config_bin_exists
261 dsd 1.53 }
262    
263 dsd 1.56 # @FUNCTION: require_configured_kernel
264     # @DESCRIPTION:
265     # This function verifies that the current kernel is configured (it checks against the existence of .config)
266     # otherwise it dies.
267 dsd 1.53 require_configured_kernel() {
268 robbat2 1.62 if ! linux_config_src_exists; then
269 dsd 1.53 qeerror "Could not find a usable .config in the kernel source directory."
270     qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources."
271     qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that"
272     qeerror "it points to the necessary object directory so that it might find .config."
273     die "Kernel not configured; no .config found in ${KV_OUT_DIR}"
274     fi
275     }
276    
277 dsd 1.56 # @FUNCTION: linux_chkconfig_present
278     # @USAGE: option
279     # @RETURN: true or false
280     # @DESCRIPTION:
281 loki_val 1.59 # It checks that CONFIG_<option>=y or CONFIG_<option>=m is present in the current kernel .config
282 robbat2 1.62 # If linux_config_exists returns false, the results of this are UNDEFINED. You
283     # MUST call linux_config_exists first.
284 johnm 1.7 linux_chkconfig_present() {
285 robbat2 1.76 linux_config_qa_check linux_chkconfig_present
286 robbat2 1.75 local RESULT
287 robbat2 1.62 local config
288     config="${KV_OUT_DIR}/.config"
289     [ ! -f "${config}" ] && config="/proc/config.gz"
290     RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
291 johnm 1.1 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
292     }
293    
294 dsd 1.56 # @FUNCTION: linux_chkconfig_module
295     # @USAGE: option
296     # @RETURN: true or false
297     # @DESCRIPTION:
298     # It checks that CONFIG_<option>=m is present in the current kernel .config
299 robbat2 1.62 # If linux_config_exists returns false, the results of this are UNDEFINED. You
300     # MUST call linux_config_exists first.
301 johnm 1.7 linux_chkconfig_module() {
302 robbat2 1.76 linux_config_qa_check linux_chkconfig_module
303 robbat2 1.75 local RESULT
304 robbat2 1.62 local config
305     config="${KV_OUT_DIR}/.config"
306     [ ! -f "${config}" ] && config="/proc/config.gz"
307     RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
308 johnm 1.1 [ "${RESULT}" = "m" ] && return 0 || return 1
309     }
310    
311 dsd 1.56 # @FUNCTION: linux_chkconfig_builtin
312     # @USAGE: option
313     # @RETURN: true or false
314     # @DESCRIPTION:
315     # It checks that CONFIG_<option>=y is present in the current kernel .config
316 robbat2 1.62 # If linux_config_exists returns false, the results of this are UNDEFINED. You
317     # MUST call linux_config_exists first.
318 johnm 1.7 linux_chkconfig_builtin() {
319 robbat2 1.76 linux_config_qa_check linux_chkconfig_builtin
320 robbat2 1.75 local RESULT
321 robbat2 1.62 local config
322     config="${KV_OUT_DIR}/.config"
323     [ ! -f "${config}" ] && config="/proc/config.gz"
324     RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
325 johnm 1.1 [ "${RESULT}" = "y" ] && return 0 || return 1
326     }
327    
328 dsd 1.56 # @FUNCTION: linux_chkconfig_string
329     # @USAGE: option
330     # @RETURN: CONFIG_<option>
331     # @DESCRIPTION:
332     # It prints the CONFIG_<option> value of the current kernel .config (it requires a configured kernel).
333 robbat2 1.62 # If linux_config_exists returns false, the results of this are UNDEFINED. You
334     # MUST call linux_config_exists first.
335 johnm 1.7 linux_chkconfig_string() {
336 robbat2 1.76 linux_config_qa_check linux_chkconfig_string
337 robbat2 1.62 local config
338     config="${KV_OUT_DIR}/.config"
339     [ ! -f "${config}" ] && config="/proc/config.gz"
340     getfilevar_noexec "CONFIG_${1}" "${config}"
341 johnm 1.7 }
342    
343 johnm 1.1 # Versioning Functions
344     # ---------------------------------------
345    
346 dsd 1.56 # @FUNCTION: kernel_is
347     # @USAGE: [-lt -gt -le -ge -eq] major_number [minor_number patch_number]
348     # @RETURN: true or false
349     # @DESCRIPTION:
350     # It returns true when the current kernel version satisfies the comparison against the passed version.
351     # -eq is the default comparison.
352 johnm 1.1 #
353 dsd 1.56 # @CODE
354 johnm 1.1 # For Example where KV = 2.6.9
355 dsd 1.56 # kernel_is 2 4 returns false
356     # kernel_is 2 returns true
357     # kernel_is 2 6 returns true
358     # kernel_is 2 6 8 returns false
359     # kernel_is 2 6 9 returns true
360     # @CODE
361    
362 vapier 1.91 # Note: duplicated in kernel-2.eclass
363 johnm 1.1 kernel_is() {
364 dsd 1.53 # if we haven't determined the version yet, we need to.
365 robbat2 1.69 linux-info_get_any_version
366    
367 vapier 1.91 # Now we can continue
368     local operator test value
369 johnm 1.23
370 vapier 1.91 case ${1#-} in
371     lt) operator="-lt"; shift;;
372     gt) operator="-gt"; shift;;
373     le) operator="-le"; shift;;
374     ge) operator="-ge"; shift;;
375     eq) operator="-eq"; shift;;
376     *) operator="-eq";;
377 johnm 1.23 esac
378 vapier 1.91 [[ $# -gt 3 ]] && die "Error in kernel-2_kernel_is(): too many parameters"
379 johnm 1.23
380 vapier 1.91 : $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH ))
381     : $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + ${3:-${KV_PATCH}} ))
382     [ ${test} ${operator} ${value} ]
383 johnm 1.1 }
384    
385 johnm 1.30 get_localversion() {
386     local lv_list i x
387    
388     # ignore files with ~ in it.
389     for i in $(ls ${1}/localversion* 2>/dev/null); do
390     [[ -n ${i//*~*} ]] && lv_list="${lv_list} ${i}"
391     done
392    
393     for i in ${lv_list}; do
394     x="${x}$(<${i})"
395     done
396     x=${x/ /}
397     echo ${x}
398     }
399    
400 robbat2 1.83 # Check if the Makefile is valid for direct parsing.
401     # Check status results:
402     # - PASS, use 'getfilevar' to extract values
403     # - FAIL, use 'getfilevar_noexec' to extract values
404     # The check may fail if:
405     # - make is not present
406     # - corruption exists in the kernel makefile
407     get_makefile_extract_function() {
408     local a='' b='' mkfunc='getfilevar'
409     a="$(getfilevar VERSION ${KERNEL_MAKEFILE})"
410     b="$(getfilevar_noexec VERSION ${KERNEL_MAKEFILE})"
411     [[ "${a}" != "${b}" ]] && mkfunc='getfilevar_noexec'
412     echo "${mkfunc}"
413     }
414    
415 robbat2 1.63 # internal variable, so we know to only print the warning once
416     get_version_warning_done=
417    
418 dsd 1.56 # @FUNCTION: get_version
419     # @DESCRIPTION:
420     # It gets the version of the kernel inside KERNEL_DIR and populates the KV_FULL variable
421     # (if KV_FULL is already set it does nothing).
422     #
423     # The kernel version variables (KV_MAJOR, KV_MINOR, KV_PATCH, KV_EXTRA and KV_LOCAL) are also set.
424     #
425     # The KV_DIR is set using the KERNEL_DIR env var, the KV_DIR_OUT is set using a valid
426     # KBUILD_OUTPUT (in a decreasing priority list, we look for the env var, makefile var or the
427     # symlink /lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build).
428 johnm 1.1 get_version() {
429 robbat2 1.86 local kbuild_output mkfunc tmplocal
430 swegener 1.29
431 johnm 1.1 # no need to execute this twice assuming KV_FULL is populated.
432     # we can force by unsetting KV_FULL
433 johnm 1.19 [ -n "${KV_FULL}" ] && return 0
434 johnm 1.1
435     # if we dont know KV_FULL, then we need too.
436     # make sure KV_DIR isnt set since we need to work it out via KERNEL_DIR
437     unset KV_DIR
438    
439     # KV_DIR will contain the full path to the sources directory we should use
440 robbat2 1.63 [ -z "${get_version_warning_done}" ] && \
441 johnm 1.11 qeinfo "Determining the location of the kernel source code"
442 johnm 1.1 [ -h "${KERNEL_DIR}" ] && KV_DIR="$(readlink -f ${KERNEL_DIR})"
443     [ -d "${KERNEL_DIR}" ] && KV_DIR="${KERNEL_DIR}"
444 swegener 1.29
445 johnm 1.1 if [ -z "${KV_DIR}" ]
446     then
447 robbat2 1.63 if [ -z "${get_version_warning_done}" ]; then
448     get_version_warning_done=1
449     qeerror "Unable to find kernel sources at ${KERNEL_DIR}"
450     #qeinfo "This package requires Linux sources."
451     if [ "${KERNEL_DIR}" == "/usr/src/linux" ] ; then
452     qeinfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "
453     qeinfo "(or the kernel you wish to build against)."
454     qeinfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"
455     else
456     qeinfo "Please ensure that the KERNEL_DIR environment variable points at full Linux sources of the kernel you wish to compile against."
457     fi
458 johnm 1.7 fi
459 johnm 1.19 return 1
460 johnm 1.7 fi
461    
462 robbat2 1.63 if [ -z "${get_version_warning_done}" ]; then
463     qeinfo "Found kernel source directory:"
464     qeinfo " ${KV_DIR}"
465     fi
466 johnm 1.7
467     if [ ! -s "${KV_DIR}/Makefile" ]
468     then
469 robbat2 1.63 if [ -z "${get_version_warning_done}" ]; then
470     get_version_warning_done=1
471     qeerror "Could not find a Makefile in the kernel source directory."
472     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
473     fi
474 johnm 1.19 return 1
475 johnm 1.7 fi
476 swegener 1.29
477 johnm 1.4 # OK so now we know our sources directory, but they might be using
478     # KBUILD_OUTPUT, and we need this for .config and localversions-*
479     # so we better find it eh?
480     # do we pass KBUILD_OUTPUT on the CLI?
481     OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
482 swegener 1.29
483 robbat2 1.78 # keep track of it
484     KERNEL_MAKEFILE="${KV_DIR}/Makefile"
485 vapier 1.89
486 robbat2 1.83 # Decide the function used to extract makefile variables.
487     mkfunc="$(get_makefile_extract_function "${KERNEL_MAKEFILE}")"
488 robbat2 1.78
489 johnm 1.6 # And if we didn't pass it, we can take a nosey in the Makefile
490 robbat2 1.78 kbuild_output="$(${mkfunc} KBUILD_OUTPUT ${KERNEL_MAKEFILE})"
491 johnm 1.4 OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
492 swegener 1.29
493 johnm 1.1 # And contrary to existing functions I feel we shouldn't trust the
494     # directory name to find version information as this seems insane.
495 robbat2 1.78 # so we parse ${KERNEL_MAKEFILE}
496     KV_MAJOR="$(${mkfunc} VERSION ${KERNEL_MAKEFILE})"
497     KV_MINOR="$(${mkfunc} PATCHLEVEL ${KERNEL_MAKEFILE})"
498     KV_PATCH="$(${mkfunc} SUBLEVEL ${KERNEL_MAKEFILE})"
499     KV_EXTRA="$(${mkfunc} EXTRAVERSION ${KERNEL_MAKEFILE})"
500 swegener 1.29
501 johnm 1.7 if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
502     then
503 robbat2 1.63 if [ -z "${get_version_warning_done}" ]; then
504     get_version_warning_done=1
505     qeerror "Could not detect kernel version."
506     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources."
507     fi
508 johnm 1.19 return 1
509 johnm 1.7 fi
510 swegener 1.29
511 johnm 1.1 # and in newer versions we can also pull LOCALVERSION if it is set.
512 johnm 1.4 # but before we do this, we need to find if we use a different object directory.
513     # This *WILL* break if the user is using localversions, but we assume it was
514     # caught before this if they are.
515 robbat2 1.81 OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build}"
516 johnm 1.4
517     [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
518     [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
519     if [ -n "${KV_OUT_DIR}" ];
520     then
521 johnm 1.11 qeinfo "Found kernel object directory:"
522     qeinfo " ${KV_OUT_DIR}"
523 johnm 1.4 fi
524 johnm 1.41 # and if we STILL have not got it, then we better just set it to KV_DIR
525 johnm 1.4 KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
526 johnm 1.21
527 robbat2 1.86 # Grab the kernel release from the output directory.
528     # TODO: we MUST detect kernel.release being out of date, and 'return 1' from
529     # this function.
530     if [ -s "${KV_OUT_DIR}"/include/config/kernel.release ]; then
531     KV_LOCAL=$(<"${KV_OUT_DIR}"/include/config/kernel.release)
532     elif [ -s "${KV_OUT_DIR}"/.kernelrelease ]; then
533     KV_LOCAL=$(<"${KV_OUT_DIR}"/.kernelrelease)
534     else
535     KV_LOCAL=
536     fi
537 robbat2 1.85
538 robbat2 1.86 # KV_LOCAL currently contains the full release; discard the first bits.
539     tmplocal=${KV_LOCAL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}}
540 dsd 1.53
541 robbat2 1.86 # If the updated local version was not changed, the tree is not prepared.
542     # Clear out KV_LOCAL in that case.
543     # TODO: this does not detect a change in the localversion part between
544     # kernel.release and the value that would be generated.
545     if [ "$KV_LOCAL" = "$tmplocal" ]; then
546     KV_LOCAL=
547 robbat2 1.85 else
548 robbat2 1.86 KV_LOCAL=$tmplocal
549 johnm 1.41 fi
550    
551 johnm 1.1 # And we should set KV_FULL to the full expanded version
552     KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
553 johnm 1.21
554 johnm 1.11 qeinfo "Found sources for kernel version:"
555     qeinfo " ${KV_FULL}"
556 johnm 1.21
557 johnm 1.19 return 0
558 johnm 1.1 }
559    
560 dsd 1.56 # @FUNCTION: get_running_version
561     # @DESCRIPTION:
562     # It gets the version of the current running kernel and the result is the same as get_version() if the
563     # function can find the sources.
564 johnm 1.23 get_running_version() {
565     KV_FULL=$(uname -r)
566 johnm 1.1
567 abcd 1.84 if [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile && -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
568     KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
569     KBUILD_OUTPUT=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
570     unset KV_FULL
571     get_version
572     return $?
573     elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile ]]; then
574 johnm 1.23 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
575     unset KV_FULL
576     get_version
577     return $?
578     elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
579     KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
580     unset KV_FULL
581     get_version
582     return $?
583     else
584     KV_MAJOR=$(get_version_component_range 1 ${KV_FULL})
585     KV_MINOR=$(get_version_component_range 2 ${KV_FULL})
586 flameeyes 1.88 KV_PATCH=$(get_version_component_range 3 ${KV_FULL})
587 johnm 1.23 KV_PATCH=${KV_PATCH//-*}
588 flameeyes 1.88 KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}}"
589 johnm 1.23 fi
590     return 0
591     }
592 johnm 1.1
593 robbat2 1.66 # This next function is named with the eclass prefix to avoid conflicts with
594     # some old versionator-like eclass functions.
595    
596     # @FUNCTION: linux-info_get_any_version
597     # @DESCRIPTION:
598     # This attempts to find the version of the sources, and otherwise falls back to
599     # the version of the running kernel.
600     linux-info_get_any_version() {
601 maekke 1.73 get_version
602 robbat2 1.67 if [[ $? -ne 0 ]]; then
603 robbat2 1.66 ewarn "Unable to calculate Linux Kernel version for build, attempting to use running version"
604 maekke 1.73 get_running_version
605 robbat2 1.66 fi
606     }
607    
608 johnm 1.1
609     # ebuild check functions
610     # ---------------------------------------
611    
612 dsd 1.56 # @FUNCTION: check_kernel_built
613     # @DESCRIPTION:
614     # This function verifies that the current kernel sources have been already prepared otherwise it dies.
615 johnm 1.1 check_kernel_built() {
616 dsd 1.53 # if we haven't determined the version yet, we need to
617 dsd 1.54 require_configured_kernel
618 dsd 1.53 get_version
619 swegener 1.29
620 johnm 1.16 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ]
621 johnm 1.1 then
622 johnm 1.16 eerror "These sources have not yet been prepared."
623     eerror "We cannot build against an unprepared tree."
624 johnm 1.1 eerror "To resolve this, please type the following:"
625     eerror
626     eerror "# cd ${KV_DIR}"
627     eerror "# make oldconfig"
628 johnm 1.16 eerror "# make modules_prepare"
629 johnm 1.1 eerror
630     eerror "Then please try merging this module again."
631     die "Kernel sources need compiling first"
632     fi
633     }
634    
635 dsd 1.56 # @FUNCTION: check_modules_supported
636     # @DESCRIPTION:
637     # This function verifies that the current kernel support modules (it checks CONFIG_MODULES=y) otherwise it dies.
638 johnm 1.1 check_modules_supported() {
639     # if we haven't determined the version yet, we need too.
640 dsd 1.53 require_configured_kernel
641     get_version
642 swegener 1.29
643 johnm 1.7 if ! linux_chkconfig_builtin "MODULES"
644 johnm 1.1 then
645     eerror "These sources do not support loading external modules."
646     eerror "to be able to use this module please enable \"Loadable modules support\""
647     eerror "in your kernel, recompile and then try merging this module again."
648 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
649 johnm 1.3 fi
650     }
651    
652 dsd 1.56 # @FUNCTION: check_extra_config
653     # @DESCRIPTION:
654     # It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e.
655     # the prefix ~ is not used) doesn't satisfy the directive.
656 johnm 1.3 check_extra_config() {
657 mrness 1.45 local config negate die error reworkmodulenames
658 dsd 1.53 local soft_errors_count=0 hard_errors_count=0 config_required=0
659 robbat2 1.75 # store the value of the QA check, because otherwise we won't catch usages
660     # after if check_extra_config is called AND other direct calls are done
661     # later.
662     local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}"
663 dsd 1.53
664 dsd 1.55 # if we haven't determined the version yet, we need to
665 robbat2 1.70 linux-info_get_any_version
666 dsd 1.55
667 dsd 1.53 # Determine if we really need a .config. The only time when we don't need
668     # one is when all of the CONFIG_CHECK options are prefixed with "~".
669     for config in ${CONFIG_CHECK}
670     do
671     if [[ "${config:0:1}" != "~" ]]; then
672     config_required=1
673     break
674     fi
675     done
676    
677     if [[ ${config_required} == 0 ]]; then
678     # In the case where we don't require a .config, we can now bail out
679     # if the user has no .config as there is nothing to do. Otherwise
680     # code later will cause a failure due to missing .config.
681 robbat2 1.79 if ! linux_config_exists; then
682 robbat2 1.60 ewarn "Unable to check for the following kernel config options due"
683 robbat2 1.64 ewarn "to absence of any configured kernel sources or compiled"
684     ewarn "config:"
685 robbat2 1.60 for config in ${CONFIG_CHECK}; do
686 robbat2 1.77 local_error="ERROR_${config#\~}"
687     msg="${!local_error}"
688     if [[ "x${msg}" == "x" ]]; then
689     local_error="WARNING_${config#\~}"
690     msg="${!local_error}"
691     fi
692     ewarn " - ${config#\~}${msg:+ - }${msg}"
693 robbat2 1.60 done
694     ewarn "You're on your own to make sure they are set if needed."
695 robbat2 1.75 export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
696 dsd 1.53 return 0
697     fi
698     else
699 robbat2 1.79 require_configured_kernel
700 dsd 1.53 fi
701 johnm 1.3
702 mrness 1.45 einfo "Checking for suitable kernel configuration options..."
703 maekke 1.58
704 johnm 1.3 for config in ${CONFIG_CHECK}
705     do
706 johnm 1.31 # if we specify any fatal, ensure we honor them
707     die=1
708     error=0
709     negate=0
710     reworkmodulenames=0
711    
712 dsd 1.53 if [[ ${config:0:1} == "~" ]]; then
713 mrness 1.45 die=0
714 johnm 1.31 config=${config:1}
715 dsd 1.53 elif [[ ${config:0:1} == "@" ]]; then
716 mrness 1.45 die=0
717 johnm 1.31 reworkmodulenames=1
718     config=${config:1}
719     fi
720 dsd 1.53 if [[ ${config:0:1} == "!" ]]; then
721 mrness 1.45 negate=1
722 johnm 1.44 config=${config:1}
723     fi
724 johnm 1.17
725 johnm 1.31 if [[ ${negate} == 1 ]]; then
726     linux_chkconfig_present ${config} && error=2
727     elif [[ ${reworkmodulenames} == 1 ]]; then
728 mrness 1.45 local temp_config="${config//*:}" i n
729 johnm 1.17 config="${config//:*}"
730 johnm 1.31 if linux_chkconfig_present ${config}; then
731     for i in ${MODULE_NAMES}; do
732 johnm 1.17 n="${i//${temp_config}}"
733 dsd 1.38 [[ -z ${n//\(*} ]] && \
734 johnm 1.31 MODULE_IGNORE="${MODULE_IGNORE} ${temp_config}"
735 johnm 1.17 done
736 johnm 1.31 error=2
737 johnm 1.17 fi
738 johnm 1.3 else
739 johnm 1.31 linux_chkconfig_present ${config} || error=1
740     fi
741    
742 mrness 1.45 if [[ ${error} > 0 ]]; then
743     local report_func="eerror" local_error
744     local_error="ERROR_${config}"
745     local_error="${!local_error}"
746    
747     if [[ -z "${local_error}" ]]; then
748     # using old, deprecated format.
749     local_error="${config}_ERROR"
750     local_error="${!local_error}"
751     fi
752     if [[ ${die} == 0 && -z "${local_error}" ]]; then
753     #soft errors can be warnings
754     local_error="WARNING_${config}"
755 johnm 1.7 local_error="${!local_error}"
756 mrness 1.45 if [[ -n "${local_error}" ]] ; then
757     report_func="ewarn"
758 johnm 1.44 fi
759 mrness 1.45 fi
760 johnm 1.44
761 mrness 1.45 if [[ -z "${local_error}" ]]; then
762     [[ ${error} == 1 ]] \
763     && local_error="is not set when it should be." \
764     || local_error="should not be set. But it is."
765     local_error="CONFIG_${config}:\t ${local_error}"
766     fi
767     if [[ ${die} == 0 ]]; then
768     ${report_func} " ${local_error}"
769     soft_errors_count=$[soft_errors_count + 1]
770     else
771     ${report_func} " ${local_error}"
772     hard_errors_count=$[hard_errors_count + 1]
773 johnm 1.3 fi
774     fi
775     done
776    
777 mrness 1.45 if [[ ${hard_errors_count} > 0 ]]; then
778 johnm 1.3 eerror "Please check to make sure these options are set correctly."
779 johnm 1.31 eerror "Failure to do so may cause unexpected problems."
780 mrness 1.45 eerror "Once you have satisfied these options, please try merging"
781     eerror "this package again."
782 robbat2 1.75 export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
783 mrness 1.45 die "Incorrect kernel configuration options"
784     elif [[ ${soft_errors_count} > 0 ]]; then
785     ewarn "Please check to make sure these options are set correctly."
786     ewarn "Failure to do so may cause unexpected problems."
787     else
788     eend 0
789 johnm 1.1 fi
790 robbat2 1.75 export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
791 johnm 1.1 }
792    
793     check_zlibinflate() {
794 dsd 1.53 # if we haven't determined the version yet, we need to
795     require_configured_kernel
796     get_version
797 swegener 1.29
798 johnm 1.1 # although I restructured this code - I really really really dont support it!
799    
800     # bug #27882 - zlib routines are only linked into the kernel
801     # if something compiled into the kernel calls them
802     #
803     # plus, for the cloop module, it appears that there's no way
804     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
805     # is on
806 swegener 1.29
807     local INFLATE
808     local DEFLATE
809 johnm 1.1
810     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
811 swegener 1.29
812 johnm 1.1 ebegin "checking ZLIB_INFLATE"
813 robbat2 1.61 linux_chkconfig_builtin CONFIG_ZLIB_INFLATE
814 johnm 1.1 eend $?
815     [ "$?" != 0 ] && die
816 swegener 1.29
817 johnm 1.1 ebegin "checking ZLIB_DEFLATE"
818 robbat2 1.61 linux_chkconfig_builtin CONFIG_ZLIB_DEFLATE
819 johnm 1.1 eend $?
820     [ "$?" != 0 ] && die
821 swegener 1.29
822 johnm 1.1 local LINENO_START
823     local LINENO_END
824     local SYMBOLS
825     local x
826 swegener 1.29
827 johnm 1.1 LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
828     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
829     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
830     (( LINENO_END = $LINENO_END - 1 ))
831 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
832 johnm 1.1
833     # okay, now we have a list of symbols
834     # we need to check each one in turn, to see whether it is set or not
835     for x in $SYMBOLS ; do
836     if [ "${!x}" = "y" ]; then
837     # we have a winner!
838     einfo "${x} ensures zlib is linked into your kernel - excellent"
839     return 0
840     fi
841     done
842 swegener 1.29
843 johnm 1.1 eerror
844     eerror "This kernel module requires ZLIB library support."
845     eerror "You have enabled zlib support in your kernel, but haven't enabled"
846     eerror "enabled any option that will ensure that zlib is linked into your"
847     eerror "kernel."
848     eerror
849     eerror "Please ensure that you enable at least one of these options:"
850     eerror
851    
852     for x in $SYMBOLS ; do
853     eerror " * $x"
854     done
855    
856     eerror
857     eerror "Please remember to recompile and install your kernel, and reboot"
858     eerror "into your new kernel before attempting to load this kernel module."
859    
860     die "Kernel doesn't include zlib support"
861     }
862 johnm 1.8
863     ################################
864     # Default pkg_setup
865     # Also used when inheriting linux-mod to force a get_version call
866 dsd 1.56 # @FUNCTION: linux-info_pkg_setup
867     # @DESCRIPTION:
868     # Force a get_version() call when inherited from linux-mod.eclass and then check if the kernel is configured
869     # to support the options specified in CONFIG_CHECK (if not null)
870 johnm 1.8 linux-info_pkg_setup() {
871 robbat2 1.66 linux-info_get_any_version
872 phreak 1.48
873     if kernel_is 2 4; then
874     if [ "$( gcc-major-version )" -eq "4" ] ; then
875     echo
876     ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with"
877     ewarn "linux-2.4 (or modules building against a linux-2.4 kernel)!"
878     echo
879     ewarn "Either switch to another gcc-version (via gcc-config) or use a"
880     ewarn "newer kernel that supports gcc-4."
881     echo
882     ewarn "Also be aware that bugreports about gcc-4 not working"
883     ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"
884     echo
885     epause 10
886     fi
887     fi
888    
889 johnm 1.10 [ -n "${CONFIG_CHECK}" ] && check_extra_config;
890 johnm 1.8 }

  ViewVC Help
Powered by ViewVC 1.1.20