xref: /openbmc/openbmc/poky/meta/lib/oe/classextend.py (revision 028142bd)
1c342db35SBrad Bishop#
292b42cb3SPatrick Williams# Copyright OpenEmbedded Contributors
392b42cb3SPatrick Williams#
4c342db35SBrad Bishop# SPDX-License-Identifier: GPL-2.0-only
5c342db35SBrad Bishop#
6c342db35SBrad Bishop
7eb8dc403SDave Cobbleyimport collections
8eb8dc403SDave Cobbley
91e34c2d0SAndrew Geisslerdef get_packages(d):
101e34c2d0SAndrew Geissler    pkgs = d.getVar("PACKAGES_NONML")
111e34c2d0SAndrew Geissler    extcls = d.getVar("EXTENDERCLASS")
121e34c2d0SAndrew Geissler    return extcls.rename_packages_internal(pkgs)
131e34c2d0SAndrew Geissler
141e34c2d0SAndrew Geisslerdef get_depends(varprefix, d):
151e34c2d0SAndrew Geissler    extcls = d.getVar("EXTENDERCLASS")
161e34c2d0SAndrew Geissler    return extcls.map_depends_variable(varprefix + "_NONML")
171e34c2d0SAndrew Geissler
18eb8dc403SDave Cobbleyclass ClassExtender(object):
19eb8dc403SDave Cobbley    def __init__(self, extname, d):
20eb8dc403SDave Cobbley        self.extname = extname
21eb8dc403SDave Cobbley        self.d = d
22eb8dc403SDave Cobbley        self.pkgs_mapping = []
231e34c2d0SAndrew Geissler        self.d.setVar("EXTENDERCLASS", self)
24eb8dc403SDave Cobbley
25eb8dc403SDave Cobbley    def extend_name(self, name):
26eb8dc403SDave Cobbley        if name.startswith("kernel-") or name == "virtual/kernel":
27eb8dc403SDave Cobbley            return name
28eb8dc403SDave Cobbley        if name.startswith("rtld"):
29eb8dc403SDave Cobbley            return name
30eb8dc403SDave Cobbley        if name.endswith("-crosssdk"):
31eb8dc403SDave Cobbley            return name
32eb8dc403SDave Cobbley        if name.endswith("-" + self.extname):
33eb8dc403SDave Cobbley            name = name.replace("-" + self.extname, "")
34eb8dc403SDave Cobbley        if name.startswith("virtual/"):
35*028142bdSAndrew Geissler            # Assume large numbers of dashes means a triplet is present and we don't need to convert
36*028142bdSAndrew Geissler            if name.count("-") >= 3 and name.endswith(("-go", "-binutils", "-gcc", "-g++")):
37*028142bdSAndrew Geissler                return name
38eb8dc403SDave Cobbley            subs = name.split("/", 1)[1]
39eb8dc403SDave Cobbley            if not subs.startswith(self.extname):
40eb8dc403SDave Cobbley                return "virtual/" + self.extname + "-" + subs
41eb8dc403SDave Cobbley            return name
421e34c2d0SAndrew Geissler        if name.startswith("/") or (name.startswith("${") and name.endswith("}")):
43a34c030eSBrad Bishop            return name
44eb8dc403SDave Cobbley        if not name.startswith(self.extname):
45eb8dc403SDave Cobbley            return self.extname + "-" + name
46eb8dc403SDave Cobbley        return name
47eb8dc403SDave Cobbley
48eb8dc403SDave Cobbley    def map_variable(self, varname, setvar = True):
49eb8dc403SDave Cobbley        var = self.d.getVar(varname)
50eb8dc403SDave Cobbley        if not var:
51eb8dc403SDave Cobbley            return ""
52eb8dc403SDave Cobbley        var = var.split()
53eb8dc403SDave Cobbley        newvar = []
54eb8dc403SDave Cobbley        for v in var:
55eb8dc403SDave Cobbley            newvar.append(self.extend_name(v))
56eb8dc403SDave Cobbley        newdata =  " ".join(newvar)
57eb8dc403SDave Cobbley        if setvar:
58eb8dc403SDave Cobbley            self.d.setVar(varname, newdata)
59eb8dc403SDave Cobbley        return newdata
60eb8dc403SDave Cobbley
61eb8dc403SDave Cobbley    def map_regexp_variable(self, varname, setvar = True):
62eb8dc403SDave Cobbley        var = self.d.getVar(varname)
63eb8dc403SDave Cobbley        if not var:
64eb8dc403SDave Cobbley            return ""
65eb8dc403SDave Cobbley        var = var.split()
66eb8dc403SDave Cobbley        newvar = []
67eb8dc403SDave Cobbley        for v in var:
68eb8dc403SDave Cobbley            if v.startswith("^" + self.extname):
69eb8dc403SDave Cobbley                newvar.append(v)
70eb8dc403SDave Cobbley            elif v.startswith("^"):
71eb8dc403SDave Cobbley                newvar.append("^" + self.extname + "-" + v[1:])
72eb8dc403SDave Cobbley            else:
73eb8dc403SDave Cobbley                newvar.append(self.extend_name(v))
74eb8dc403SDave Cobbley        newdata =  " ".join(newvar)
75eb8dc403SDave Cobbley        if setvar:
76eb8dc403SDave Cobbley            self.d.setVar(varname, newdata)
77eb8dc403SDave Cobbley        return newdata
78eb8dc403SDave Cobbley
79eb8dc403SDave Cobbley    def map_depends(self, dep):
80eb8dc403SDave Cobbley        if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('cross-canadian' in dep) or ('-crosssdk-' in dep):
81eb8dc403SDave Cobbley            return dep
82eb8dc403SDave Cobbley        else:
83eb8dc403SDave Cobbley            # Do not extend for that already have multilib prefix
84eb8dc403SDave Cobbley            var = self.d.getVar("MULTILIB_VARIANTS")
85eb8dc403SDave Cobbley            if var:
86eb8dc403SDave Cobbley                var = var.split()
87eb8dc403SDave Cobbley                for v in var:
88eb8dc403SDave Cobbley                    if dep.startswith(v):
89eb8dc403SDave Cobbley                        return dep
90eb8dc403SDave Cobbley            return self.extend_name(dep)
91eb8dc403SDave Cobbley
92eb8dc403SDave Cobbley    def map_depends_variable(self, varname, suffix = ""):
93eb8dc403SDave Cobbley        # We need to preserve EXTENDPKGV so it can be expanded correctly later
94eb8dc403SDave Cobbley        if suffix:
95213cb269SPatrick Williams            varname = varname + ":" + suffix
96eb8dc403SDave Cobbley        orig = self.d.getVar("EXTENDPKGV", False)
97eb8dc403SDave Cobbley        self.d.setVar("EXTENDPKGV", "EXTENDPKGV")
98eb8dc403SDave Cobbley        deps = self.d.getVar(varname)
99eb8dc403SDave Cobbley        if not deps:
100eb8dc403SDave Cobbley            self.d.setVar("EXTENDPKGV", orig)
101eb8dc403SDave Cobbley            return
102eb8dc403SDave Cobbley        deps = bb.utils.explode_dep_versions2(deps)
103eb8dc403SDave Cobbley        newdeps = collections.OrderedDict()
104eb8dc403SDave Cobbley        for dep in deps:
105eb8dc403SDave Cobbley            newdeps[self.map_depends(dep)] = deps[dep]
106eb8dc403SDave Cobbley
1071e34c2d0SAndrew Geissler        if not varname.endswith("_NONML"):
1081e34c2d0SAndrew Geissler            self.d.renameVar(varname, varname + "_NONML")
1091e34c2d0SAndrew Geissler            self.d.setVar(varname, "${@oe.classextend.get_depends('%s', d)}" % varname)
1101e34c2d0SAndrew Geissler            self.d.appendVarFlag(varname, "vardeps", " " + varname + "_NONML")
1111e34c2d0SAndrew Geissler        ret = bb.utils.join_deps(newdeps, False).replace("EXTENDPKGV", "${EXTENDPKGV}")
112eb8dc403SDave Cobbley        self.d.setVar("EXTENDPKGV", orig)
1131e34c2d0SAndrew Geissler        return ret
114eb8dc403SDave Cobbley
115eb8dc403SDave Cobbley    def map_packagevars(self):
116eb8dc403SDave Cobbley        for pkg in (self.d.getVar("PACKAGES").split() + [""]):
117eb8dc403SDave Cobbley            self.map_depends_variable("RDEPENDS", pkg)
118eb8dc403SDave Cobbley            self.map_depends_variable("RRECOMMENDS", pkg)
119eb8dc403SDave Cobbley            self.map_depends_variable("RSUGGESTS", pkg)
120eb8dc403SDave Cobbley            self.map_depends_variable("RPROVIDES", pkg)
121eb8dc403SDave Cobbley            self.map_depends_variable("RREPLACES", pkg)
122eb8dc403SDave Cobbley            self.map_depends_variable("RCONFLICTS", pkg)
123eb8dc403SDave Cobbley            self.map_depends_variable("PKG", pkg)
124eb8dc403SDave Cobbley
125eb8dc403SDave Cobbley    def rename_packages(self):
126eb8dc403SDave Cobbley        for pkg in (self.d.getVar("PACKAGES") or "").split():
127eb8dc403SDave Cobbley            if pkg.startswith(self.extname):
128eb8dc403SDave Cobbley               self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg])
129eb8dc403SDave Cobbley               continue
130eb8dc403SDave Cobbley            self.pkgs_mapping.append([pkg, self.extend_name(pkg)])
131eb8dc403SDave Cobbley
1321e34c2d0SAndrew Geissler        self.d.renameVar("PACKAGES", "PACKAGES_NONML")
1331e34c2d0SAndrew Geissler        self.d.setVar("PACKAGES", "${@oe.classextend.get_packages(d)}")
1341e34c2d0SAndrew Geissler
1351e34c2d0SAndrew Geissler    def rename_packages_internal(self, pkgs):
1361e34c2d0SAndrew Geissler        self.pkgs_mapping = []
1371e34c2d0SAndrew Geissler        for pkg in (self.d.expand(pkgs) or "").split():
1381e34c2d0SAndrew Geissler            if pkg.startswith(self.extname):
1391e34c2d0SAndrew Geissler               self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg])
1401e34c2d0SAndrew Geissler               continue
1411e34c2d0SAndrew Geissler            self.pkgs_mapping.append([pkg, self.extend_name(pkg)])
1421e34c2d0SAndrew Geissler
1431e34c2d0SAndrew Geissler        return " ".join([row[1] for row in self.pkgs_mapping])
144eb8dc403SDave Cobbley
145eb8dc403SDave Cobbley    def rename_package_variables(self, variables):
146eb8dc403SDave Cobbley        for pkg_mapping in self.pkgs_mapping:
1471e34c2d0SAndrew Geissler            if pkg_mapping[0].startswith("${") and pkg_mapping[0].endswith("}"):
1481e34c2d0SAndrew Geissler                continue
149eb8dc403SDave Cobbley            for subs in variables:
150213cb269SPatrick Williams                self.d.renameVar("%s:%s" % (subs, pkg_mapping[0]), "%s:%s" % (subs, pkg_mapping[1]))
151eb8dc403SDave Cobbley
152eb8dc403SDave Cobbleyclass NativesdkClassExtender(ClassExtender):
153eb8dc403SDave Cobbley    def map_depends(self, dep):
154eb8dc403SDave Cobbley        if dep.startswith(self.extname):
155eb8dc403SDave Cobbley            return dep
156*028142bdSAndrew Geissler        if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('-cross-' in dep) or ('-crosssdk-' in dep):
157eb8dc403SDave Cobbley            return dep
158eb8dc403SDave Cobbley        else:
159eb8dc403SDave Cobbley            return self.extend_name(dep)
160