| Index: eclass/linux-info.eclass
|
| diff --git a/eclass/linux-info.eclass b/eclass/linux-info.eclass
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1bc376fb7f2f75692cc64acfe68861c361328fac
|
| --- /dev/null
|
| +++ b/eclass/linux-info.eclass
|
| @@ -0,0 +1,905 @@
|
| +# Copyright 1999-2006 Gentoo Foundation
|
| +# Distributed under the terms of the GNU General Public License v2
|
| +# $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.88 2011/03/29 19:57:51 flameeyes Exp $
|
| +#
|
| +# Original author: John Mylchreest <johnm@gentoo.org>
|
| +# Maintainer: kernel-misc@gentoo.org
|
| +#
|
| +# Please direct your bugs to the current eclass maintainer :)
|
| +
|
| +# @ECLASS: linux-info.eclass
|
| +# @MAINTAINER:
|
| +# kernel-misc@gentoo.org
|
| +# @BLURB: eclass used for accessing kernel related information
|
| +# @DESCRIPTION:
|
| +# This eclass is used as a central eclass for accessing kernel
|
| +# related information for source or binary already installed.
|
| +# It is vital for linux-mod.eclass to function correctly, and is split
|
| +# out so that any ebuild behaviour "templates" are abstracted out
|
| +# using additional eclasses.
|
| +#
|
| +# "kernel config" in this file means:
|
| +# The .config of the currently installed sources is used as the first
|
| +# preference, with a fall-back to bundled config (/proc/config.gz) if available.
|
| +
|
| +# A Couple of env vars are available to effect usage of this eclass
|
| +# These are as follows:
|
| +
|
| +# @ECLASS-VARIABLE: KERNEL_DIR
|
| +# @DESCRIPTION:
|
| +# A string containing the directory of the target kernel sources. The default value is
|
| +# "/usr/src/linux"
|
| +
|
| +# @ECLASS-VARIABLE: CONFIG_CHECK
|
| +# @DESCRIPTION:
|
| +# A string containing a list of .config options to check for before
|
| +# proceeding with the install.
|
| +#
|
| +# e.g.: CONFIG_CHECK="MTRR"
|
| +#
|
| +# You can also check that an option doesn't exist by
|
| +# prepending it with an exclamation mark (!).
|
| +#
|
| +# e.g.: CONFIG_CHECK="!MTRR"
|
| +#
|
| +# To simply warn about a missing option, prepend a '~'.
|
| +# It may be combined with '!'.
|
| +#
|
| +# In general, most checks should be non-fatal. The only time fatal checks should
|
| +# be used is for building kernel modules or cases that a compile will fail
|
| +# without the option.
|
| +#
|
| +# This is to allow usage of binary kernels, and minimal systems without kernel
|
| +# sources.
|
| +
|
| +# @ECLASS-VARIABLE: ERROR_<CFG>
|
| +# @DESCRIPTION:
|
| +# A string containing the error message to display when the check against CONFIG_CHECK
|
| +# fails. <CFG> should reference the appropriate option used in CONFIG_CHECK.
|
| +#
|
| +# e.g.: ERROR_MTRR="MTRR exists in the .config but shouldn't!!"
|
| +
|
| +# @ECLASS-VARIABLE: KBUILD_OUTPUT
|
| +# @DESCRIPTION:
|
| +# A string passed on commandline, or set from the kernel makefile. It contains the directory
|
| +# which is to be used as the kernel object directory.
|
| +
|
| +# There are also a couple of variables which are set by this, and shouldn't be
|
| +# set by hand. These are as follows:
|
| +
|
| +# @ECLASS-VARIABLE: KV_FULL
|
| +# @DESCRIPTION:
|
| +# A read-only variable. It's a string containing the full kernel version. ie: 2.6.9-gentoo-johnm-r1
|
| +
|
| +# @ECLASS-VARIABLE: KV_MAJOR
|
| +# @DESCRIPTION:
|
| +# A read-only variable. It's an integer containing the kernel major version. ie: 2
|
| +
|
| +# @ECLASS-VARIABLE: KV_MINOR
|
| +# @DESCRIPTION:
|
| +# A read-only variable. It's an integer containing the kernel minor version. ie: 6
|
| +
|
| +# @ECLASS-VARIABLE: KV_PATCH
|
| +# @DESCRIPTION:
|
| +# A read-only variable. It's an integer containing the kernel patch version. ie: 9
|
| +
|
| +# @ECLASS-VARIABLE: KV_EXTRA
|
| +# @DESCRIPTION:
|
| +# A read-only variable. It's a string containing the kernel EXTRAVERSION. ie: -gentoo
|
| +
|
| +# @ECLASS-VARIABLE: KV_LOCAL
|
| +# @DESCRIPTION:
|
| +# A read-only variable. It's a string containing the kernel LOCALVERSION concatenation. ie: -johnm
|
| +
|
| +# @ECLASS-VARIABLE: KV_DIR
|
| +# @DESCRIPTION:
|
| +# A read-only variable. It's a string containing the kernel source directory, will be null if
|
| +# KERNEL_DIR is invalid.
|
| +
|
| +# @ECLASS-VARIABLE: KV_OUT_DIR
|
| +# @DESCRIPTION:
|
| +# A read-only variable. It's a string containing the kernel object directory, will be KV_DIR unless
|
| +# KBUILD_OUTPUT is used. This should be used for referencing .config.
|
| +
|
| +# And to ensure all the weirdness with crosscompile
|
| +inherit toolchain-funcs versionator
|
| +
|
| +EXPORT_FUNCTIONS pkg_setup
|
| +
|
| +DEPEND=""
|
| +RDEPEND=""
|
| +
|
| +# Overwritable environment Var's
|
| +# ---------------------------------------
|
| +KERNEL_DIR="${KERNEL_DIR:-${ROOT}usr/src/linux}"
|
| +
|
| +
|
| +# Bug fixes
|
| +# fix to bug #75034
|
| +case ${ARCH} in
|
| + ppc) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
|
| + ppc64) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
|
| +esac
|
| +
|
| +# @FUNCTION: set_arch_to_kernel
|
| +# @DESCRIPTION:
|
| +# Set the env ARCH to match what the kernel expects.
|
| +set_arch_to_kernel() { export ARCH=$(tc-arch-kernel); }
|
| +# @FUNCTION: set_arch_to_portage
|
| +# @DESCRIPTION:
|
| +# Set the env ARCH to match what portage expects.
|
| +set_arch_to_portage() { export ARCH=$(tc-arch); }
|
| +
|
| +# qeinfo "Message"
|
| +# -------------------
|
| +# qeinfo is a quiet einfo call when EBUILD_PHASE
|
| +# should not have visible output.
|
| +qout() {
|
| + local outputmsg type
|
| + type=${1}
|
| + shift
|
| + outputmsg="${@}"
|
| + case "${EBUILD_PHASE}" in
|
| + depend) unset outputmsg;;
|
| + clean) unset outputmsg;;
|
| + preinst) unset outputmsg;;
|
| + esac
|
| + [ -n "${outputmsg}" ] && ${type} "${outputmsg}"
|
| +}
|
| +
|
| +qeinfo() { qout einfo "${@}" ; }
|
| +qewarn() { qout ewarn "${@}" ; }
|
| +qeerror() { qout eerror "${@}" ; }
|
| +
|
| +# File Functions
|
| +# ---------------------------------------
|
| +
|
| +# @FUNCTION: getfilevar
|
| +# @USAGE: variable configfile
|
| +# @RETURN: the value of the variable
|
| +# @DESCRIPTION:
|
| +# It detects the value of the variable defined in the file configfile. This is
|
| +# done by including the configfile, and printing the variable with Make.
|
| +# It WILL break if your makefile has missing dependencies!
|
| +getfilevar() {
|
| +local ERROR basefname basedname myARCH="${ARCH}"
|
| + ERROR=0
|
| +
|
| + [ -z "${1}" ] && ERROR=1
|
| + [ ! -f "${2}" ] && ERROR=1
|
| +
|
| + if [ "${ERROR}" = 1 ]
|
| + then
|
| + echo -e "\n"
|
| + eerror "getfilevar requires 2 variables, with the second a valid file."
|
| + eerror " getfilevar <VARIABLE> <CONFIGFILE>"
|
| + else
|
| + basefname="$(basename ${2})"
|
| + basedname="$(dirname ${2})"
|
| + unset ARCH
|
| +
|
| + echo -e "e:\\n\\t@echo \$(${1})\\ninclude ${basefname}" | \
|
| + make -C "${basedname}" M="${S}" ${BUILD_FIXES} -s -f - 2>/dev/null
|
| +
|
| + ARCH=${myARCH}
|
| + fi
|
| +}
|
| +
|
| +# @FUNCTION: getfilevar_noexec
|
| +# @USAGE: variable configfile
|
| +# @RETURN: the value of the variable
|
| +# @DESCRIPTION:
|
| +# It detects the value of the variable defined in the file configfile.
|
| +# This is done with sed matching an expression only. If the variable is defined,
|
| +# you will run into problems. See getfilevar for those cases.
|
| +getfilevar_noexec() {
|
| + local ERROR basefname basedname mycat myARCH="${ARCH}"
|
| + ERROR=0
|
| + mycat='cat'
|
| +
|
| + [ -z "${1}" ] && ERROR=1
|
| + [ ! -f "${2}" ] && ERROR=1
|
| + [ "${2%.gz}" != "${2}" ] && mycat='zcat'
|
| +
|
| + if [ "${ERROR}" = 1 ]
|
| + then
|
| + echo -e "\n"
|
| + eerror "getfilevar_noexec requires 2 variables, with the second a valid file."
|
| + eerror " getfilevar_noexec <VARIABLE> <CONFIGFILE>"
|
| + else
|
| + ${mycat} "${2}" | \
|
| + sed -n \
|
| + -e "/^[[:space:]]*${1}[[:space:]]*:\\?=[[:space:]]*\(.*\)\$/{
|
| + s,^[^=]*[[:space:]]*=[[:space:]]*,,g ;
|
| + s,[[:space:]]*\$,,g ;
|
| + p
|
| + }"
|
| + fi
|
| +}
|
| +
|
| +# @PRIVATE-VARIABLE: _LINUX_CONFIG_EXISTS_DONE
|
| +# @DESCRIPTION:
|
| +# This is only set if one of the linux_config_*exists functions has been called.
|
| +# We use it for a QA warning that the check for a config has not been performed,
|
| +# as linux_chkconfig* in non-legacy mode WILL return an undefined value if no
|
| +# config is available at all.
|
| +_LINUX_CONFIG_EXISTS_DONE=
|
| +
|
| +linux_config_qa_check() {
|
| + local f="$1"
|
| + if [ -z "${_LINUX_CONFIG_EXISTS_DONE}" ]; then
|
| + ewarn "QA: You called $f before any linux_config_exists!"
|
| + ewarn "QA: The return value of $f will NOT guaranteed later!"
|
| + fi
|
| +}
|
| +
|
| +# @FUNCTION: linux_config_src_exists
|
| +# @RETURN: true or false
|
| +# @DESCRIPTION:
|
| +# It returns true if .config exists in a build directory otherwise false
|
| +linux_config_src_exists() {
|
| + export _LINUX_CONFIG_EXISTS_DONE=1
|
| + [ -s "${KV_OUT_DIR}/.config" ]
|
| +}
|
| +
|
| +# @FUNCTION: linux_config_bin_exists
|
| +# @RETURN: true or false
|
| +# @DESCRIPTION:
|
| +# It returns true if .config exists in /proc, otherwise false
|
| +linux_config_bin_exists() {
|
| + export _LINUX_CONFIG_EXISTS_DONE=1
|
| + [ -s "/proc/config.gz" ]
|
| +}
|
| +
|
| +# @FUNCTION: linux_config_exists
|
| +# @RETURN: true or false
|
| +# @DESCRIPTION:
|
| +# It returns true if .config exists otherwise false
|
| +#
|
| +# This function MUST be checked before using any of the linux_chkconfig_*
|
| +# functions.
|
| +linux_config_exists() {
|
| + linux_config_src_exists || linux_config_bin_exists
|
| +}
|
| +
|
| +# @FUNCTION: require_configured_kernel
|
| +# @DESCRIPTION:
|
| +# This function verifies that the current kernel is configured (it checks against the existence of .config)
|
| +# otherwise it dies.
|
| +require_configured_kernel() {
|
| + if ! linux_config_src_exists; then
|
| + qeerror "Could not find a usable .config in the kernel source directory."
|
| + qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources."
|
| + qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that"
|
| + qeerror "it points to the necessary object directory so that it might find .config."
|
| + die "Kernel not configured; no .config found in ${KV_OUT_DIR}"
|
| + fi
|
| +}
|
| +
|
| +# @FUNCTION: linux_chkconfig_present
|
| +# @USAGE: option
|
| +# @RETURN: true or false
|
| +# @DESCRIPTION:
|
| +# It checks that CONFIG_<option>=y or CONFIG_<option>=m is present in the current kernel .config
|
| +# If linux_config_exists returns false, the results of this are UNDEFINED. You
|
| +# MUST call linux_config_exists first.
|
| +linux_chkconfig_present() {
|
| + linux_config_qa_check linux_chkconfig_present
|
| + local RESULT
|
| + local config
|
| + config="${KV_OUT_DIR}/.config"
|
| + [ ! -f "${config}" ] && config="/proc/config.gz"
|
| + RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
|
| + [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
|
| +}
|
| +
|
| +# @FUNCTION: linux_chkconfig_module
|
| +# @USAGE: option
|
| +# @RETURN: true or false
|
| +# @DESCRIPTION:
|
| +# It checks that CONFIG_<option>=m is present in the current kernel .config
|
| +# If linux_config_exists returns false, the results of this are UNDEFINED. You
|
| +# MUST call linux_config_exists first.
|
| +linux_chkconfig_module() {
|
| + linux_config_qa_check linux_chkconfig_module
|
| + local RESULT
|
| + local config
|
| + config="${KV_OUT_DIR}/.config"
|
| + [ ! -f "${config}" ] && config="/proc/config.gz"
|
| + RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
|
| + [ "${RESULT}" = "m" ] && return 0 || return 1
|
| +}
|
| +
|
| +# @FUNCTION: linux_chkconfig_builtin
|
| +# @USAGE: option
|
| +# @RETURN: true or false
|
| +# @DESCRIPTION:
|
| +# It checks that CONFIG_<option>=y is present in the current kernel .config
|
| +# If linux_config_exists returns false, the results of this are UNDEFINED. You
|
| +# MUST call linux_config_exists first.
|
| +linux_chkconfig_builtin() {
|
| + linux_config_qa_check linux_chkconfig_builtin
|
| + local RESULT
|
| + local config
|
| + config="${KV_OUT_DIR}/.config"
|
| + [ ! -f "${config}" ] && config="/proc/config.gz"
|
| + RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
|
| + [ "${RESULT}" = "y" ] && return 0 || return 1
|
| +}
|
| +
|
| +# @FUNCTION: linux_chkconfig_string
|
| +# @USAGE: option
|
| +# @RETURN: CONFIG_<option>
|
| +# @DESCRIPTION:
|
| +# It prints the CONFIG_<option> value of the current kernel .config (it requires a configured kernel).
|
| +# If linux_config_exists returns false, the results of this are UNDEFINED. You
|
| +# MUST call linux_config_exists first.
|
| +linux_chkconfig_string() {
|
| + linux_config_qa_check linux_chkconfig_string
|
| + local config
|
| + config="${KV_OUT_DIR}/.config"
|
| + [ ! -f "${config}" ] && config="/proc/config.gz"
|
| + getfilevar_noexec "CONFIG_${1}" "${config}"
|
| +}
|
| +
|
| +# Versioning Functions
|
| +# ---------------------------------------
|
| +
|
| +# @FUNCTION: kernel_is
|
| +# @USAGE: [-lt -gt -le -ge -eq] major_number [minor_number patch_number]
|
| +# @RETURN: true or false
|
| +# @DESCRIPTION:
|
| +# It returns true when the current kernel version satisfies the comparison against the passed version.
|
| +# -eq is the default comparison.
|
| +#
|
| +# @CODE
|
| +# For Example where KV = 2.6.9
|
| +# kernel_is 2 4 returns false
|
| +# kernel_is 2 returns true
|
| +# kernel_is 2 6 returns true
|
| +# kernel_is 2 6 8 returns false
|
| +# kernel_is 2 6 9 returns true
|
| +# @CODE
|
| +
|
| +# got the jist yet?
|
| +
|
| +kernel_is() {
|
| + # if we haven't determined the version yet, we need to.
|
| + linux-info_get_any_version
|
| +
|
| + local operator testagainst value x=0 y=0 z=0
|
| +
|
| + case ${1} in
|
| + -lt|lt) operator="-lt"; shift;;
|
| + -gt|gt) operator="-gt"; shift;;
|
| + -le|le) operator="-le"; shift;;
|
| + -ge|ge) operator="-ge"; shift;;
|
| + -eq|eq) operator="-eq"; shift;;
|
| + *) operator="-eq";;
|
| + esac
|
| +
|
| + for x in ${@}; do
|
| + for((y=0; y<$((3 - ${#x})); y++)); do value="${value}0"; done
|
| + value="${value}${x}"
|
| + z=$((${z} + 1))
|
| +
|
| + case ${z} in
|
| + 1) for((y=0; y<$((3 - ${#KV_MAJOR})); y++)); do testagainst="${testagainst}0"; done;
|
| + testagainst="${testagainst}${KV_MAJOR}";;
|
| + 2) for((y=0; y<$((3 - ${#KV_MINOR})); y++)); do testagainst="${testagainst}0"; done;
|
| + testagainst="${testagainst}${KV_MINOR}";;
|
| + 3) for((y=0; y<$((3 - ${#KV_PATCH})); y++)); do testagainst="${testagainst}0"; done;
|
| + testagainst="${testagainst}${KV_PATCH}";;
|
| + *) die "Error in kernel-2_kernel_is(): Too many parameters.";;
|
| + esac
|
| + done
|
| +
|
| + [ "${testagainst}" ${operator} "${value}" ] && return 0 || return 1
|
| +}
|
| +
|
| +get_localversion() {
|
| + local lv_list i x
|
| +
|
| + # ignore files with ~ in it.
|
| + for i in $(ls ${1}/localversion* 2>/dev/null); do
|
| + [[ -n ${i//*~*} ]] && lv_list="${lv_list} ${i}"
|
| + done
|
| +
|
| + for i in ${lv_list}; do
|
| + x="${x}$(<${i})"
|
| + done
|
| + x=${x/ /}
|
| + echo ${x}
|
| +}
|
| +
|
| +# Check if the Makefile is valid for direct parsing.
|
| +# Check status results:
|
| +# - PASS, use 'getfilevar' to extract values
|
| +# - FAIL, use 'getfilevar_noexec' to extract values
|
| +# The check may fail if:
|
| +# - make is not present
|
| +# - corruption exists in the kernel makefile
|
| +get_makefile_extract_function() {
|
| + local a='' b='' mkfunc='getfilevar'
|
| + a="$(getfilevar VERSION ${KERNEL_MAKEFILE})"
|
| + b="$(getfilevar_noexec VERSION ${KERNEL_MAKEFILE})"
|
| + [[ "${a}" != "${b}" ]] && mkfunc='getfilevar_noexec'
|
| + echo "${mkfunc}"
|
| +}
|
| +
|
| +# internal variable, so we know to only print the warning once
|
| +get_version_warning_done=
|
| +
|
| +# @FUNCTION: get_version
|
| +# @DESCRIPTION:
|
| +# It gets the version of the kernel inside KERNEL_DIR and populates the KV_FULL variable
|
| +# (if KV_FULL is already set it does nothing).
|
| +#
|
| +# The kernel version variables (KV_MAJOR, KV_MINOR, KV_PATCH, KV_EXTRA and KV_LOCAL) are also set.
|
| +#
|
| +# The KV_DIR is set using the KERNEL_DIR env var, the KV_DIR_OUT is set using a valid
|
| +# KBUILD_OUTPUT (in a decreasing priority list, we look for the env var, makefile var or the
|
| +# symlink /lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build).
|
| +get_version() {
|
| + local kbuild_output mkfunc tmplocal
|
| +
|
| + # no need to execute this twice assuming KV_FULL is populated.
|
| + # we can force by unsetting KV_FULL
|
| + [ -n "${KV_FULL}" ] && return 0
|
| +
|
| + # if we dont know KV_FULL, then we need too.
|
| + # make sure KV_DIR isnt set since we need to work it out via KERNEL_DIR
|
| + unset KV_DIR
|
| +
|
| + # KV_DIR will contain the full path to the sources directory we should use
|
| + [ -z "${get_version_warning_done}" ] && \
|
| + qeinfo "Determining the location of the kernel source code"
|
| + [ -h "${KERNEL_DIR}" ] && KV_DIR="$(readlink -f ${KERNEL_DIR})"
|
| + [ -d "${KERNEL_DIR}" ] && KV_DIR="${KERNEL_DIR}"
|
| +
|
| + if [ -z "${KV_DIR}" ]
|
| + then
|
| + if [ -z "${get_version_warning_done}" ]; then
|
| + get_version_warning_done=1
|
| + qeerror "Unable to find kernel sources at ${KERNEL_DIR}"
|
| + #qeinfo "This package requires Linux sources."
|
| + if [ "${KERNEL_DIR}" == "/usr/src/linux" ] ; then
|
| + qeinfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "
|
| + qeinfo "(or the kernel you wish to build against)."
|
| + qeinfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"
|
| + else
|
| + qeinfo "Please ensure that the KERNEL_DIR environment variable points at full Linux sources of the kernel you wish to compile against."
|
| + fi
|
| + fi
|
| + return 1
|
| + fi
|
| +
|
| + if [ -z "${get_version_warning_done}" ]; then
|
| + qeinfo "Found kernel source directory:"
|
| + qeinfo " ${KV_DIR}"
|
| + fi
|
| +
|
| + if [ ! -s "${KV_DIR}/Makefile" ]
|
| + then
|
| + if [ -z "${get_version_warning_done}" ]; then
|
| + get_version_warning_done=1
|
| + qeerror "Could not find a Makefile in the kernel source directory."
|
| + qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
|
| + fi
|
| + return 1
|
| + fi
|
| +
|
| + # OK so now we know our sources directory, but they might be using
|
| + # KBUILD_OUTPUT, and we need this for .config and localversions-*
|
| + # so we better find it eh?
|
| + # do we pass KBUILD_OUTPUT on the CLI?
|
| + OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
|
| +
|
| + # keep track of it
|
| + KERNEL_MAKEFILE="${KV_DIR}/Makefile"
|
| +
|
| + # Decide the function used to extract makefile variables.
|
| + mkfunc="$(get_makefile_extract_function "${KERNEL_MAKEFILE}")"
|
| +
|
| + # And if we didn't pass it, we can take a nosey in the Makefile
|
| + kbuild_output="$(${mkfunc} KBUILD_OUTPUT ${KERNEL_MAKEFILE})"
|
| + OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
|
| +
|
| + # And contrary to existing functions I feel we shouldn't trust the
|
| + # directory name to find version information as this seems insane.
|
| + # so we parse ${KERNEL_MAKEFILE}
|
| + KV_MAJOR="$(${mkfunc} VERSION ${KERNEL_MAKEFILE})"
|
| + KV_MINOR="$(${mkfunc} PATCHLEVEL ${KERNEL_MAKEFILE})"
|
| + KV_PATCH="$(${mkfunc} SUBLEVEL ${KERNEL_MAKEFILE})"
|
| + KV_EXTRA="$(${mkfunc} EXTRAVERSION ${KERNEL_MAKEFILE})"
|
| +
|
| + if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
|
| + then
|
| + if [ -z "${get_version_warning_done}" ]; then
|
| + get_version_warning_done=1
|
| + qeerror "Could not detect kernel version."
|
| + qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources."
|
| + fi
|
| + return 1
|
| + fi
|
| +
|
| + # and in newer versions we can also pull LOCALVERSION if it is set.
|
| + # but before we do this, we need to find if we use a different object directory.
|
| + # This *WILL* break if the user is using localversions, but we assume it was
|
| + # caught before this if they are.
|
| + OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build}"
|
| +
|
| + [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
|
| + [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
|
| + if [ -n "${KV_OUT_DIR}" ];
|
| + then
|
| + qeinfo "Found kernel object directory:"
|
| + qeinfo " ${KV_OUT_DIR}"
|
| + fi
|
| + # and if we STILL have not got it, then we better just set it to KV_DIR
|
| + KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
|
| +
|
| + # Grab the kernel release from the output directory.
|
| + # TODO: we MUST detect kernel.release being out of date, and 'return 1' from
|
| + # this function.
|
| + if [ -s "${KV_OUT_DIR}"/include/config/kernel.release ]; then
|
| + KV_LOCAL=$(<"${KV_OUT_DIR}"/include/config/kernel.release)
|
| + elif [ -s "${KV_OUT_DIR}"/.kernelrelease ]; then
|
| + KV_LOCAL=$(<"${KV_OUT_DIR}"/.kernelrelease)
|
| + else
|
| + KV_LOCAL=
|
| + fi
|
| +
|
| + # KV_LOCAL currently contains the full release; discard the first bits.
|
| + tmplocal=${KV_LOCAL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}}
|
| +
|
| + # If the updated local version was not changed, the tree is not prepared.
|
| + # Clear out KV_LOCAL in that case.
|
| + # TODO: this does not detect a change in the localversion part between
|
| + # kernel.release and the value that would be generated.
|
| + if [ "$KV_LOCAL" = "$tmplocal" ]; then
|
| + KV_LOCAL=
|
| + else
|
| + KV_LOCAL=$tmplocal
|
| + fi
|
| +
|
| + # And we should set KV_FULL to the full expanded version
|
| + KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
|
| +
|
| + qeinfo "Found sources for kernel version:"
|
| + qeinfo " ${KV_FULL}"
|
| +
|
| + return 0
|
| +}
|
| +
|
| +# @FUNCTION: get_running_version
|
| +# @DESCRIPTION:
|
| +# It gets the version of the current running kernel and the result is the same as get_version() if the
|
| +# function can find the sources.
|
| +get_running_version() {
|
| + KV_FULL=$(uname -r)
|
| +
|
| + if [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile && -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
|
| + KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
|
| + KBUILD_OUTPUT=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
|
| + unset KV_FULL
|
| + get_version
|
| + return $?
|
| + elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/source/Makefile ]]; then
|
| + KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/source)
|
| + unset KV_FULL
|
| + get_version
|
| + return $?
|
| + elif [[ -f ${ROOT}/lib/modules/${KV_FULL}/build/Makefile ]]; then
|
| + KERNEL_DIR=$(readlink -f ${ROOT}/lib/modules/${KV_FULL}/build)
|
| + unset KV_FULL
|
| + get_version
|
| + return $?
|
| + else
|
| + KV_MAJOR=$(get_version_component_range 1 ${KV_FULL})
|
| + KV_MINOR=$(get_version_component_range 2 ${KV_FULL})
|
| + KV_PATCH=$(get_version_component_range 3 ${KV_FULL})
|
| + KV_PATCH=${KV_PATCH//-*}
|
| + KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}}"
|
| + fi
|
| + return 0
|
| +}
|
| +
|
| +# This next function is named with the eclass prefix to avoid conflicts with
|
| +# some old versionator-like eclass functions.
|
| +
|
| +# @FUNCTION: linux-info_get_any_version
|
| +# @DESCRIPTION:
|
| +# This attempts to find the version of the sources, and otherwise falls back to
|
| +# the version of the running kernel.
|
| +linux-info_get_any_version() {
|
| + get_version
|
| + if [[ $? -ne 0 ]]; then
|
| + ewarn "Unable to calculate Linux Kernel version for build, attempting to use running version"
|
| + get_running_version
|
| + fi
|
| +}
|
| +
|
| +
|
| +# ebuild check functions
|
| +# ---------------------------------------
|
| +
|
| +# @FUNCTION: check_kernel_built
|
| +# @DESCRIPTION:
|
| +# This function verifies that the current kernel sources have been already prepared otherwise it dies.
|
| +check_kernel_built() {
|
| + # if we haven't determined the version yet, we need to
|
| + require_configured_kernel
|
| + get_version
|
| +
|
| + if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ]
|
| + then
|
| + eerror "These sources have not yet been prepared."
|
| + eerror "We cannot build against an unprepared tree."
|
| + eerror "To resolve this, please type the following:"
|
| + eerror
|
| + eerror "# cd ${KV_DIR}"
|
| + eerror "# make oldconfig"
|
| + eerror "# make modules_prepare"
|
| + eerror
|
| + eerror "Then please try merging this module again."
|
| + die "Kernel sources need compiling first"
|
| + fi
|
| +}
|
| +
|
| +# @FUNCTION: check_modules_supported
|
| +# @DESCRIPTION:
|
| +# This function verifies that the current kernel support modules (it checks CONFIG_MODULES=y) otherwise it dies.
|
| +check_modules_supported() {
|
| + # if we haven't determined the version yet, we need too.
|
| + require_configured_kernel
|
| + get_version
|
| +
|
| + if ! linux_chkconfig_builtin "MODULES"
|
| + then
|
| + eerror "These sources do not support loading external modules."
|
| + eerror "to be able to use this module please enable \"Loadable modules support\""
|
| + eerror "in your kernel, recompile and then try merging this module again."
|
| + die "No support for external modules in ${KV_FULL} config"
|
| + fi
|
| +}
|
| +
|
| +# @FUNCTION: check_extra_config
|
| +# @DESCRIPTION:
|
| +# It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e.
|
| +# the prefix ~ is not used) doesn't satisfy the directive.
|
| +check_extra_config() {
|
| + local config negate die error reworkmodulenames
|
| + local soft_errors_count=0 hard_errors_count=0 config_required=0
|
| + # store the value of the QA check, because otherwise we won't catch usages
|
| + # after if check_extra_config is called AND other direct calls are done
|
| + # later.
|
| + local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}"
|
| +
|
| + # if we haven't determined the version yet, we need to
|
| + linux-info_get_any_version
|
| +
|
| + # Determine if we really need a .config. The only time when we don't need
|
| + # one is when all of the CONFIG_CHECK options are prefixed with "~".
|
| + for config in ${CONFIG_CHECK}
|
| + do
|
| + if [[ "${config:0:1}" != "~" ]]; then
|
| + config_required=1
|
| + break
|
| + fi
|
| + done
|
| +
|
| + if [[ ${config_required} == 0 ]]; then
|
| + # In the case where we don't require a .config, we can now bail out
|
| + # if the user has no .config as there is nothing to do. Otherwise
|
| + # code later will cause a failure due to missing .config.
|
| + if ! linux_config_exists; then
|
| + ewarn "Unable to check for the following kernel config options due"
|
| + ewarn "to absence of any configured kernel sources or compiled"
|
| + ewarn "config:"
|
| + for config in ${CONFIG_CHECK}; do
|
| + local_error="ERROR_${config#\~}"
|
| + msg="${!local_error}"
|
| + if [[ "x${msg}" == "x" ]]; then
|
| + local_error="WARNING_${config#\~}"
|
| + msg="${!local_error}"
|
| + fi
|
| + ewarn " - ${config#\~}${msg:+ - }${msg}"
|
| + done
|
| + ewarn "You're on your own to make sure they are set if needed."
|
| + export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
|
| + return 0
|
| + fi
|
| + else
|
| + require_configured_kernel
|
| + fi
|
| +
|
| + einfo "Checking for suitable kernel configuration options..."
|
| +
|
| + for config in ${CONFIG_CHECK}
|
| + do
|
| + # if we specify any fatal, ensure we honor them
|
| + die=1
|
| + error=0
|
| + negate=0
|
| + reworkmodulenames=0
|
| +
|
| + if [[ ${config:0:1} == "~" ]]; then
|
| + die=0
|
| + config=${config:1}
|
| + elif [[ ${config:0:1} == "@" ]]; then
|
| + die=0
|
| + reworkmodulenames=1
|
| + config=${config:1}
|
| + fi
|
| + if [[ ${config:0:1} == "!" ]]; then
|
| + negate=1
|
| + config=${config:1}
|
| + fi
|
| +
|
| + if [[ ${negate} == 1 ]]; then
|
| + linux_chkconfig_present ${config} && error=2
|
| + elif [[ ${reworkmodulenames} == 1 ]]; then
|
| + local temp_config="${config//*:}" i n
|
| + config="${config//:*}"
|
| + if linux_chkconfig_present ${config}; then
|
| + for i in ${MODULE_NAMES}; do
|
| + n="${i//${temp_config}}"
|
| + [[ -z ${n//\(*} ]] && \
|
| + MODULE_IGNORE="${MODULE_IGNORE} ${temp_config}"
|
| + done
|
| + error=2
|
| + fi
|
| + else
|
| + linux_chkconfig_present ${config} || error=1
|
| + fi
|
| +
|
| + if [[ ${error} > 0 ]]; then
|
| + local report_func="eerror" local_error
|
| + local_error="ERROR_${config}"
|
| + local_error="${!local_error}"
|
| +
|
| + if [[ -z "${local_error}" ]]; then
|
| + # using old, deprecated format.
|
| + local_error="${config}_ERROR"
|
| + local_error="${!local_error}"
|
| + fi
|
| + if [[ ${die} == 0 && -z "${local_error}" ]]; then
|
| + #soft errors can be warnings
|
| + local_error="WARNING_${config}"
|
| + local_error="${!local_error}"
|
| + if [[ -n "${local_error}" ]] ; then
|
| + report_func="ewarn"
|
| + fi
|
| + fi
|
| +
|
| + if [[ -z "${local_error}" ]]; then
|
| + [[ ${error} == 1 ]] \
|
| + && local_error="is not set when it should be." \
|
| + || local_error="should not be set. But it is."
|
| + local_error="CONFIG_${config}:\t ${local_error}"
|
| + fi
|
| + if [[ ${die} == 0 ]]; then
|
| + ${report_func} " ${local_error}"
|
| + soft_errors_count=$[soft_errors_count + 1]
|
| + else
|
| + ${report_func} " ${local_error}"
|
| + hard_errors_count=$[hard_errors_count + 1]
|
| + fi
|
| + fi
|
| + done
|
| +
|
| + if [[ ${hard_errors_count} > 0 ]]; then
|
| + eerror "Please check to make sure these options are set correctly."
|
| + eerror "Failure to do so may cause unexpected problems."
|
| + eerror "Once you have satisfied these options, please try merging"
|
| + eerror "this package again."
|
| + export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
|
| + die "Incorrect kernel configuration options"
|
| + elif [[ ${soft_errors_count} > 0 ]]; then
|
| + ewarn "Please check to make sure these options are set correctly."
|
| + ewarn "Failure to do so may cause unexpected problems."
|
| + else
|
| + eend 0
|
| + fi
|
| + export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"
|
| +}
|
| +
|
| +check_zlibinflate() {
|
| + # if we haven't determined the version yet, we need to
|
| + require_configured_kernel
|
| + get_version
|
| +
|
| + # although I restructured this code - I really really really dont support it!
|
| +
|
| + # bug #27882 - zlib routines are only linked into the kernel
|
| + # if something compiled into the kernel calls them
|
| + #
|
| + # plus, for the cloop module, it appears that there's no way
|
| + # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
|
| + # is on
|
| +
|
| + local INFLATE
|
| + local DEFLATE
|
| +
|
| + einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
|
| +
|
| + ebegin "checking ZLIB_INFLATE"
|
| + linux_chkconfig_builtin CONFIG_ZLIB_INFLATE
|
| + eend $?
|
| + [ "$?" != 0 ] && die
|
| +
|
| + ebegin "checking ZLIB_DEFLATE"
|
| + linux_chkconfig_builtin CONFIG_ZLIB_DEFLATE
|
| + eend $?
|
| + [ "$?" != 0 ] && die
|
| +
|
| + local LINENO_START
|
| + local LINENO_END
|
| + local SYMBOLS
|
| + local x
|
| +
|
| + LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
|
| + LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
|
| + (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
|
| + (( LINENO_END = $LINENO_END - 1 ))
|
| + SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
|
| +
|
| + # okay, now we have a list of symbols
|
| + # we need to check each one in turn, to see whether it is set or not
|
| + for x in $SYMBOLS ; do
|
| + if [ "${!x}" = "y" ]; then
|
| + # we have a winner!
|
| + einfo "${x} ensures zlib is linked into your kernel - excellent"
|
| + return 0
|
| + fi
|
| + done
|
| +
|
| + eerror
|
| + eerror "This kernel module requires ZLIB library support."
|
| + eerror "You have enabled zlib support in your kernel, but haven't enabled"
|
| + eerror "enabled any option that will ensure that zlib is linked into your"
|
| + eerror "kernel."
|
| + eerror
|
| + eerror "Please ensure that you enable at least one of these options:"
|
| + eerror
|
| +
|
| + for x in $SYMBOLS ; do
|
| + eerror " * $x"
|
| + done
|
| +
|
| + eerror
|
| + eerror "Please remember to recompile and install your kernel, and reboot"
|
| + eerror "into your new kernel before attempting to load this kernel module."
|
| +
|
| + die "Kernel doesn't include zlib support"
|
| +}
|
| +
|
| +################################
|
| +# Default pkg_setup
|
| +# Also used when inheriting linux-mod to force a get_version call
|
| +# @FUNCTION: linux-info_pkg_setup
|
| +# @DESCRIPTION:
|
| +# Force a get_version() call when inherited from linux-mod.eclass and then check if the kernel is configured
|
| +# to support the options specified in CONFIG_CHECK (if not null)
|
| +linux-info_pkg_setup() {
|
| + linux-info_get_any_version
|
| +
|
| + if kernel_is 2 4; then
|
| + if [ "$( gcc-major-version )" -eq "4" ] ; then
|
| + echo
|
| + ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with"
|
| + ewarn "linux-2.4 (or modules building against a linux-2.4 kernel)!"
|
| + echo
|
| + ewarn "Either switch to another gcc-version (via gcc-config) or use a"
|
| + ewarn "newer kernel that supports gcc-4."
|
| + echo
|
| + ewarn "Also be aware that bugreports about gcc-4 not working"
|
| + ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"
|
| + echo
|
| + epause 10
|
| + fi
|
| + fi
|
| +
|
| + [ -n "${CONFIG_CHECK}" ] && check_extra_config;
|
| +}
|
|
|