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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.100 - (hide annotations) (download)
Sun Feb 10 07:53:31 2013 UTC (19 months ago) by vapier
Branch: MAIN
Changes since 1.99: +9 -2 lines
if KERNEL_DIR is pointing to the object output, figure out the source dir and setup KBUILD_OUTPUT automatically #454294 by Ɓukasz Stelmach

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

  ViewVC Help
Powered by ViewVC 1.1.20