/[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.100
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.100 2013/02/10 07:53:31 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
103 108
104# And to ensure all the weirdness with crosscompile 109# And to ensure all the weirdness with crosscompile
105inherit toolchain-funcs versionator 110inherit toolchain-funcs versionator
106 111
107EXPORT_FUNCTIONS pkg_setup 112EXPORT_FUNCTIONS pkg_setup
108
109DEPEND=""
110RDEPEND=""
111 113
112# Overwritable environment Var's 114# Overwritable environment Var's
113# --------------------------------------- 115# ---------------------------------------
114KERNEL_DIR="${KERNEL_DIR:-${ROOT}usr/src/linux}" 116KERNEL_DIR="${KERNEL_DIR:-${ROOT}usr/src/linux}"
115 117
160# @DESCRIPTION: 162# @DESCRIPTION:
161# It detects the value of the variable defined in the file configfile. This is 163# 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. 164# done by including the configfile, and printing the variable with Make.
163# It WILL break if your makefile has missing dependencies! 165# It WILL break if your makefile has missing dependencies!
164getfilevar() { 166getfilevar() {
165local ERROR basefname basedname myARCH="${ARCH}" 167 local ERROR basefname basedname myARCH="${ARCH}"
166 ERROR=0 168 ERROR=0
167 169
168 [ -z "${1}" ] && ERROR=1 170 [ -z "${1}" ] && ERROR=1
169 [ ! -f "${2}" ] && ERROR=1 171 [ ! -f "${2}" ] && ERROR=1
170 172
176 else 178 else
177 basefname="$(basename ${2})" 179 basefname="$(basename ${2})"
178 basedname="$(dirname ${2})" 180 basedname="$(dirname ${2})"
179 unset ARCH 181 unset ARCH
180 182
183 # We use nonfatal because we want the caller to take care of things #373151
184 [[ ${EAPI:-0} == [0123] ]] && nonfatal() { "$@"; }
181 echo -e "e:\\n\\t@echo \$(${1})\\ninclude ${basefname}" | \ 185 echo -e "e:\\n\\t@echo \$(${1})\\ninclude ${basefname}" | \
182 make -C "${basedname}" M="${S}" ${BUILD_FIXES} -s -f - 2>/dev/null 186 nonfatal emake -C "${basedname}" M="${S}" ${BUILD_FIXES} -s -f - 2>/dev/null
183 187
184 ARCH=${myARCH} 188 ARCH=${myARCH}
185 fi 189 fi
186} 190}
187 191
191# @DESCRIPTION: 195# @DESCRIPTION:
192# It detects the value of the variable defined in the file configfile. 196# 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, 197# 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. 198# you will run into problems. See getfilevar for those cases.
195getfilevar_noexec() { 199getfilevar_noexec() {
196 local ERROR basefname basedname mycat myARCH="${ARCH}" 200 local ERROR basefname basedname mycat myARCH="${ARCH}"
197 ERROR=0 201 ERROR=0
198 mycat='cat' 202 mycat='cat'
199 203
200 [ -z "${1}" ] && ERROR=1 204 [ -z "${1}" ] && ERROR=1
201 [ ! -f "${2}" ] && ERROR=1 205 [ ! -f "${2}" ] && ERROR=1
215 p 219 p
216 }" 220 }"
217 fi 221 fi
218} 222}
219 223
220# @PRIVATE-VARIABLE: _LINUX_CONFIG_EXISTS_DONE 224# @ECLASS-VARIABLE: _LINUX_CONFIG_EXISTS_DONE
225# @INTERNAL
221# @DESCRIPTION: 226# @DESCRIPTION:
222# This is only set if one of the linux_config_*exists functions has been called. 227# 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, 228# 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 229# as linux_chkconfig* in non-legacy mode WILL return an undefined value if no
225# config is available at all. 230# config is available at all.
237# @RETURN: true or false 242# @RETURN: true or false
238# @DESCRIPTION: 243# @DESCRIPTION:
239# It returns true if .config exists in a build directory otherwise false 244# It returns true if .config exists in a build directory otherwise false
240linux_config_src_exists() { 245linux_config_src_exists() {
241 export _LINUX_CONFIG_EXISTS_DONE=1 246 export _LINUX_CONFIG_EXISTS_DONE=1
242 [ -s "${KV_OUT_DIR}/.config" ] 247 [[ -n ${KV_OUT_DIR} && -s ${KV_OUT_DIR}/.config ]]
243} 248}
244 249
245# @FUNCTION: linux_config_bin_exists 250# @FUNCTION: linux_config_bin_exists
246# @RETURN: true or false 251# @RETURN: true or false
247# @DESCRIPTION: 252# @DESCRIPTION:
248# It returns true if .config exists in /proc, otherwise false 253# It returns true if .config exists in /proc, otherwise false
249linux_config_bin_exists() { 254linux_config_bin_exists() {
250 export _LINUX_CONFIG_EXISTS_DONE=1 255 export _LINUX_CONFIG_EXISTS_DONE=1
251 [ -s "/proc/config.gz" ] 256 [[ -s /proc/config.gz ]]
252} 257}
253 258
254# @FUNCTION: linux_config_exists 259# @FUNCTION: linux_config_exists
255# @RETURN: true or false 260# @RETURN: true or false
256# @DESCRIPTION: 261# @DESCRIPTION:
258# 263#
259# This function MUST be checked before using any of the linux_chkconfig_* 264# This function MUST be checked before using any of the linux_chkconfig_*
260# functions. 265# functions.
261linux_config_exists() { 266linux_config_exists() {
262 linux_config_src_exists || linux_config_bin_exists 267 linux_config_src_exists || linux_config_bin_exists
268}
269
270# @FUNCTION: linux_config_path
271# @DESCRIPTION:
272# Echo the name of the config file to use. If none are found,
273# then return false.
274linux_config_path() {
275 if linux_config_src_exists; then
276 echo "${KV_OUT_DIR}/.config"
277 elif linux_config_bin_exists; then
278 echo "/proc/config.gz"
279 else
280 return 1
281 fi
263} 282}
264 283
265# @FUNCTION: require_configured_kernel 284# @FUNCTION: require_configured_kernel
266# @DESCRIPTION: 285# @DESCRIPTION:
267# This function verifies that the current kernel is configured (it checks against the existence of .config) 286# This function verifies that the current kernel is configured (it checks against the existence of .config)
283# It checks that CONFIG_<option>=y or CONFIG_<option>=m is present in the current kernel .config 302# 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 303# If linux_config_exists returns false, the results of this are UNDEFINED. You
285# MUST call linux_config_exists first. 304# MUST call linux_config_exists first.
286linux_chkconfig_present() { 305linux_chkconfig_present() {
287 linux_config_qa_check linux_chkconfig_present 306 linux_config_qa_check linux_chkconfig_present
288 local RESULT 307 [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == [my] ]]
289 local config
290 config="${KV_OUT_DIR}/.config"
291 [ ! -f "${config}" ] && config="/proc/config.gz"
292 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
293 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
294} 308}
295 309
296# @FUNCTION: linux_chkconfig_module 310# @FUNCTION: linux_chkconfig_module
297# @USAGE: option 311# @USAGE: option
298# @RETURN: true or false 312# @RETURN: true or false
300# It checks that CONFIG_<option>=m is present in the current kernel .config 314# 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 315# If linux_config_exists returns false, the results of this are UNDEFINED. You
302# MUST call linux_config_exists first. 316# MUST call linux_config_exists first.
303linux_chkconfig_module() { 317linux_chkconfig_module() {
304 linux_config_qa_check linux_chkconfig_module 318 linux_config_qa_check linux_chkconfig_module
305 local RESULT 319 [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == m ]]
306 local config
307 config="${KV_OUT_DIR}/.config"
308 [ ! -f "${config}" ] && config="/proc/config.gz"
309 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
310 [ "${RESULT}" = "m" ] && return 0 || return 1
311} 320}
312 321
313# @FUNCTION: linux_chkconfig_builtin 322# @FUNCTION: linux_chkconfig_builtin
314# @USAGE: option 323# @USAGE: option
315# @RETURN: true or false 324# @RETURN: true or false
317# It checks that CONFIG_<option>=y is present in the current kernel .config 326# 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 327# If linux_config_exists returns false, the results of this are UNDEFINED. You
319# MUST call linux_config_exists first. 328# MUST call linux_config_exists first.
320linux_chkconfig_builtin() { 329linux_chkconfig_builtin() {
321 linux_config_qa_check linux_chkconfig_builtin 330 linux_config_qa_check linux_chkconfig_builtin
322 local RESULT 331 [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == y ]]
323 local config
324 config="${KV_OUT_DIR}/.config"
325 [ ! -f "${config}" ] && config="/proc/config.gz"
326 RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
327 [ "${RESULT}" = "y" ] && return 0 || return 1
328} 332}
329 333
330# @FUNCTION: linux_chkconfig_string 334# @FUNCTION: linux_chkconfig_string
331# @USAGE: option 335# @USAGE: option
332# @RETURN: CONFIG_<option> 336# @RETURN: CONFIG_<option>
334# It prints the CONFIG_<option> value of the current kernel .config (it requires a configured kernel). 338# It prints the CONFIG_<option> value of the current kernel .config (it requires a configured kernel).
335# If linux_config_exists returns false, the results of this are UNDEFINED. You 339# If linux_config_exists returns false, the results of this are UNDEFINED. You
336# MUST call linux_config_exists first. 340# MUST call linux_config_exists first.
337linux_chkconfig_string() { 341linux_chkconfig_string() {
338 linux_config_qa_check linux_chkconfig_string 342 linux_config_qa_check linux_chkconfig_string
339 local config
340 config="${KV_OUT_DIR}/.config"
341 [ ! -f "${config}" ] && config="/proc/config.gz"
342 getfilevar_noexec "CONFIG_${1}" "${config}" 343 getfilevar_noexec "CONFIG_$1" "$(linux_config_path)"
343} 344}
344 345
345# Versioning Functions 346# Versioning Functions
346# --------------------------------------- 347# ---------------------------------------
347 348
359# kernel_is 2 6 returns true 360# kernel_is 2 6 returns true
360# kernel_is 2 6 8 returns false 361# kernel_is 2 6 8 returns false
361# kernel_is 2 6 9 returns true 362# kernel_is 2 6 9 returns true
362# @CODE 363# @CODE
363 364
364# got the jist yet? 365# Note: duplicated in kernel-2.eclass
365
366kernel_is() { 366kernel_is() {
367 # if we haven't determined the version yet, we need to. 367 # if we haven't determined the version yet, we need to.
368 linux-info_get_any_version 368 linux-info_get_any_version
369 369
370 local operator testagainst value x=0 y=0 z=0 370 # Now we can continue
371 local operator test value
371 372
372 case ${1} in 373 case ${1#-} in
373 -lt|lt) operator="-lt"; shift;; 374 lt) operator="-lt"; shift;;
374 -gt|gt) operator="-gt"; shift;; 375 gt) operator="-gt"; shift;;
375 -le|le) operator="-le"; shift;; 376 le) operator="-le"; shift;;
376 -ge|ge) operator="-ge"; shift;; 377 ge) operator="-ge"; shift;;
377 -eq|eq) operator="-eq"; shift;; 378 eq) operator="-eq"; shift;;
378 *) operator="-eq";; 379 *) operator="-eq";;
379 esac 380 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.";; 381 [[ $# -gt 3 ]] && die "Error in kernel-2_kernel_is(): too many parameters"
394 esac
395 done
396 382
397 [ "${testagainst}" ${operator} "${value}" ] && return 0 || return 1 383 : $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH ))
384 : $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + ${3:-${KV_PATCH}} ))
385 [ ${test} ${operator} ${value} ]
398} 386}
399 387
400get_localversion() { 388get_localversion() {
401 local lv_list i x 389 local lv_list i x
402 390
472 fi 460 fi
473 fi 461 fi
474 return 1 462 return 1
475 fi 463 fi
476 464
465 # See if the kernel dir is actually an output dir. #454294
466 if [ -z "${KBUILD_OUTPUT}" -a -L "${KERNEL_DIR}/source" ]; then
467 KBUILD_OUTPUT=${KERNEL_DIR}
468 KERNEL_DIR=$(readlink -f "${KERNEL_DIR}/source")
469 KV_DIR=${KERNEL_DIR}
470 fi
471
477 if [ -z "${get_version_warning_done}" ]; then 472 if [ -z "${get_version_warning_done}" ]; then
478 qeinfo "Found kernel source directory:" 473 qeinfo "Found kernel source directory:"
479 qeinfo " ${KV_DIR}" 474 qeinfo " ${KV_DIR}"
480 fi 475 fi
481 476
491 486
492 # OK so now we know our sources directory, but they might be using 487 # OK so now we know our sources directory, but they might be using
493 # KBUILD_OUTPUT, and we need this for .config and localversions-* 488 # KBUILD_OUTPUT, and we need this for .config and localversions-*
494 # so we better find it eh? 489 # so we better find it eh?
495 # do we pass KBUILD_OUTPUT on the CLI? 490 # do we pass KBUILD_OUTPUT on the CLI?
496 OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}" 491 local OUTPUT_DIR=${KBUILD_OUTPUT}
497 492
498 # keep track of it 493 # keep track of it
499 KERNEL_MAKEFILE="${KV_DIR}/Makefile" 494 KERNEL_MAKEFILE="${KV_DIR}/Makefile"
500 495
501 # Decide the function used to extract makefile variables. 496 # Decide the function used to extract makefile variables.
594 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build) 589 KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
595 unset KV_FULL 590 unset KV_FULL
596 get_version 591 get_version
597 return $? 592 return $?
598 else 593 else
594 # This handles a variety of weird kernel versions. Make sure to update
595 # tests/linux-info:get_running_version.sh if you want to change this.
596 local kv_full=${KV_FULL//[-+_]*}
599 KV_MAJOR=$(get_version_component_range 1 ${KV_FULL}) 597 KV_MAJOR=$(get_version_component_range 1 ${kv_full})
600 KV_MINOR=$(get_version_component_range 2 ${KV_FULL}) 598 KV_MINOR=$(get_version_component_range 2 ${kv_full})
601 KV_PATCH=$(get_version_component_range 3 ${KV_FULL}) 599 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}}" 600 KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}${KV_PATCH:+.${KV_PATCH}}}"
601 : ${KV_PATCH:=0}
604 fi 602 fi
605 return 0 603 return 0
606} 604}
607 605
608# This next function is named with the eclass prefix to avoid conflicts with 606# This next function is named with the eclass prefix to avoid conflicts with
630check_kernel_built() { 628check_kernel_built() {
631 # if we haven't determined the version yet, we need to 629 # if we haven't determined the version yet, we need to
632 require_configured_kernel 630 require_configured_kernel
633 get_version 631 get_version
634 632
633 local versionh_path
634 if kernel_is -ge 3 7; then
635 versionh_path="include/generated/uapi/linux/version.h"
636 else
637 versionh_path="include/linux/version.h"
638 fi
639
635 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ] 640 if [ ! -f "${KV_OUT_DIR}/${versionh_path}" ]
636 then 641 then
637 eerror "These sources have not yet been prepared." 642 eerror "These sources have not yet been prepared."
638 eerror "We cannot build against an unprepared tree." 643 eerror "We cannot build against an unprepared tree."
639 eerror "To resolve this, please type the following:" 644 eerror "To resolve this, please type the following:"
640 eerror 645 eerror
653check_modules_supported() { 658check_modules_supported() {
654 # if we haven't determined the version yet, we need too. 659 # if we haven't determined the version yet, we need too.
655 require_configured_kernel 660 require_configured_kernel
656 get_version 661 get_version
657 662
658 if ! linux_chkconfig_builtin "MODULES" 663 if ! linux_chkconfig_builtin "MODULES"; then
659 then
660 eerror "These sources do not support loading external modules." 664 eerror "These sources do not support loading external modules."
661 eerror "to be able to use this module please enable \"Loadable modules support\"" 665 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." 666 eerror "in your kernel, recompile and then try merging this module again."
663 die "No support for external modules in ${KV_FULL} config" 667 die "No support for external modules in ${KV_FULL} config"
664 fi 668 fi
667# @FUNCTION: check_extra_config 671# @FUNCTION: check_extra_config
668# @DESCRIPTION: 672# @DESCRIPTION:
669# It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e. 673# 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. 674# the prefix ~ is not used) doesn't satisfy the directive.
671check_extra_config() { 675check_extra_config() {
672 local config negate die error reworkmodulenames 676 local config negate die error reworkmodulenames
673 local soft_errors_count=0 hard_errors_count=0 config_required=0 677 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 678 # 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 679 # after if check_extra_config is called AND other direct calls are done
676 # later. 680 # later.
677 local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}" 681 local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}"
678 682
679 # if we haven't determined the version yet, we need to 683 # if we haven't determined the version yet, we need to
680 linux-info_get_any_version 684 linux-info_get_any_version
681 685
682 # Determine if we really need a .config. The only time when we don't need 686 # 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 "~". 687 # one is when all of the CONFIG_CHECK options are prefixed with "~".
684 for config in ${CONFIG_CHECK} 688 for config in ${CONFIG_CHECK}; do
685 do
686 if [[ "${config:0:1}" != "~" ]]; then 689 if [[ "${config:0:1}" != "~" ]]; then
687 config_required=1 690 config_required=1
688 break 691 break
689 fi 692 fi
690 done 693 done

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

  ViewVC Help
Powered by ViewVC 1.1.20