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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.104 - (hide annotations) (download)
Sat Jun 28 07:54:27 2014 UTC (3 years, 2 months ago) by robbat2
Branch: MAIN
Changes since 1.103: +6 -3 lines
ChangeLog

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

  ViewVC Help
Powered by ViewVC 1.1.20