mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 12:59:02 +02:00

In some cases, /etc/lsb-release file is used to extract info about poky build host machine. But the strings are not stripped of end of line special characters. As such, when this info is concatenated and used as a directory entry in sstate_cache, this is an issue. Usually, this issue is masked by the fact that distro related info is extracted from the output of lsb_release command. In case of Yocto Linux, running "lsb_release -a" will give an error code because CODENAME info is not present. As such, bitbake will extract the info from /etc/lsb-release, running into the above issue. Consequence is that building under BA will crash. Partial fix for [YOCTO #4071] (From OE-Core rev: 5d0839bef631dceb4395fcf204779a76966a1061) Signed-off-by: Cristian Iorga <cristian.iorga@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
def release_dict():
|
|
"""Return the output of lsb_release -a as a dictionary"""
|
|
from subprocess import PIPE
|
|
|
|
try:
|
|
output, err = bb.process.run(['lsb_release', '-a'], stderr=PIPE)
|
|
except bb.process.CmdError as exc:
|
|
return None
|
|
|
|
data = {}
|
|
for line in output.splitlines():
|
|
try:
|
|
key, value = line.split(":\t", 1)
|
|
except ValueError:
|
|
continue
|
|
else:
|
|
data[key] = value
|
|
return data
|
|
|
|
def release_dict_file():
|
|
""" Try to gather LSB release information manually when lsb_release tool is unavailable """
|
|
data = None
|
|
try:
|
|
if os.path.exists('/etc/lsb-release'):
|
|
data = {}
|
|
with open('/etc/lsb-release') as f:
|
|
for line in f:
|
|
key, value = line.split("=", 1)
|
|
data[key] = value.strip()
|
|
elif os.path.exists('/etc/redhat-release'):
|
|
data = {}
|
|
with open('/etc/redhat-release') as f:
|
|
distro = f.readline().strip()
|
|
import re
|
|
match = re.match(r'(.*) release (.*) \((.*)\)', distro)
|
|
if match:
|
|
data['DISTRIB_ID'] = match.group(1)
|
|
data['DISTRIB_RELEASE'] = match.group(2)
|
|
elif os.path.exists('/etc/SuSE-release'):
|
|
data = {}
|
|
data['DISTRIB_ID'] = 'SUSE LINUX'
|
|
with open('/etc/SuSE-release') as f:
|
|
for line in f:
|
|
if line.startswith('VERSION = '):
|
|
data['DISTRIB_RELEASE'] = line[10:].rstrip()
|
|
break
|
|
except IOError:
|
|
return None
|
|
return data
|
|
|
|
def distro_identifier(adjust_hook=None):
|
|
"""Return a distro identifier string based upon lsb_release -ri,
|
|
with optional adjustment via a hook"""
|
|
|
|
lsb_data = release_dict()
|
|
if lsb_data:
|
|
distro_id, release = lsb_data['Distributor ID'], lsb_data['Release']
|
|
else:
|
|
lsb_data_file = release_dict_file()
|
|
if lsb_data_file:
|
|
distro_id, release = lsb_data_file['DISTRIB_ID'], lsb_data_file['DISTRIB_RELEASE']
|
|
else:
|
|
distro_id, release = None, None
|
|
|
|
if adjust_hook:
|
|
distro_id, release = adjust_hook(distro_id, release)
|
|
if not distro_id:
|
|
return "Unknown"
|
|
return '{0}-{1}'.format(distro_id, release).replace(' ','-').replace('/','-')
|