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

Diff of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.83 Revision 1.93
1# Copyright 1999-2006 Gentoo Foundation 1# Copyright 1999-2012 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.83 2010/01/17 21:46:55 robbat2 Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.93 2012/10/22 19:00:52 mpagano Exp $
4#
5# Original author: John Mylchreest <johnm@gentoo.org>
6# Maintainer: kernel-misc@gentoo.org
7#
8# Please direct your bugs to the current eclass maintainer :)
9 4
10# @ECLASS: linux-info.eclass 5# @ECLASS: linux-info.eclass
11# @MAINTAINER: 6# @MAINTAINER:
12# kernel-misc@gentoo.org 7# kernel-misc@gentoo.org
8# @AUTHOR:
9# Original author: John Mylchreest <johnm@gentoo.org>
13# @BLURB: eclass used for accessing kernel related information 10# @BLURB: eclass used for accessing kernel related information
14# @DESCRIPTION: 11# @DESCRIPTION:
15# This eclass is used as a central eclass for accessing kernel 12# This eclass is used as a central eclass for accessing kernel
16# related information for source or binary already installed. 13# related information for source or binary already installed.
17# It is vital for linux-mod.eclass to function correctly, and is split 14# It is vital for linux-mod.eclass to function correctly, and is split
19# using additional eclasses. 16# using additional eclasses.
20# 17#
21# "kernel config" in this file means: 18# "kernel config" in this file means:
22# The .config of the currently installed sources is used as the first 19# 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# preference, with a fall-back to bundled config (/proc/config.gz) if available.
21#
22# Before using any of the config-handling functions in this eclass, you must
23# ensure that one of the following functions has been called (in order of
24# preference), otherwise you will get bugs like #364041):
25# linux-info_pkg_setup
26# linux-info_get_any_version
27# get_version
28# get_running_version
24 29
25# A Couple of env vars are available to effect usage of this eclass 30# A Couple of env vars are available to effect usage of this eclass
26# These are as follows: 31# These are as follows:
27 32
28# @ECLASS-VARIABLE: KERNEL_DIR 33# @ECLASS-VARIABLE: KERNEL_DIR
40# You can also check that an option doesn't exist by 45# You can also check that an option doesn't exist by
41# prepending it with an exclamation mark (!). 46# prepending it with an exclamation mark (!).
42# 47#
43# e.g.: CONFIG_CHECK="!MTRR" 48# e.g.: CONFIG_CHECK="!MTRR"
44# 49#
45# To simply warn about a missing option, prepend a '~'. 50# To simply warn about a missing option, prepend a '~'.
46# It may be combined with '!'. 51# It may be combined with '!'.
47# 52#
48# In general, most checks should be non-fatal. The only time fatal checks should 53# 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 54# be used is for building kernel modules or cases that a compile will fail
50# without the option. 55# without the option.
207 eerror "getfilevar_noexec requires 2 variables, with the second a valid file." 212 eerror "getfilevar_noexec requires 2 variables, with the second a valid file."
208 eerror " getfilevar_noexec <VARIABLE> <CONFIGFILE>" 213 eerror " getfilevar_noexec <VARIABLE> <CONFIGFILE>"
209 else 214 else
210 ${mycat} "${2}" | \ 215 ${mycat} "${2}" | \
211 sed -n \ 216 sed -n \
212 -e "/^[[:space:]]*${1}[[:space:]]*:\\?=[[:space:]]*\(.*\)\$/{ 217 -e "/^[[:space:]]*${1}[[:space:]]*:\\?=[[:space:]]*\(.*\)\$/{
213 s,^[^=]*[[:space:]]*=[[:space:]]*,,g ; 218 s,^[^=]*[[:space:]]*=[[:space:]]*,,g ;
214 s,[[:space:]]*\$,,g ; 219 s,[[:space:]]*\$,,g ;
215 p 220 p
216 }" 221 }"
217 fi 222 fi
218} 223}
219 224
220# @PRIVATE-VARIABLE: _LINUX_CONFIG_EXISTS_DONE 225# @ECLASS-VARIABLE: _LINUX_CONFIG_EXISTS_DONE
226# @INTERNAL
221# @DESCRIPTION: 227# @DESCRIPTION:
222# This is only set if one of the linux_config_*exists functions has been called. 228# This is only set if one of the linux_config_*exists functions has been called.
223# We use it for a QA warning that the check for a config has not been performed, 229# We use it for a QA warning that the check for a config has not been performed,
224# as linux_chkconfig* in non-legacy mode WILL return an undefined value if no 230# as linux_chkconfig* in non-legacy mode WILL return an undefined value if no
225# config is available at all. 231# config is available at all.
227 233
228linux_config_qa_check() { 234linux_config_qa_check() {
229 local f="$1" 235 local f="$1"
230 if [ -z "${_LINUX_CONFIG_EXISTS_DONE}" ]; then 236 if [ -z "${_LINUX_CONFIG_EXISTS_DONE}" ]; then
231 ewarn "QA: You called $f before any linux_config_exists!" 237 ewarn "QA: You called $f before any linux_config_exists!"
232 ewarn "QA: The return value of $f will NOT gaurenteed later!" 238 ewarn "QA: The return value of $f will NOT guaranteed later!"
233 fi 239 fi
234} 240}
235 241
236# @FUNCTION: linux_config_src_exists 242# @FUNCTION: linux_config_src_exists
237# @RETURN: true or false 243# @RETURN: true or false
359# kernel_is 2 6 returns true 365# kernel_is 2 6 returns true
360# kernel_is 2 6 8 returns false 366# kernel_is 2 6 8 returns false
361# kernel_is 2 6 9 returns true 367# kernel_is 2 6 9 returns true
362# @CODE 368# @CODE
363 369
364# got the jist yet? 370# Note: duplicated in kernel-2.eclass
365
366kernel_is() { 371kernel_is() {
367 # if we haven't determined the version yet, we need to. 372 # if we haven't determined the version yet, we need to.
368 linux-info_get_any_version 373 linux-info_get_any_version
369 374
370 local operator testagainst value x=0 y=0 z=0 375 # Now we can continue
376 local operator test value
371 377
372 case ${1} in 378 case ${1#-} in
373 -lt|lt) operator="-lt"; shift;; 379 lt) operator="-lt"; shift;;
374 -gt|gt) operator="-gt"; shift;; 380 gt) operator="-gt"; shift;;
375 -le|le) operator="-le"; shift;; 381 le) operator="-le"; shift;;
376 -ge|ge) operator="-ge"; shift;; 382 ge) operator="-ge"; shift;;
377 -eq|eq) operator="-eq"; shift;; 383 eq) operator="-eq"; shift;;
378 *) operator="-eq";; 384 *) operator="-eq";;
379 esac 385 esac
380
381 for x in ${@}; do
382 for((y=0; y<$((3 - ${#x})); y++)); do value="${value}0"; done
383 value="${value}${x}"
384 z=$((${z} + 1))
385
386 case ${z} in
387 1) for((y=0; y<$((3 - ${#KV_MAJOR})); y++)); do testagainst="${testagainst}0"; done;
388 testagainst="${testagainst}${KV_MAJOR}";;
389 2) for((y=0; y<$((3 - ${#KV_MINOR})); y++)); do testagainst="${testagainst}0"; done;
390 testagainst="${testagainst}${KV_MINOR}";;
391 3) for((y=0; y<$((3 - ${#KV_PATCH})); y++)); do testagainst="${testagainst}0"; done;
392 testagainst="${testagainst}${KV_PATCH}";;
393 *) die "Error in kernel-2_kernel_is(): Too many parameters.";; 386 [[ $# -gt 3 ]] && die "Error in kernel-2_kernel_is(): too many parameters"
394 esac
395 done
396 387
397 [ "${testagainst}" ${operator} "${value}" ] && return 0 || return 1 388 : $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH ))
389 : $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + ${3:-${KV_PATCH}} ))
390 [ ${test} ${operator} ${value} ]
398} 391}
399 392
400get_localversion() { 393get_localversion() {
401 local lv_list i x 394 local lv_list i x
402 395
439# 432#
440# The KV_DIR is set using the KERNEL_DIR env var, the KV_DIR_OUT is set using a valid 433# The KV_DIR is set using the KERNEL_DIR env var, the KV_DIR_OUT is set using a valid
441# KBUILD_OUTPUT (in a decreasing priority list, we look for the env var, makefile var or the 434# KBUILD_OUTPUT (in a decreasing priority list, we look for the env var, makefile var or the
442# symlink /lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build). 435# symlink /lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build).
443get_version() { 436get_version() {
444 local kbuild_output mkfunc 437 local kbuild_output mkfunc tmplocal
445 438
446 # no need to execute this twice assuming KV_FULL is populated. 439 # no need to execute this twice assuming KV_FULL is populated.
447 # we can force by unsetting KV_FULL 440 # we can force by unsetting KV_FULL
448 [ -n "${KV_FULL}" ] && return 0 441 [ -n "${KV_FULL}" ] && return 0
449 442
495 # do we pass KBUILD_OUTPUT on the CLI? 488 # do we pass KBUILD_OUTPUT on the CLI?
496 OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}" 489 OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
497 490
498 # keep track of it 491 # keep track of it
499 KERNEL_MAKEFILE="${KV_DIR}/Makefile" 492 KERNEL_MAKEFILE="${KV_DIR}/Makefile"
500 493
501 # Decide the function used to extract makefile variables. 494 # Decide the function used to extract makefile variables.
502 mkfunc="$(get_makefile_extract_function "${KERNEL_MAKEFILE}")" 495 mkfunc="$(get_makefile_extract_function "${KERNEL_MAKEFILE}")"
503 496
504 # And if we didn't pass it, we can take a nosey in the Makefile 497 # And if we didn't pass it, we can take a nosey in the Makefile
505 kbuild_output="$(${mkfunc} KBUILD_OUTPUT ${KERNEL_MAKEFILE})" 498 kbuild_output="$(${mkfunc} KBUILD_OUTPUT ${KERNEL_MAKEFILE})"
533 [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}" 526 [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
534 if [ -n "${KV_OUT_DIR}" ]; 527 if [ -n "${KV_OUT_DIR}" ];
535 then 528 then
536 qeinfo "Found kernel object directory:" 529 qeinfo "Found kernel object directory:"
537 qeinfo " ${KV_OUT_DIR}" 530 qeinfo " ${KV_OUT_DIR}"
538
539 KV_LOCAL="$(get_localversion ${KV_OUT_DIR})"
540 fi 531 fi
541 # and if we STILL have not got it, then we better just set it to KV_DIR 532 # and if we STILL have not got it, then we better just set it to KV_DIR
542 KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}" 533 KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
543 534
544 KV_LOCAL="${KV_LOCAL}$(get_localversion ${KV_DIR})" 535 # Grab the kernel release from the output directory.
545 if linux_config_src_exists; then 536 # TODO: we MUST detect kernel.release being out of date, and 'return 1' from
546 KV_LOCAL="${KV_LOCAL}$(linux_chkconfig_string LOCALVERSION)" 537 # this function.
547 KV_LOCAL="${KV_LOCAL//\"/}" 538 if [ -s "${KV_OUT_DIR}"/include/config/kernel.release ]; then
539 KV_LOCAL=$(<"${KV_OUT_DIR}"/include/config/kernel.release)
540 elif [ -s "${KV_OUT_DIR}"/.kernelrelease ]; then
541 KV_LOCAL=$(<"${KV_OUT_DIR}"/.kernelrelease)
542 else
543 KV_LOCAL=
544 fi
548 545
549 # For things like git that can append extra stuff: 546 # KV_LOCAL currently contains the full release; discard the first bits.
550 [ -e ${KV_DIR}/scripts/setlocalversion ] && 547 tmplocal=${KV_LOCAL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}}
551 linux_chkconfig_builtin LOCALVERSION_AUTO && 548
552 KV_LOCAL="${KV_LOCAL}$(sh ${KV_DIR}/scripts/setlocalversion ${KV_DIR})" 549 # If the updated local version was not changed, the tree is not prepared.
550 # Clear out KV_LOCAL in that case.
551 # TODO: this does not detect a change in the localversion part between
552 # kernel.release and the value that would be generated.
553 if [ "$KV_LOCAL" = "$tmplocal" ]; then
554 KV_LOCAL=
555 else
556 KV_LOCAL=$tmplocal
553 fi 557 fi
554 558
555 # And we should set KV_FULL to the full expanded version 559 # And we should set KV_FULL to the full expanded version
556 KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}" 560 KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
557 561
566# It gets the version of the current running kernel and the result is the same as get_version() if the 570# It gets the version of the current running kernel and the result is the same as get_version() if the
567# function can find the sources. 571# function can find the sources.
568get_running_version() { 572get_running_version() {
569 KV_FULL=$(uname -r) 573 KV_FULL=$(uname -r)
570 574
575 if [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile && -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
576 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
577 KBUILD_OUTPUT=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
578 unset KV_FULL
579 get_version
580 return $?
571 if [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile ]]; then 581 elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile ]]; then
572 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source) 582 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
573 unset KV_FULL 583 unset KV_FULL
574 get_version 584 get_version
575 return $? 585 return $?
576 elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then 586 elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
579 get_version 589 get_version
580 return $? 590 return $?
581 else 591 else
582 KV_MAJOR=$(get_version_component_range 1 ${KV_FULL}) 592 KV_MAJOR=$(get_version_component_range 1 ${KV_FULL})
583 KV_MINOR=$(get_version_component_range 2 ${KV_FULL}) 593 KV_MINOR=$(get_version_component_range 2 ${KV_FULL})
584 KV_PATCH=$(get_version_component_range 3- ${KV_FULL}) 594 KV_PATCH=$(get_version_component_range 3 ${KV_FULL})
585 KV_PATCH=${KV_PATCH//-*} 595 KV_PATCH=${KV_PATCH//-*}
586 [[ -n ${KV_FULL#*-} ]] && [[ -n ${KV_FULL//${KV_FULL#*-}} ]] \ 596 KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}}"
587 && KV_EXTRA="-${KV_FULL#*-}"
588 fi 597 fi
589 return 0 598 return 0
590} 599}
591 600
592# This next function is named with the eclass prefix to avoid conflicts with 601# This next function is named with the eclass prefix to avoid conflicts with
614check_kernel_built() { 623check_kernel_built() {
615 # if we haven't determined the version yet, we need to 624 # if we haven't determined the version yet, we need to
616 require_configured_kernel 625 require_configured_kernel
617 get_version 626 get_version
618 627
628 local versionh_path
629 if kernel_is -ge 3 7; then
630 versionh_path="include/generated/uapi/linux/version.h"
631 else
632 versionh_path="include/linux/version.h"
633 fi
634
619 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ] 635 if [ ! -f "${KV_OUT_DIR}/${versionh_path}" ]
620 then 636 then
621 eerror "These sources have not yet been prepared." 637 eerror "These sources have not yet been prepared."
622 eerror "We cannot build against an unprepared tree." 638 eerror "We cannot build against an unprepared tree."
623 eerror "To resolve this, please type the following:" 639 eerror "To resolve this, please type the following:"
624 eerror 640 eerror

Legend:
Removed from v.1.83  
changed lines
  Added in v.1.93

  ViewVC Help
Powered by ViewVC 1.1.20