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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.78 - (hide annotations) (download)
Sun Jan 10 08:47:01 2010 UTC (4 years, 3 months ago) by robbat2
Branch: MAIN
Changes since 1.77: +22 -7 lines
Bug #300306, #167385: One side effect of the non-exec check version for the kernel makefile is that it did not pick up appends, breaking builds on some patched kernels. Try the exec version first now, with a fallback.

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

  ViewVC Help
Powered by ViewVC 1.1.20