| 1 | # Copyright 1999-2006 Gentoo Foundation |
1 | # Copyright 1999-2006 Gentoo Foundation |
| 2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.61 2009/08/30 22:37:06 robbat2 Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.62 2009/09/06 22:54:58 robbat2 Exp $ |
| 4 | # |
4 | # |
| 5 | # Original author: John Mylchreest <johnm@gentoo.org> |
5 | # Original author: John Mylchreest <johnm@gentoo.org> |
| 6 | # Maintainer: kernel-misc@gentoo.org |
6 | # Maintainer: kernel-misc@gentoo.org |
| 7 | # |
7 | # |
| 8 | # Please direct your bugs to the current eclass maintainer :) |
8 | # Please direct your bugs to the current eclass maintainer :) |
| … | |
… | |
| 11 | # @MAINTAINER: |
11 | # @MAINTAINER: |
| 12 | # kernel-misc@gentoo.org |
12 | # kernel-misc@gentoo.org |
| 13 | # @BLURB: eclass used for accessing kernel related information |
13 | # @BLURB: eclass used for accessing kernel related information |
| 14 | # @DESCRIPTION: |
14 | # @DESCRIPTION: |
| 15 | # This eclass is used as a central eclass for accessing kernel |
15 | # This eclass is used as a central eclass for accessing kernel |
| 16 | # related information for sources already installed. |
16 | # related information for source or binary already installed. |
| 17 | # It is vital for linux-mod.eclass to function correctly, and is split |
17 | # It is vital for linux-mod.eclass to function correctly, and is split |
| 18 | # out so that any ebuild behaviour "templates" are abstracted out |
18 | # out so that any ebuild behaviour "templates" are abstracted out |
| 19 | # using additional eclasses. |
19 | # using additional eclasses. |
|
|
20 | # |
|
|
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. |
| 20 | |
24 | |
| 21 | # A Couple of env vars are available to effect usage of this eclass |
25 | # A Couple of env vars are available to effect usage of this eclass |
| 22 | # These are as follows: |
26 | # These are as follows: |
| 23 | |
27 | |
| 24 | # @ECLASS-VARIABLE: KERNEL_DIR |
28 | # @ECLASS-VARIABLE: KERNEL_DIR |
| … | |
… | |
| 36 | # You can also check that an option doesn't exist by |
40 | # You can also check that an option doesn't exist by |
| 37 | # prepending it with an exclamation mark (!). |
41 | # prepending it with an exclamation mark (!). |
| 38 | # |
42 | # |
| 39 | # e.g.: CONFIG_CHECK="!MTRR" |
43 | # e.g.: CONFIG_CHECK="!MTRR" |
| 40 | # |
44 | # |
| 41 | # To simply warn about a missing option, prepend a '~'. |
45 | # 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. |
| 42 | |
54 | |
| 43 | # @ECLASS-VARIABLE: ERROR_<CFG> |
55 | # @ECLASS-VARIABLE: ERROR_<CFG> |
| 44 | # @DESCRIPTION: |
56 | # @DESCRIPTION: |
| 45 | # A string containing the error message to display when the check against CONFIG_CHECK |
57 | # A string containing the error message to display when the check against CONFIG_CHECK |
| 46 | # fails. <CFG> should reference the appropriate option used in CONFIG_CHECK. |
58 | # fails. <CFG> should reference the appropriate option used in CONFIG_CHECK. |
| … | |
… | |
| 86 | |
98 | |
| 87 | # @ECLASS-VARIABLE: KV_OUT_DIR |
99 | # @ECLASS-VARIABLE: KV_OUT_DIR |
| 88 | # @DESCRIPTION: |
100 | # @DESCRIPTION: |
| 89 | # A read-only variable. It's a string containing the kernel object directory, will be KV_DIR unless |
101 | # A read-only variable. It's a string containing the kernel object directory, will be KV_DIR unless |
| 90 | # KBUILD_OUTPUT is used. This should be used for referencing .config. |
102 | # KBUILD_OUTPUT is used. This should be used for referencing .config. |
|
|
103 | |
|
|
104 | # @ECLASS-VARIABLE: I_KNOW_WHAT_I_AM_DOING |
|
|
105 | # @DESCRIPTION: |
|
|
106 | # Temporary variable for the migration to making linux-info non-fatal. |
| 91 | |
107 | |
| 92 | # And to ensure all the weirdness with crosscompile |
108 | # And to ensure all the weirdness with crosscompile |
| 93 | inherit toolchain-funcs versionator |
109 | inherit toolchain-funcs versionator |
| 94 | |
110 | |
| 95 | EXPORT_FUNCTIONS pkg_setup |
111 | EXPORT_FUNCTIONS pkg_setup |
| … | |
… | |
| 178 | # @DESCRIPTION: |
194 | # @DESCRIPTION: |
| 179 | # It detects the value of the variable defined in the file configfile. |
195 | # It detects the value of the variable defined in the file configfile. |
| 180 | # This is done with sed matching an expression only. If the variable is defined, |
196 | # This is done with sed matching an expression only. If the variable is defined, |
| 181 | # you will run into problems. See getfilevar for those cases. |
197 | # you will run into problems. See getfilevar for those cases. |
| 182 | getfilevar_noexec() { |
198 | getfilevar_noexec() { |
| 183 | local ERROR basefname basedname myARCH="${ARCH}" |
199 | local ERROR basefname basedname mycat myARCH="${ARCH}" |
| 184 | ERROR=0 |
200 | ERROR=0 |
|
|
201 | mycat='cat' |
| 185 | |
202 | |
| 186 | [ -z "${1}" ] && ERROR=1 |
203 | [ -z "${1}" ] && ERROR=1 |
| 187 | [ ! -f "${2}" ] && ERROR=1 |
204 | [ ! -f "${2}" ] && ERROR=1 |
|
|
205 | [ "${2#.gz}" != "${2}" ] && mycat='zcat' |
| 188 | |
206 | |
| 189 | if [ "${ERROR}" = 1 ] |
207 | if [ "${ERROR}" = 1 ] |
| 190 | then |
208 | then |
| 191 | echo -e "\n" |
209 | echo -e "\n" |
| 192 | eerror "getfilevar_noexec requires 2 variables, with the second a valid file." |
210 | eerror "getfilevar_noexec requires 2 variables, with the second a valid file." |
| 193 | eerror " getfilevar_noexec <VARIABLE> <CONFIGFILE>" |
211 | eerror " getfilevar_noexec <VARIABLE> <CONFIGFILE>" |
| 194 | else |
212 | else |
|
|
213 | ${mycat} "${2}" | \ |
| 195 | sed -n \ |
214 | sed -n \ |
| 196 | -e "/^[[:space:]]*${1}[[:space:]]*=[[:space:]]*\(.*\)\$/{ |
215 | -e "/^[[:space:]]*${1}[[:space:]]*=[[:space:]]*\(.*\)\$/{ |
| 197 | s,^[^=]*[[:space:]]*=[[:space:]]*,,g ; |
216 | s,^[^=]*[[:space:]]*=[[:space:]]*,,g ; |
| 198 | s,[[:space:]]*\$,,g ; |
217 | s,[[:space:]]*\$,,g ; |
| 199 | p |
218 | p |
| 200 | }" \ |
219 | }" |
| 201 | "${2}" |
|
|
| 202 | fi |
220 | fi |
| 203 | } |
221 | } |
| 204 | |
222 | |
|
|
223 | |
|
|
224 | # @FUNCTION: linux_config_src_exists |
|
|
225 | # @RETURN: true or false |
|
|
226 | # @DESCRIPTION: |
|
|
227 | # It returns true if .config exists in a build directory otherwise false |
|
|
228 | linux_config_src_exists() { |
|
|
229 | [ -s "${KV_OUT_DIR}/.config" ] |
|
|
230 | } |
|
|
231 | |
|
|
232 | # @FUNCTION: linux_config_bin_exists |
|
|
233 | # @RETURN: true or false |
|
|
234 | # @DESCRIPTION: |
|
|
235 | # It returns true if .config exists in /proc, otherwise false |
|
|
236 | linux_config_bin_exists() { |
|
|
237 | [ -s "/proc/config.gz" ] |
|
|
238 | } |
| 205 | |
239 | |
| 206 | # @FUNCTION: linux_config_exists |
240 | # @FUNCTION: linux_config_exists |
| 207 | # @RETURN: true or false |
241 | # @RETURN: true or false |
| 208 | # @DESCRIPTION: |
242 | # @DESCRIPTION: |
| 209 | # It returns true if .config exists otherwise false |
243 | # It returns true if .config exists otherwise false |
|
|
244 | # |
|
|
245 | # This function MUST be checked before using any of the linux_chkconfig_* |
|
|
246 | # functions. |
| 210 | linux_config_exists() { |
247 | linux_config_exists() { |
| 211 | [ -s "${KV_OUT_DIR}/.config" ] |
248 | linux_config_src_exists || linux_config_bin_exists |
| 212 | } |
249 | } |
| 213 | |
250 | |
| 214 | # @FUNCTION: require_configured_kernel |
251 | # @FUNCTION: require_configured_kernel |
| 215 | # @DESCRIPTION: |
252 | # @DESCRIPTION: |
| 216 | # This function verifies that the current kernel is configured (it checks against the existence of .config) |
253 | # This function verifies that the current kernel is configured (it checks against the existence of .config) |
| 217 | # otherwise it dies. |
254 | # otherwise it dies. |
| 218 | require_configured_kernel() { |
255 | require_configured_kernel() { |
| 219 | if ! linux_config_exists; then |
256 | if ! linux_config_src_exists; then |
| 220 | qeerror "Could not find a usable .config in the kernel source directory." |
257 | qeerror "Could not find a usable .config in the kernel source directory." |
| 221 | qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources." |
258 | qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources." |
| 222 | qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that" |
259 | qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that" |
| 223 | qeerror "it points to the necessary object directory so that it might find .config." |
260 | qeerror "it points to the necessary object directory so that it might find .config." |
| 224 | die "Kernel not configured; no .config found in ${KV_OUT_DIR}" |
261 | die "Kernel not configured; no .config found in ${KV_OUT_DIR}" |
| … | |
… | |
| 228 | # @FUNCTION: linux_chkconfig_present |
265 | # @FUNCTION: linux_chkconfig_present |
| 229 | # @USAGE: option |
266 | # @USAGE: option |
| 230 | # @RETURN: true or false |
267 | # @RETURN: true or false |
| 231 | # @DESCRIPTION: |
268 | # @DESCRIPTION: |
| 232 | # It checks that CONFIG_<option>=y or CONFIG_<option>=m is present in the current kernel .config |
269 | # It checks that CONFIG_<option>=y or CONFIG_<option>=m is present in the current kernel .config |
|
|
270 | # If linux_config_exists returns false, the results of this are UNDEFINED. You |
|
|
271 | # MUST call linux_config_exists first. |
| 233 | linux_chkconfig_present() { |
272 | linux_chkconfig_present() { |
| 234 | local RESULT |
273 | local RESULT |
| 235 | require_configured_kernel |
274 | [ -z "${I_KNOW_WHAT_I_AM_DOING}" ] && require_configured_kernel |
|
|
275 | local config |
|
|
276 | config="${KV_OUT_DIR}/.config" |
|
|
277 | [ ! -f "${config}" ] && config="/proc/config.gz" |
| 236 | RESULT="$(getfilevar_noexec CONFIG_${1} ${KV_OUT_DIR}/.config)" |
278 | RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" |
| 237 | [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1 |
279 | [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1 |
| 238 | } |
280 | } |
| 239 | |
281 | |
| 240 | # @FUNCTION: linux_chkconfig_module |
282 | # @FUNCTION: linux_chkconfig_module |
| 241 | # @USAGE: option |
283 | # @USAGE: option |
| 242 | # @RETURN: true or false |
284 | # @RETURN: true or false |
| 243 | # @DESCRIPTION: |
285 | # @DESCRIPTION: |
| 244 | # It checks that CONFIG_<option>=m is present in the current kernel .config |
286 | # It checks that CONFIG_<option>=m is present in the current kernel .config |
|
|
287 | # If linux_config_exists returns false, the results of this are UNDEFINED. You |
|
|
288 | # MUST call linux_config_exists first. |
| 245 | linux_chkconfig_module() { |
289 | linux_chkconfig_module() { |
| 246 | local RESULT |
290 | local RESULT |
| 247 | require_configured_kernel |
291 | [ -z "${I_KNOW_WHAT_I_AM_DOING}" ] && require_configured_kernel |
|
|
292 | local config |
|
|
293 | config="${KV_OUT_DIR}/.config" |
|
|
294 | [ ! -f "${config}" ] && config="/proc/config.gz" |
| 248 | RESULT="$(getfilevar_noexec CONFIG_${1} ${KV_OUT_DIR}/.config)" |
295 | RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" |
| 249 | [ "${RESULT}" = "m" ] && return 0 || return 1 |
296 | [ "${RESULT}" = "m" ] && return 0 || return 1 |
| 250 | } |
297 | } |
| 251 | |
298 | |
| 252 | # @FUNCTION: linux_chkconfig_builtin |
299 | # @FUNCTION: linux_chkconfig_builtin |
| 253 | # @USAGE: option |
300 | # @USAGE: option |
| 254 | # @RETURN: true or false |
301 | # @RETURN: true or false |
| 255 | # @DESCRIPTION: |
302 | # @DESCRIPTION: |
| 256 | # It checks that CONFIG_<option>=y is present in the current kernel .config |
303 | # It checks that CONFIG_<option>=y is present in the current kernel .config |
|
|
304 | # If linux_config_exists returns false, the results of this are UNDEFINED. You |
|
|
305 | # MUST call linux_config_exists first. |
| 257 | linux_chkconfig_builtin() { |
306 | linux_chkconfig_builtin() { |
| 258 | local RESULT |
307 | local RESULT |
| 259 | require_configured_kernel |
308 | [ -z "${I_KNOW_WHAT_I_AM_DOING}" ] && require_configured_kernel |
|
|
309 | local config |
|
|
310 | config="${KV_OUT_DIR}/.config" |
|
|
311 | [ ! -f "${config}" ] && config="/proc/config.gz" |
| 260 | RESULT="$(getfilevar_noexec CONFIG_${1} ${KV_OUT_DIR}/.config)" |
312 | RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" |
| 261 | [ "${RESULT}" = "y" ] && return 0 || return 1 |
313 | [ "${RESULT}" = "y" ] && return 0 || return 1 |
| 262 | } |
314 | } |
| 263 | |
315 | |
| 264 | # @FUNCTION: linux_chkconfig_string |
316 | # @FUNCTION: linux_chkconfig_string |
| 265 | # @USAGE: option |
317 | # @USAGE: option |
| 266 | # @RETURN: CONFIG_<option> |
318 | # @RETURN: CONFIG_<option> |
| 267 | # @DESCRIPTION: |
319 | # @DESCRIPTION: |
| 268 | # It prints the CONFIG_<option> value of the current kernel .config (it requires a configured kernel). |
320 | # It prints the CONFIG_<option> value of the current kernel .config (it requires a configured kernel). |
|
|
321 | # If linux_config_exists returns false, the results of this are UNDEFINED. You |
|
|
322 | # MUST call linux_config_exists first. |
| 269 | linux_chkconfig_string() { |
323 | linux_chkconfig_string() { |
| 270 | require_configured_kernel |
324 | [ -z "${I_KNOW_WHAT_I_AM_DOING}" ] && require_configured_kernel |
|
|
325 | local config |
|
|
326 | config="${KV_OUT_DIR}/.config" |
|
|
327 | [ ! -f "${config}" ] && config="/proc/config.gz" |
| 271 | getfilevar_noexec "CONFIG_${1}" "${KV_OUT_DIR}/.config" |
328 | getfilevar_noexec "CONFIG_${1}" "${config}" |
| 272 | } |
329 | } |
| 273 | |
330 | |
| 274 | # Versioning Functions |
331 | # Versioning Functions |
| 275 | # --------------------------------------- |
332 | # --------------------------------------- |
| 276 | |
333 | |
| … | |
… | |
| 729 | # @FUNCTION: linux-info_pkg_setup |
786 | # @FUNCTION: linux-info_pkg_setup |
| 730 | # @DESCRIPTION: |
787 | # @DESCRIPTION: |
| 731 | # Force a get_version() call when inherited from linux-mod.eclass and then check if the kernel is configured |
788 | # Force a get_version() call when inherited from linux-mod.eclass and then check if the kernel is configured |
| 732 | # to support the options specified in CONFIG_CHECK (if not null) |
789 | # to support the options specified in CONFIG_CHECK (if not null) |
| 733 | linux-info_pkg_setup() { |
790 | linux-info_pkg_setup() { |
| 734 | get_version || die "Unable to calculate Linux Kernel version" |
791 | get_version |
|
|
792 | if [[ $rc -ne 0 ]]; then |
|
|
793 | ewarn "Unable to calculate Linux Kernel version for build, attempting to use running version" |
|
|
794 | get_running_version |
|
|
795 | fi |
| 735 | |
796 | |
| 736 | if kernel_is 2 4; then |
797 | if kernel_is 2 4; then |
| 737 | if [ "$( gcc-major-version )" -eq "4" ] ; then |
798 | if [ "$( gcc-major-version )" -eq "4" ] ; then |
| 738 | echo |
799 | echo |
| 739 | ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with" |
800 | ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with" |