classextend.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #
  2. # SPDX-License-Identifier: GPL-2.0-only
  3. #
  4. import collections
  5. class ClassExtender(object):
  6. def __init__(self, extname, d):
  7. self.extname = extname
  8. self.d = d
  9. self.pkgs_mapping = []
  10. def extend_name(self, name):
  11. if name.startswith("kernel-") or name == "virtual/kernel":
  12. return name
  13. if name.startswith("rtld"):
  14. return name
  15. if name.endswith("-crosssdk"):
  16. return name
  17. if name.endswith("-" + self.extname):
  18. name = name.replace("-" + self.extname, "")
  19. if name.startswith("virtual/"):
  20. subs = name.split("/", 1)[1]
  21. if not subs.startswith(self.extname):
  22. return "virtual/" + self.extname + "-" + subs
  23. return name
  24. if not name.startswith(self.extname):
  25. return self.extname + "-" + name
  26. return name
  27. def map_variable(self, varname, setvar = True):
  28. var = self.d.getVar(varname)
  29. if not var:
  30. return ""
  31. var = var.split()
  32. newvar = []
  33. for v in var:
  34. newvar.append(self.extend_name(v))
  35. newdata = " ".join(newvar)
  36. if setvar:
  37. self.d.setVar(varname, newdata)
  38. return newdata
  39. def map_regexp_variable(self, varname, setvar = True):
  40. var = self.d.getVar(varname)
  41. if not var:
  42. return ""
  43. var = var.split()
  44. newvar = []
  45. for v in var:
  46. if v.startswith("^" + self.extname):
  47. newvar.append(v)
  48. elif v.startswith("^"):
  49. newvar.append("^" + self.extname + "-" + v[1:])
  50. else:
  51. newvar.append(self.extend_name(v))
  52. newdata = " ".join(newvar)
  53. if setvar:
  54. self.d.setVar(varname, newdata)
  55. return newdata
  56. def map_depends(self, dep):
  57. if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('cross-canadian' in dep) or ('-crosssdk-' in dep):
  58. return dep
  59. else:
  60. # Do not extend for that already have multilib prefix
  61. var = self.d.getVar("MULTILIB_VARIANTS")
  62. if var:
  63. var = var.split()
  64. for v in var:
  65. if dep.startswith(v):
  66. return dep
  67. return self.extend_name(dep)
  68. def map_depends_variable(self, varname, suffix = ""):
  69. # We need to preserve EXTENDPKGV so it can be expanded correctly later
  70. if suffix:
  71. varname = varname + "_" + suffix
  72. orig = self.d.getVar("EXTENDPKGV", False)
  73. self.d.setVar("EXTENDPKGV", "EXTENDPKGV")
  74. deps = self.d.getVar(varname)
  75. if not deps:
  76. self.d.setVar("EXTENDPKGV", orig)
  77. return
  78. deps = bb.utils.explode_dep_versions2(deps)
  79. newdeps = collections.OrderedDict()
  80. for dep in deps:
  81. newdeps[self.map_depends(dep)] = deps[dep]
  82. self.d.setVar(varname, bb.utils.join_deps(newdeps, False).replace("EXTENDPKGV", "${EXTENDPKGV}"))
  83. self.d.setVar("EXTENDPKGV", orig)
  84. def map_packagevars(self):
  85. for pkg in (self.d.getVar("PACKAGES").split() + [""]):
  86. self.map_depends_variable("RDEPENDS", pkg)
  87. self.map_depends_variable("RRECOMMENDS", pkg)
  88. self.map_depends_variable("RSUGGESTS", pkg)
  89. self.map_depends_variable("RPROVIDES", pkg)
  90. self.map_depends_variable("RREPLACES", pkg)
  91. self.map_depends_variable("RCONFLICTS", pkg)
  92. self.map_depends_variable("PKG", pkg)
  93. def rename_packages(self):
  94. for pkg in (self.d.getVar("PACKAGES") or "").split():
  95. if pkg.startswith(self.extname):
  96. self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg])
  97. continue
  98. self.pkgs_mapping.append([pkg, self.extend_name(pkg)])
  99. self.d.setVar("PACKAGES", " ".join([row[1] for row in self.pkgs_mapping]))
  100. def rename_package_variables(self, variables):
  101. for pkg_mapping in self.pkgs_mapping:
  102. for subs in variables:
  103. self.d.renameVar("%s_%s" % (subs, pkg_mapping[0]), "%s_%s" % (subs, pkg_mapping[1]))
  104. class NativesdkClassExtender(ClassExtender):
  105. def map_depends(self, dep):
  106. if dep.startswith(self.extname):
  107. return dep
  108. if dep.endswith(("-gcc", "-g++")):
  109. return dep + "-crosssdk"
  110. elif dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('-cross-' in dep) or ('-crosssdk-' in dep):
  111. return dep
  112. else:
  113. return self.extend_name(dep)