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