/[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.89 Revision 1.96
1# Copyright 1999-2006 Gentoo Foundation 1# Copyright 1999-2013 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.89 2011/08/18 14:58:57 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.96 2013/01/24 20:47:23 vapier 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
160# @DESCRIPTION: 165# @DESCRIPTION:
161# It detects the value of the variable defined in the file configfile. This is 166# It detects the value of the variable defined in the file configfile. This is
162# done by including the configfile, and printing the variable with Make. 167# done by including the configfile, and printing the variable with Make.
163# It WILL break if your makefile has missing dependencies! 168# It WILL break if your makefile has missing dependencies!
164getfilevar() { 169getfilevar() {
165local ERROR basefname basedname myARCH="${ARCH}" 170 local ERROR basefname basedname myARCH="${ARCH}"
166 ERROR=0 171 ERROR=0
167 172
168 [ -z "${1}" ] && ERROR=1 173 [ -z "${1}" ] && ERROR=1
169 [ ! -f "${2}" ] && ERROR=1 174 [ ! -f "${2}" ] && ERROR=1
170 175
191# @DESCRIPTION: 196# @DESCRIPTION:
192# It detects the value of the variable defined in the file configfile. 197# It detects the value of the variable defined in the file configfile.
193# This is done with sed matching an expression only. If the variable is defined, 198# This is done with sed matching an expression only. If the variable is defined,
194# you will run into problems. See getfilevar for those cases. 199# you will run into problems. See getfilevar for those cases.
195getfilevar_noexec() { 200getfilevar_noexec() {
196 local ERROR basefname basedname mycat myARCH="${ARCH}" 201 local ERROR basefname basedname mycat myARCH="${ARCH}"
197 ERROR=0 202 ERROR=0
198 mycat='cat' 203 mycat='cat'
199 204
200 [ -z "${1}" ] && ERROR=1 205 [ -z "${1}" ] && ERROR=1
201 [ ! -f "${2}" ] && ERROR=1 206 [ ! -f "${2}" ] && ERROR=1
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.
283# It checks that CONFIG_<option>=y or CONFIG_<option>=m is present in the current kernel .config 289# It checks that CONFIG_<option>=y or CONFIG_<option>=m is present in the current kernel .config
284# If linux_config_exists returns false, the results of this are UNDEFINED. You 290# If linux_config_exists returns false, the results of this are UNDEFINED. You
285# MUST call linux_config_exists first. 291# MUST call linux_config_exists first.
286linux_chkconfig_present() { 292linux_chkconfig_present() {
287 linux_config_qa_check linux_chkconfig_present 293 linux_config_qa_check linux_chkconfig_present
288 local RESULT
289 local config 294 local RESULT config
290 config="${KV_OUT_DIR}/.config" 295 config="${KV_OUT_DIR}/.config"
291 [ ! -f "${config}" ] && config="/proc/config.gz" 296 [ ! -f "${config}" ] && config="/proc/config.gz"
292 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" 297 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
293 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1 298 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
294} 299}
300# It checks that CONFIG_<option>=m is present in the current kernel .config 305# It checks that CONFIG_<option>=m is present in the current kernel .config
301# If linux_config_exists returns false, the results of this are UNDEFINED. You 306# If linux_config_exists returns false, the results of this are UNDEFINED. You
302# MUST call linux_config_exists first. 307# MUST call linux_config_exists first.
303linux_chkconfig_module() { 308linux_chkconfig_module() {
304 linux_config_qa_check linux_chkconfig_module 309 linux_config_qa_check linux_chkconfig_module
305 local RESULT
306 local config 310 local RESULT config
307 config="${KV_OUT_DIR}/.config" 311 config="${KV_OUT_DIR}/.config"
308 [ ! -f "${config}" ] && config="/proc/config.gz" 312 [ ! -f "${config}" ] && config="/proc/config.gz"
309 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" 313 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
310 [ "${RESULT}" = "m" ] && return 0 || return 1 314 [ "${RESULT}" = "m" ] && return 0 || return 1
311} 315}
317# It checks that CONFIG_<option>=y is present in the current kernel .config 321# It checks that CONFIG_<option>=y is present in the current kernel .config
318# If linux_config_exists returns false, the results of this are UNDEFINED. You 322# If linux_config_exists returns false, the results of this are UNDEFINED. You
319# MUST call linux_config_exists first. 323# MUST call linux_config_exists first.
320linux_chkconfig_builtin() { 324linux_chkconfig_builtin() {
321 linux_config_qa_check linux_chkconfig_builtin 325 linux_config_qa_check linux_chkconfig_builtin
322 local RESULT
323 local config 326 local RESULT config
324 config="${KV_OUT_DIR}/.config" 327 config="${KV_OUT_DIR}/.config"
325 [ ! -f "${config}" ] && config="/proc/config.gz" 328 [ ! -f "${config}" ] && config="/proc/config.gz"
326 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" 329 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
327 [ "${RESULT}" = "y" ] && return 0 || return 1 330 [ "${RESULT}" = "y" ] && return 0 || return 1
328} 331}
359# kernel_is 2 6 returns true 362# kernel_is 2 6 returns true
360# kernel_is 2 6 8 returns false 363# kernel_is 2 6 8 returns false
361# kernel_is 2 6 9 returns true 364# kernel_is 2 6 9 returns true
362# @CODE 365# @CODE
363 366
364# got the jist yet? 367# Note: duplicated in kernel-2.eclass
365
366kernel_is() { 368kernel_is() {
367 # if we haven't determined the version yet, we need to. 369 # if we haven't determined the version yet, we need to.
368 linux-info_get_any_version 370 linux-info_get_any_version
369 371
370 local operator testagainst value x=0 y=0 z=0 372 # Now we can continue
373 local operator test value
371 374
372 case ${1} in 375 case ${1#-} in
373 -lt|lt) operator="-lt"; shift;; 376 lt) operator="-lt"; shift;;
374 -gt|gt) operator="-gt"; shift;; 377 gt) operator="-gt"; shift;;
375 -le|le) operator="-le"; shift;; 378 le) operator="-le"; shift;;
376 -ge|ge) operator="-ge"; shift;; 379 ge) operator="-ge"; shift;;
377 -eq|eq) operator="-eq"; shift;; 380 eq) operator="-eq"; shift;;
378 *) operator="-eq";; 381 *) operator="-eq";;
379 esac 382 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.";; 383 [[ $# -gt 3 ]] && die "Error in kernel-2_kernel_is(): too many parameters"
394 esac
395 done
396 384
397 [ "${testagainst}" ${operator} "${value}" ] && return 0 || return 1 385 : $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH ))
386 : $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + ${3:-${KV_PATCH}} ))
387 [ ${test} ${operator} ${value} ]
398} 388}
399 389
400get_localversion() { 390get_localversion() {
401 local lv_list i x 391 local lv_list i x
402 392
594 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build) 584 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
595 unset KV_FULL 585 unset KV_FULL
596 get_version 586 get_version
597 return $? 587 return $?
598 else 588 else
589 # This handles a variety of weird kernel versions. Make sure to update
590 # tests/linux-info:get_running_version.sh if you want to change this.
591 local kv_full=${KV_FULL//[-+_]*}
599 KV_MAJOR=$(get_version_component_range 1 ${KV_FULL}) 592 KV_MAJOR=$(get_version_component_range 1 ${kv_full})
600 KV_MINOR=$(get_version_component_range 2 ${KV_FULL}) 593 KV_MINOR=$(get_version_component_range 2 ${kv_full})
601 KV_PATCH=$(get_version_component_range 3 ${KV_FULL}) 594 KV_PATCH=$(get_version_component_range 3 ${kv_full})
602 KV_PATCH=${KV_PATCH//-*}
603 KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}}" 595 KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}${KV_PATCH:+.${KV_PATCH}}}"
596 : ${KV_PATCH:=0}
604 fi 597 fi
605 return 0 598 return 0
606} 599}
607 600
608# 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
630check_kernel_built() { 623check_kernel_built() {
631 # if we haven't determined the version yet, we need to 624 # if we haven't determined the version yet, we need to
632 require_configured_kernel 625 require_configured_kernel
633 get_version 626 get_version
634 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
635 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ] 635 if [ ! -f "${KV_OUT_DIR}/${versionh_path}" ]
636 then 636 then
637 eerror "These sources have not yet been prepared." 637 eerror "These sources have not yet been prepared."
638 eerror "We cannot build against an unprepared tree." 638 eerror "We cannot build against an unprepared tree."
639 eerror "To resolve this, please type the following:" 639 eerror "To resolve this, please type the following:"
640 eerror 640 eerror
653check_modules_supported() { 653check_modules_supported() {
654 # if we haven't determined the version yet, we need too. 654 # if we haven't determined the version yet, we need too.
655 require_configured_kernel 655 require_configured_kernel
656 get_version 656 get_version
657 657
658 if ! linux_chkconfig_builtin "MODULES" 658 if ! linux_chkconfig_builtin "MODULES"; then
659 then
660 eerror "These sources do not support loading external modules." 659 eerror "These sources do not support loading external modules."
661 eerror "to be able to use this module please enable \"Loadable modules support\"" 660 eerror "to be able to use this module please enable \"Loadable modules support\""
662 eerror "in your kernel, recompile and then try merging this module again." 661 eerror "in your kernel, recompile and then try merging this module again."
663 die "No support for external modules in ${KV_FULL} config" 662 die "No support for external modules in ${KV_FULL} config"
664 fi 663 fi
667# @FUNCTION: check_extra_config 666# @FUNCTION: check_extra_config
668# @DESCRIPTION: 667# @DESCRIPTION:
669# It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e. 668# It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e.
670# the prefix ~ is not used) doesn't satisfy the directive. 669# the prefix ~ is not used) doesn't satisfy the directive.
671check_extra_config() { 670check_extra_config() {
672 local config negate die error reworkmodulenames 671 local config negate die error reworkmodulenames
673 local soft_errors_count=0 hard_errors_count=0 config_required=0 672 local soft_errors_count=0 hard_errors_count=0 config_required=0
674 # store the value of the QA check, because otherwise we won't catch usages 673 # store the value of the QA check, because otherwise we won't catch usages
675 # after if check_extra_config is called AND other direct calls are done 674 # after if check_extra_config is called AND other direct calls are done
676 # later. 675 # later.
677 local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}" 676 local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}"
678 677
679 # if we haven't determined the version yet, we need to 678 # if we haven't determined the version yet, we need to
680 linux-info_get_any_version 679 linux-info_get_any_version
681 680
682 # Determine if we really need a .config. The only time when we don't need 681 # Determine if we really need a .config. The only time when we don't need
683 # one is when all of the CONFIG_CHECK options are prefixed with "~". 682 # one is when all of the CONFIG_CHECK options are prefixed with "~".
684 for config in ${CONFIG_CHECK} 683 for config in ${CONFIG_CHECK}; do
685 do
686 if [[ "${config:0:1}" != "~" ]]; then 684 if [[ "${config:0:1}" != "~" ]]; then
687 config_required=1 685 config_required=1
688 break 686 break
689 fi 687 fi
690 done 688 done

Legend:
Removed from v.1.89  
changed lines
  Added in v.1.96

  ViewVC Help
Powered by ViewVC 1.1.20