text: import collections
  
  class ClassExtender(object):
      def __init__(self, extname, d):
          self.extname = extname
          self.d = d
          self.pkgs_mapping = []
  
      def extend_name(self, name):
          if name.startswith("kernel-") or name == "virtual/kernel":
              return name
          if name.startswith("rtld"):
              return name
          if name.endswith("-crosssdk"):
              return name
          if name.endswith("-" + self.extname):
              name = name.replace("-" + self.extname, "")
          if name.startswith("virtual/"):
              subs = name.split("/", 1)[1]
              if not subs.startswith(self.extname):
                  return "virtual/" + self.extname + "-" + subs
              return name
          if not name.startswith(self.extname):
              return self.extname + "-" + name
          return name
  
      def map_variable(self, varname, setvar = True):
          var = self.d.getVar(varname)
          if not var:
              return ""
          var = var.split()
          newvar = []
          for v in var:
              newvar.append(self.extend_name(v))
          newdata =  " ".join(newvar)
          if setvar:
              self.d.setVar(varname, newdata)
          return newdata
  
      def map_regexp_variable(self, varname, setvar = True):
          var = self.d.getVar(varname)
          if not var:
              return ""
          var = var.split()
          newvar = []
          for v in var:
              if v.startswith("^" + self.extname):
                  newvar.append(v)
              elif v.startswith("^"):
                  newvar.append("^" + self.extname + "-" + v[1:])
              else:
                  newvar.append(self.extend_name(v))
          newdata =  " ".join(newvar)
          if setvar:
              self.d.setVar(varname, newdata)
          return newdata
  
      def map_depends(self, dep):
          if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('cross-canadian' in dep) or ('-crosssdk-' in dep):
              return dep
          else:
              # Do not extend for that already have multilib prefix
              var = self.d.getVar("MULTILIB_VARIANTS")
              if var:
                  var = var.split()
                  for v in var:
                      if dep.startswith(v):
                          return dep
              return self.extend_name(dep)
  
      def map_depends_variable(self, varname, suffix = ""):
          # We need to preserve EXTENDPKGV so it can be expanded correctly later
          if suffix:
              varname = varname + "_" + suffix
          orig = self.d.getVar("EXTENDPKGV", False)
          self.d.setVar("EXTENDPKGV", "EXTENDPKGV")
          deps = self.d.getVar(varname)
          if not deps:
              self.d.setVar("EXTENDPKGV", orig)
              return
          deps = bb.utils.explode_dep_versions2(deps)
          newdeps = collections.OrderedDict()
          for dep in deps:
              newdeps[self.map_depends(dep)] = deps[dep]
  
          self.d.setVar(varname, bb.utils.join_deps(newdeps, False).replace("EXTENDPKGV", "${EXTENDPKGV}"))
          self.d.setVar("EXTENDPKGV", orig)
  
      def map_packagevars(self):
          for pkg in (self.d.getVar("PACKAGES").split() + [""]):
              self.map_depends_variable("RDEPENDS", pkg)
              self.map_depends_variable("RRECOMMENDS", pkg)
              self.map_depends_variable("RSUGGESTS", pkg)
              self.map_depends_variable("RPROVIDES", pkg)
              self.map_depends_variable("RREPLACES", pkg)
              self.map_depends_variable("RCONFLICTS", pkg)
              self.map_depends_variable("PKG", pkg)
  
      def rename_packages(self):
          for pkg in (self.d.getVar("PACKAGES") or "").split():
              if pkg.startswith(self.extname):
                 self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg])
                 continue
              self.pkgs_mapping.append([pkg, self.extend_name(pkg)])
  
          self.d.setVar("PACKAGES", " ".join([row[1] for row in self.pkgs_mapping]))
  
      def rename_package_variables(self, variables):
          for pkg_mapping in self.pkgs_mapping:
              for subs in variables:
                  self.d.renameVar("%s_%s" % (subs, pkg_mapping[0]), "%s_%s" % (subs, pkg_mapping[1]))
  
  class NativesdkClassExtender(ClassExtender):
      def map_depends(self, dep):
          if dep.startswith(self.extname):
              return dep
          if dep.endswith(("-gcc-initial", "-gcc", "-g++")):
              return dep + "-crosssdk"
          elif dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('-cross-' in dep) or ('-crosssdk-' in dep):
              return dep
          else:
              return self.extend_name(dep)
  