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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.99 - (hide annotations) (download)
Sun Feb 10 06:20:10 2013 UTC (18 months, 1 week ago) by vapier
Branch: MAIN
Changes since 1.98: +1 -4 lines
delete empty depend vars

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

  ViewVC Help
Powered by ViewVC 1.1.20