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