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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.97 - (hide annotations) (download)
Sun Feb 10 02:21:55 2013 UTC (17 months, 2 weeks ago) by vapier
Branch: MAIN
Changes since 1.96: +21 -22 lines
if KV_OUT_DIR is not set, do not let linux_config_src_exists implicitly check /.config #382787 by bay

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

  ViewVC Help
Powered by ViewVC 1.1.20