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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.103 - (hide annotations) (download)
Fri Mar 21 22:03:00 2014 UTC (7 months, 1 week ago) by robbat2
Branch: MAIN
Changes since 1.102: +3 -3 lines
linux-info: Bug #504346: Change one message from error to warning, kernel sources are optional for most uses (checking configs), and knowledge if the lack of kernel sources being missing is fatal should be left to the ebuild.

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

  ViewVC Help
Powered by ViewVC 1.1.20