blob: ddca10dee5441c6a8b659405d36c7476ec56ad3f [file]
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: GPL-2.0-only
#
import collections
import bb.filter
@bb.filter.filter_proc()
def native_filter(val, pn, bpn, regex=False, selfref=True):
deps = val
if not deps:
return
deps = bb.utils.explode_deps(deps)
newdeps = []
for dep in deps:
if regex and dep.startswith("^") and dep.endswith("$"):
if not dep.endswith("-native$"):
newdeps.append(dep[:-1].replace(pn, bpn) + "-native$")
else:
newdeps.append(dep)
elif dep == pn:
if not selfref:
continue
newdeps.append(dep)
elif "-cross-" in dep:
newdeps.append(dep.replace("-cross", "-native"))
elif not dep.endswith("-native"):
# Replace ${PN} with ${BPN} in the dependency to make sure
# dependencies on, e.g., ${PN}-foo become ${BPN}-foo-native
# rather than ${BPN}-native-foo-native.
newdeps.append(dep.replace(pn, bpn) + "-native")
else:
newdeps.append(dep)
return " ".join(newdeps)
def add_suffix(val, extname, prefixes):
if val.startswith(extname + "-"):
return val
if val.endswith(("-native", "-native-runtime")) or ('nativesdk-' in val) or ('-cross-' in val) or ('-crosssdk-' in val):
return val
# If it starts with a known prefix (e.g. multilibs), just pass it through
for prefix in prefixes:
if val.startswith(prefix + "-"):
return val
if val.startswith("kernel-") or val == "virtual/kernel":
return val
if val.startswith("rtld"):
return val
if val.endswith("-crosssdk"):
return val
if val.endswith("-" + extname):
val = val.replace("-" + extname, "")
if val.startswith("virtual/"):
# Assume large numbers of dashes means a triplet is present and we don't need to convert
if val.count("-") >= 3 and val.endswith(("-go",)):
return val
subs = val.split("/", 1)[1]
if not subs.startswith(extname):
return "virtual/" + extname + "-" + subs
return val
if val.startswith("/") or (val.startswith("${") and val.endswith("}")):
return val
if not val.startswith(extname):
return extname + "-" + val
return val
def get_package_mappings(packages, extname):
pkgs_mapping = []
for pkg in packages.split():
if pkg.startswith(extname):
pkgs_mapping.append([pkg.split(extname + "-")[1], pkg])
continue
pkgs_mapping.append([pkg, add_suffix(pkg, extname, [])])
return pkgs_mapping
@bb.filter.filter_proc()
def package_suffix_filter(val, extname):
pkgs_mapping = get_package_mappings(val, extname)
return " ".join([row[1] for row in pkgs_mapping])
@bb.filter.filter_proc()
def suffix_filter(val, extname, prefixes):
newdeps = []
for dep in val.split():
newdeps.append(add_suffix(dep, extname, prefixes))
return " ".join(newdeps)
@bb.filter.filter_proc()
def suffix_filter_regex(val, extname, prefixes):
newvar = []
for v in val.split():
if v.startswith("^" + extname):
newvar.append(v)
elif v.startswith("^"):
newvar.append("^" + extname + "-" + v[1:])
else:
newvar.append(add_suffix(v, extname, prefixes))
return " ".join(newvar)
@bb.filter.filter_proc()
def suffix_filter_deps(val, extname, prefixes):
deps = bb.utils.explode_dep_versions2(val)
newdeps = collections.OrderedDict()
for dep in deps:
newdeps[add_suffix(dep, extname, prefixes)] = deps[dep]
return bb.utils.join_deps(newdeps, False)
class ClassExtender(object):
def __init__(self, extname, prefixes, d):
self.extname = extname
self.d = d
self.prefixes = prefixes
def set_filter(self, var, deps):
if deps:
self.d.setVarFilter(var, "suffix_filter_deps(val, '" + self.extname + "', " + str(self.prefixes) + ")")
else:
self.d.setVarFilter(var, "suffix_filter(val, '" + self.extname + "', " + str(self.prefixes) + ")")
def map_packagevars(self):
self.set_filter("RDEPENDS", deps=True)
self.set_filter("RRECOMMENDS", deps=True)
self.set_filter("RSUGGESTS", deps=True)
self.set_filter("RPROVIDES", deps=True)
self.set_filter("RREPLACES", deps=True)
self.set_filter("RCONFLICTS", deps=True)
self.set_filter("PKG", deps=True)
def rename_package_variables(self, variables):
pkgs_mapping = get_package_mappings(self.d.getVar('PACKAGES'), self.extname)
self.d.setVarFilter('PACKAGES', "package_suffix_filter(val, '" + self.extname + "')")
self.d.setVarFilter('PACKAGES_DYNAMIC', "suffix_filter_regex(val, '" + self.extname + "', " + str(self.prefixes) + ")")
for pkg_mapping in pkgs_mapping:
if pkg_mapping[0].startswith("${") and pkg_mapping[0].endswith("}"):
continue
for subs in variables:
self.d.renameVar("%s:%s" % (subs, pkg_mapping[0]), "%s:%s" % (subs, pkg_mapping[1]))