blob: 41a8a6eb0f6462e3b7eaabec7a302df4927fb615 [file] [log] [blame]
# Copyright 2010-2018 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
__all__ = ["ExtractKernelVersion"]
import io
import logging
from portage import os, _encodings, _unicode_encode
from portage.env.loaders import KeyValuePairFileLoader
from portage.util import grabfile, shlex_split, writemsg_level
def ExtractKernelVersion(base_dir):
"""
Try to figure out what kernel version we are running
@param base_dir: Path to sources (usually /usr/src/linux)
@type base_dir: string
@rtype: tuple( version[string], error[string])
@return:
1. tuple( version[string], error[string])
Either version or error is populated (but never both)
"""
lines = []
pathname = os.path.join(base_dir, "Makefile")
try:
f = io.open(
_unicode_encode(pathname, encoding=_encodings["fs"], errors="strict"),
mode="r",
encoding=_encodings["content"],
errors="replace",
)
except OSError as details:
return (None, str(details))
except IOError as details:
return (None, str(details))
try:
for i in range(4):
lines.append(f.readline())
except OSError as details:
return (None, str(details))
except IOError as details:
return (None, str(details))
finally:
f.close()
lines = [l.strip() for l in lines]
version = ""
# XXX: The following code relies on the ordering of vars within the Makefile
for line in lines:
# split on the '=' then remove annoying whitespace
items = line.split("=")
items = [i.strip() for i in items]
if items[0] == "VERSION" or items[0] == "PATCHLEVEL":
version += items[1]
version += "."
elif items[0] == "SUBLEVEL":
version += items[1]
elif items[0] == "EXTRAVERSION" and items[-1] != items[0]:
version += items[1]
# Grab a list of files named localversion* and sort them
localversions = os.listdir(base_dir)
for x in range(len(localversions) - 1, -1, -1):
if localversions[x][:12] != "localversion":
del localversions[x]
localversions.sort()
# Append the contents of each to the version string, stripping ALL whitespace
for lv in localversions:
version += "".join(" ".join(grabfile(base_dir + "/" + lv)).split())
# Check the .config for a CONFIG_LOCALVERSION and append that too, also stripping whitespace
loader = KeyValuePairFileLoader(os.path.join(base_dir, ".config"), None)
kernelconfig, loader_errors = loader.load()
if loader_errors:
for file_path, file_errors in loader_errors.items():
for error_str in file_errors:
writemsg_level(
"%s: %s\n" % (file_path, error_str),
level=logging.ERROR,
noiselevel=-1,
)
if kernelconfig and "CONFIG_LOCALVERSION" in kernelconfig:
version += "".join(shlex_split(kernelconfig["CONFIG_LOCALVERSION"]))
return (version, None)