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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.101 - (hide annotations) (download)
Sun Sep 29 02:36:17 2013 UTC (9 months, 4 weeks ago) by vapier
Branch: MAIN
Changes since 1.100: +5 -4 lines
get_version: do not parse KBUILD_OUTPUT in the cases where we do not use it as reported by Doug Anderson from ChromiumOS

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.101 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.100 2013/02/10 07:53:31 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 vapier 1.101 local 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 vapier 1.100 # See if the kernel dir is actually an output dir. #454294
466     if [ -z "${KBUILD_OUTPUT}" -a -L "${KERNEL_DIR}/source" ]; then
467     KBUILD_OUTPUT=${KERNEL_DIR}
468     KERNEL_DIR=$(readlink -f "${KERNEL_DIR}/source")
469     KV_DIR=${KERNEL_DIR}
470     fi
471    
472 robbat2 1.63 if [ -z "${get_version_warning_done}" ]; then
473     qeinfo "Found kernel source directory:"
474     qeinfo " ${KV_DIR}"
475     fi
476 johnm 1.7
477     if [ ! -s "${KV_DIR}/Makefile" ]
478     then
479 robbat2 1.63 if [ -z "${get_version_warning_done}" ]; then
480     get_version_warning_done=1
481     qeerror "Could not find a Makefile in the kernel source directory."
482     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
483     fi
484 johnm 1.19 return 1
485 johnm 1.7 fi
486 swegener 1.29
487 johnm 1.4 # OK so now we know our sources directory, but they might be using
488     # KBUILD_OUTPUT, and we need this for .config and localversions-*
489     # so we better find it eh?
490     # do we pass KBUILD_OUTPUT on the CLI?
491 vapier 1.100 local OUTPUT_DIR=${KBUILD_OUTPUT}
492 swegener 1.29
493 robbat2 1.78 # keep track of it
494     KERNEL_MAKEFILE="${KV_DIR}/Makefile"
495 vapier 1.89
496 robbat2 1.83 # Decide the function used to extract makefile variables.
497     mkfunc="$(get_makefile_extract_function "${KERNEL_MAKEFILE}")"
498 robbat2 1.78
499 johnm 1.6 # And if we didn't pass it, we can take a nosey in the Makefile
500 vapier 1.101 if [[ -z ${OUTPUT_DIR} ]]; then
501     OUTPUT_DIR=$(${mkfunc} KBUILD_OUTPUT "${KERNEL_MAKEFILE}")
502     fi
503 swegener 1.29
504 johnm 1.1 # And contrary to existing functions I feel we shouldn't trust the
505     # directory name to find version information as this seems insane.
506 robbat2 1.78 # so we parse ${KERNEL_MAKEFILE}
507     KV_MAJOR="$(${mkfunc} VERSION ${KERNEL_MAKEFILE})"
508     KV_MINOR="$(${mkfunc} PATCHLEVEL ${KERNEL_MAKEFILE})"
509     KV_PATCH="$(${mkfunc} SUBLEVEL ${KERNEL_MAKEFILE})"
510     KV_EXTRA="$(${mkfunc} EXTRAVERSION ${KERNEL_MAKEFILE})"
511 swegener 1.29
512 johnm 1.7 if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
513     then
514 robbat2 1.63 if [ -z "${get_version_warning_done}" ]; then
515     get_version_warning_done=1
516     qeerror "Could not detect kernel version."
517     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources."
518     fi
519 johnm 1.19 return 1
520 johnm 1.7 fi
521 swegener 1.29
522 johnm 1.1 # and in newer versions we can also pull LOCALVERSION if it is set.
523 johnm 1.4 # but before we do this, we need to find if we use a different object directory.
524     # This *WILL* break if the user is using localversions, but we assume it was
525     # caught before this if they are.
526 robbat2 1.81 OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build}"
527 johnm 1.4
528     [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
529     [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
530     if [ -n "${KV_OUT_DIR}" ];
531     then
532 johnm 1.11 qeinfo "Found kernel object directory:"
533     qeinfo " ${KV_OUT_DIR}"
534 johnm 1.4 fi
535 johnm 1.41 # and if we STILL have not got it, then we better just set it to KV_DIR
536 johnm 1.4 KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
537 johnm 1.21
538 robbat2 1.86 # Grab the kernel release from the output directory.
539     # TODO: we MUST detect kernel.release being out of date, and 'return 1' from
540     # this function.
541     if [ -s "${KV_OUT_DIR}"/include/config/kernel.release ]; then
542     KV_LOCAL=$(<"${KV_OUT_DIR}"/include/config/kernel.release)
543     elif [ -s "${KV_OUT_DIR}"/.kernelrelease ]; then
544     KV_LOCAL=$(<"${KV_OUT_DIR}"/.kernelrelease)
545     else
546     KV_LOCAL=
547     fi
548 robbat2 1.85
549 robbat2 1.86 # KV_LOCAL currently contains the full release; discard the first bits.
550     tmplocal=${KV_LOCAL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}}
551 dsd 1.53
552 robbat2 1.86 # If the updated local version was not changed, the tree is not prepared.
553     # Clear out KV_LOCAL in that case.
554     # TODO: this does not detect a change in the localversion part between
555     # kernel.release and the value that would be generated.
556     if [ "$KV_LOCAL" = "$tmplocal" ]; then
557     KV_LOCAL=
558 robbat2 1.85 else
559 robbat2 1.86 KV_LOCAL=$tmplocal
560 johnm 1.41 fi
561    
562 johnm 1.1 # And we should set KV_FULL to the full expanded version
563     KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
564 johnm 1.21
565 johnm 1.11 qeinfo "Found sources for kernel version:"
566     qeinfo " ${KV_FULL}"
567 johnm 1.21
568 johnm 1.19 return 0
569 johnm 1.1 }
570    
571 dsd 1.56 # @FUNCTION: get_running_version
572     # @DESCRIPTION:
573     # It gets the version of the current running kernel and the result is the same as get_version() if the
574     # function can find the sources.
575 johnm 1.23 get_running_version() {
576     KV_FULL=$(uname -r)
577 johnm 1.1
578 abcd 1.84 if [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile && -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
579     KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
580     KBUILD_OUTPUT=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
581     unset KV_FULL
582     get_version
583     return $?
584     elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile ]]; then
585 johnm 1.23 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
586     unset KV_FULL
587     get_version
588     return $?
589     elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
590     KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
591     unset KV_FULL
592     get_version
593     return $?
594     else
595 vapier 1.96 # This handles a variety of weird kernel versions. Make sure to update
596     # tests/linux-info:get_running_version.sh if you want to change this.
597     local kv_full=${KV_FULL//[-+_]*}
598     KV_MAJOR=$(get_version_component_range 1 ${kv_full})
599     KV_MINOR=$(get_version_component_range 2 ${kv_full})
600     KV_PATCH=$(get_version_component_range 3 ${kv_full})
601     KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}${KV_PATCH:+.${KV_PATCH}}}"
602     : ${KV_PATCH:=0}
603 johnm 1.23 fi
604     return 0
605     }
606 johnm 1.1
607 robbat2 1.66 # This next function is named with the eclass prefix to avoid conflicts with
608     # some old versionator-like eclass functions.
609    
610     # @FUNCTION: linux-info_get_any_version
611     # @DESCRIPTION:
612     # This attempts to find the version of the sources, and otherwise falls back to
613     # the version of the running kernel.
614     linux-info_get_any_version() {
615 maekke 1.73 get_version
616 robbat2 1.67 if [[ $? -ne 0 ]]; then
617 robbat2 1.66 ewarn "Unable to calculate Linux Kernel version for build, attempting to use running version"
618 maekke 1.73 get_running_version
619 robbat2 1.66 fi
620     }
621    
622 johnm 1.1
623     # ebuild check functions
624     # ---------------------------------------
625    
626 dsd 1.56 # @FUNCTION: check_kernel_built
627     # @DESCRIPTION:
628     # This function verifies that the current kernel sources have been already prepared otherwise it dies.
629 johnm 1.1 check_kernel_built() {
630 dsd 1.53 # if we haven't determined the version yet, we need to
631 dsd 1.54 require_configured_kernel
632 dsd 1.53 get_version
633 swegener 1.29
634 mpagano 1.93 local versionh_path
635     if kernel_is -ge 3 7; then
636     versionh_path="include/generated/uapi/linux/version.h"
637     else
638     versionh_path="include/linux/version.h"
639     fi
640    
641     if [ ! -f "${KV_OUT_DIR}/${versionh_path}" ]
642 johnm 1.1 then
643 johnm 1.16 eerror "These sources have not yet been prepared."
644     eerror "We cannot build against an unprepared tree."
645 johnm 1.1 eerror "To resolve this, please type the following:"
646     eerror
647     eerror "# cd ${KV_DIR}"
648     eerror "# make oldconfig"
649 johnm 1.16 eerror "# make modules_prepare"
650 johnm 1.1 eerror
651     eerror "Then please try merging this module again."
652     die "Kernel sources need compiling first"
653     fi
654     }
655    
656 dsd 1.56 # @FUNCTION: check_modules_supported
657     # @DESCRIPTION:
658     # This function verifies that the current kernel support modules (it checks CONFIG_MODULES=y) otherwise it dies.
659 johnm 1.1 check_modules_supported() {
660     # if we haven't determined the version yet, we need too.
661 dsd 1.53 require_configured_kernel
662     get_version
663 swegener 1.29
664 vapier 1.94 if ! linux_chkconfig_builtin "MODULES"; then
665 johnm 1.1 eerror "These sources do not support loading external modules."
666     eerror "to be able to use this module please enable \"Loadable modules support\""
667     eerror "in your kernel, recompile and then try merging this module again."
668 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
669 johnm 1.3 fi
670     }
671    
672 dsd 1.56 # @FUNCTION: check_extra_config
673     # @DESCRIPTION:
674     # It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e.
675     # the prefix ~ is not used) doesn't satisfy the directive.
676 johnm 1.3 check_extra_config() {
677 vapier 1.94 local config negate die error reworkmodulenames
678     local soft_errors_count=0 hard_errors_count=0 config_required=0
679 robbat2 1.75 # store the value of the QA check, because otherwise we won't catch usages
680     # after if check_extra_config is called AND other direct calls are done
681     # later.
682 vapier 1.94 local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}"
683 dsd 1.53
684 dsd 1.55 # if we haven't determined the version yet, we need to
685 robbat2 1.70 linux-info_get_any_version
686 dsd 1.55
687 dsd 1.53 # Determine if we really need a .config. The only time when we don't need
688     # one is when all of the CONFIG_CHECK options are prefixed with "~".
689 vapier 1.94 for config in ${CONFIG_CHECK}; do
690 dsd 1.53 if [[ "${config:0:1}" != "~" ]]; then
691     config_required=1
692     break
693     fi
694     done
695    
696     if [[ ${config_required} == 0 ]]; then
697     # In the case where we don't require a .config, we can now bail out
698     # if the user has no .config as there is nothing to do. Otherwise
699     # code later will cause a failure due to missing .config.
700 robbat2 1.79 if ! linux_config_exists; then
701 robbat2 1.60 ewarn "Unable to check for the following kernel config options due"
702 robbat2 1.64 ewarn "to absence of any configured kernel sources or compiled"
703     ewarn "config:"
704 robbat2 1.60 for config in ${CONFIG_CHECK}; do
705 robbat2 1.77 local_error="ERROR_${config#\~}"
706     msg="${!local_error}"
707     if [[ "x${msg}" == "x" ]]; then
708     local_error="WARNING_${config#\~}"
709     msg="${!local_error}"
710     fi
711     ewarn " - ${config#\~}${msg:+ - }${msg}"
712 robbat2 1.60 done
713     ewarn "You're on your own to make sure they are set if needed."
714 robbat2 1.75 export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
715 dsd 1.53 return 0
716     fi
717     else
718 robbat2 1.79 require_configured_kernel
719 dsd 1.53 fi
720 johnm 1.3
721 mrness 1.45 einfo "Checking for suitable kernel configuration options..."
722 maekke 1.58
723 johnm 1.3 for config in ${CONFIG_CHECK}
724     do
725 johnm 1.31 # if we specify any fatal, ensure we honor them
726     die=1
727     error=0
728     negate=0
729     reworkmodulenames=0
730    
731 dsd 1.53 if [[ ${config:0:1} == "~" ]]; then
732 mrness 1.45 die=0
733 johnm 1.31 config=${config:1}
734 dsd 1.53 elif [[ ${config:0:1} == "@" ]]; then
735 mrness 1.45 die=0
736 johnm 1.31 reworkmodulenames=1
737     config=${config:1}
738     fi
739 dsd 1.53 if [[ ${config:0:1} == "!" ]]; then
740 mrness 1.45 negate=1
741 johnm 1.44 config=${config:1}
742     fi
743 johnm 1.17
744 johnm 1.31 if [[ ${negate} == 1 ]]; then
745     linux_chkconfig_present ${config} && error=2
746     elif [[ ${reworkmodulenames} == 1 ]]; then
747 mrness 1.45 local temp_config="${config//*:}" i n
748 johnm 1.17 config="${config//:*}"
749 johnm 1.31 if linux_chkconfig_present ${config}; then
750     for i in ${MODULE_NAMES}; do
751 johnm 1.17 n="${i//${temp_config}}"
752 dsd 1.38 [[ -z ${n//\(*} ]] && \
753 johnm 1.31 MODULE_IGNORE="${MODULE_IGNORE} ${temp_config}"
754 johnm 1.17 done
755 johnm 1.31 error=2
756 johnm 1.17 fi
757 johnm 1.3 else
758 johnm 1.31 linux_chkconfig_present ${config} || error=1
759     fi
760    
761 mrness 1.45 if [[ ${error} > 0 ]]; then
762     local report_func="eerror" local_error
763     local_error="ERROR_${config}"
764     local_error="${!local_error}"
765    
766     if [[ -z "${local_error}" ]]; then
767     # using old, deprecated format.
768     local_error="${config}_ERROR"
769     local_error="${!local_error}"
770     fi
771     if [[ ${die} == 0 && -z "${local_error}" ]]; then
772     #soft errors can be warnings
773     local_error="WARNING_${config}"
774 johnm 1.7 local_error="${!local_error}"
775 mrness 1.45 if [[ -n "${local_error}" ]] ; then
776     report_func="ewarn"
777 johnm 1.44 fi
778 mrness 1.45 fi
779 johnm 1.44
780 mrness 1.45 if [[ -z "${local_error}" ]]; then
781     [[ ${error} == 1 ]] \
782     && local_error="is not set when it should be." \
783     || local_error="should not be set. But it is."
784     local_error="CONFIG_${config}:\t ${local_error}"
785     fi
786     if [[ ${die} == 0 ]]; then
787     ${report_func} " ${local_error}"
788     soft_errors_count=$[soft_errors_count + 1]
789     else
790     ${report_func} " ${local_error}"
791     hard_errors_count=$[hard_errors_count + 1]
792 johnm 1.3 fi
793     fi
794     done
795    
796 mrness 1.45 if [[ ${hard_errors_count} > 0 ]]; then
797 johnm 1.3 eerror "Please check to make sure these options are set correctly."
798 johnm 1.31 eerror "Failure to do so may cause unexpected problems."
799 mrness 1.45 eerror "Once you have satisfied these options, please try merging"
800     eerror "this package again."
801 robbat2 1.75 export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
802 mrness 1.45 die "Incorrect kernel configuration options"
803     elif [[ ${soft_errors_count} > 0 ]]; then
804     ewarn "Please check to make sure these options are set correctly."
805     ewarn "Failure to do so may cause unexpected problems."
806     else
807     eend 0
808 johnm 1.1 fi
809 robbat2 1.75 export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
810 johnm 1.1 }
811    
812     check_zlibinflate() {
813 dsd 1.53 # if we haven't determined the version yet, we need to
814     require_configured_kernel
815     get_version
816 swegener 1.29
817 johnm 1.1 # although I restructured this code - I really really really dont support it!
818    
819     # bug #27882 - zlib routines are only linked into the kernel
820     # if something compiled into the kernel calls them
821     #
822     # plus, for the cloop module, it appears that there's no way
823     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
824     # is on
825 swegener 1.29
826     local INFLATE
827     local DEFLATE
828 johnm 1.1
829     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
830 swegener 1.29
831 johnm 1.1 ebegin "checking ZLIB_INFLATE"
832 robbat2 1.61 linux_chkconfig_builtin CONFIG_ZLIB_INFLATE
833 johnm 1.1 eend $?
834     [ "$?" != 0 ] && die
835 swegener 1.29
836 johnm 1.1 ebegin "checking ZLIB_DEFLATE"
837 robbat2 1.61 linux_chkconfig_builtin CONFIG_ZLIB_DEFLATE
838 johnm 1.1 eend $?
839     [ "$?" != 0 ] && die
840 swegener 1.29
841 johnm 1.1 local LINENO_START
842     local LINENO_END
843     local SYMBOLS
844     local x
845 swegener 1.29
846 johnm 1.1 LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
847     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
848     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
849     (( LINENO_END = $LINENO_END - 1 ))
850 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
851 johnm 1.1
852     # okay, now we have a list of symbols
853     # we need to check each one in turn, to see whether it is set or not
854     for x in $SYMBOLS ; do
855     if [ "${!x}" = "y" ]; then
856     # we have a winner!
857     einfo "${x} ensures zlib is linked into your kernel - excellent"
858     return 0
859     fi
860     done
861 swegener 1.29
862 johnm 1.1 eerror
863     eerror "This kernel module requires ZLIB library support."
864     eerror "You have enabled zlib support in your kernel, but haven't enabled"
865     eerror "enabled any option that will ensure that zlib is linked into your"
866     eerror "kernel."
867     eerror
868     eerror "Please ensure that you enable at least one of these options:"
869     eerror
870    
871     for x in $SYMBOLS ; do
872     eerror " * $x"
873     done
874    
875     eerror
876     eerror "Please remember to recompile and install your kernel, and reboot"
877     eerror "into your new kernel before attempting to load this kernel module."
878    
879     die "Kernel doesn't include zlib support"
880     }
881 johnm 1.8
882     ################################
883     # Default pkg_setup
884     # Also used when inheriting linux-mod to force a get_version call
885 dsd 1.56 # @FUNCTION: linux-info_pkg_setup
886     # @DESCRIPTION:
887     # Force a get_version() call when inherited from linux-mod.eclass and then check if the kernel is configured
888     # to support the options specified in CONFIG_CHECK (if not null)
889 johnm 1.8 linux-info_pkg_setup() {
890 robbat2 1.66 linux-info_get_any_version
891 phreak 1.48
892     if kernel_is 2 4; then
893     if [ "$( gcc-major-version )" -eq "4" ] ; then
894     echo
895     ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with"
896     ewarn "linux-2.4 (or modules building against a linux-2.4 kernel)!"
897     echo
898     ewarn "Either switch to another gcc-version (via gcc-config) or use a"
899     ewarn "newer kernel that supports gcc-4."
900     echo
901     ewarn "Also be aware that bugreports about gcc-4 not working"
902     ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"
903     echo
904     epause 10
905     fi
906     fi
907    
908 johnm 1.10 [ -n "${CONFIG_CHECK}" ] && check_extra_config;
909 johnm 1.8 }

  ViewVC Help
Powered by ViewVC 1.1.20