Patchwork [meta-fsl-arm,v2,09/31] fsl-dynamic-packagearch.bbclass: Dynamically set package architecture

login
register
mail settings
Submitter Otavio Salvador
Date Sept. 24, 2013, 7:20 p.m.
Message ID <1380050461-21290-10-git-send-email-otavio@ossystems.com.br>
Download mbox | patch
Permalink /patch/58901/
State Accepted
Delegated to: Otavio Salvador
Headers show

Comments

Otavio Salvador - Sept. 24, 2013, 7:20 p.m.
This allow to easy reuse of binary packages among similar SoCs. The
usual use for this is to share SoC specific packages among different
boards. The class can be used to share GPU packages for i.MX53 boards
(as all them share the AMD GPU) and i.MX6 based boards (as all them
share Vivante GPU).

It inspects the database and identify if the package provides or
depends on one of subarch provided values and if it does, it sets the
PACKAGE_ARCH for MACHINE_SUBARCH value otherwise if it matches in the
machine specific filter, it sets it to MACHINE_ARCH.

This reduces the amount of packages we build, for example in case of
core-image-x11 we:

$ ls -l tmp/deploy/rpm/cortexa9hf_vfp_neon_mx6/*.rpm | wc -l
75

So we reuse 75 binaries; these would be build otherwise.

It being dynamically set or statically set it has following benefits:

* correctness: it is easier to ensure the system behaves as expected
* correctness for non-tracked recipes: new recipes, if depending on
  virtual/kernel or GPU has the right architecture choosen, without a
  .bbappend file for them
* safeness: non-expert users get a more adequate behavior as the
  complexity of choosing the right architecture is simplified for them
* easy maintenance: it is easier for me, as maintainer, to maintain a
  code which decides what to do than having hundreds of bbappend files
  for it

Change-Id: Icb0a8060e862c8eeb166c45d1b39c40de07b01d8
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 classes/fsl-dynamic-packagearch.bbclass | 47 +++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)
 create mode 100644 classes/fsl-dynamic-packagearch.bbclass

Patch

diff --git a/classes/fsl-dynamic-packagearch.bbclass b/classes/fsl-dynamic-packagearch.bbclass
new file mode 100644
index 0000000..def8e71
--- /dev/null
+++ b/classes/fsl-dynamic-packagearch.bbclass
@@ -0,0 +1,47 @@ 
+# Automatically set PACKAGE_ARCH for MACHINE_SOCARCH
+#
+# This allow to easy reuse of binary packages among similar SoCs. The
+# usual use for this is to share SoC specific packages among different
+# boards.
+#
+# MACHINE_SOCARCH_FILTER list all packages associated with
+# MACHINE_SOCARCH and, when match, will set PACHAGE_ARCH as MACHINE_SOCARCH
+#
+# MACHINE_ARCH_FILTER list all packages associated with
+# MACHINE_ARCH and, when match, will set PACHAGE_ARCH as MACHINE_ARCH
+#
+# For example, in meta-fsl-arm, this is used to share GPU packages for
+# i.MX53 boards (as all them share the AMD GPU) and i.MX6 based boards
+# (as all them share Vivante GPU).
+#
+# To use the class, specify, for example:
+#
+# MACHINE_SOCARCH_soc = "${TUNE_PKGARCH}-soc"
+#
+# and the need filters, as:
+#
+# MACHINE_ARCH_FILTER = "virtual/kernel"
+# MACHINE_SOCARCH_FILTER_soc = "virtual/libgles1 ... virtual/libgl"
+#
+# Copyright 2013 (C) O.S. Systems Software LTDA.
+
+python __anonymous () {
+    machine_arch_filter = set((d.getVar("MACHINE_ARCH_FILTER", True) or "").split())
+    machine_socarch_filter = set((d.getVar("MACHINE_SOCARCH_FILTER", True) or "").split())
+    if machine_socarch_filter or machine_arch_filter:
+        provides = set((d.getVar("PROVIDES", True) or "").split())
+        depends = set((d.getVar("DEPENDS", True) or "").split())
+        PN = d.getVar("PN", True)
+
+        package_arch = None
+        if list(machine_arch_filter & (provides | depends)):
+            package_arch = d.getVar("MACHINE_ARCH", True)
+        elif list(machine_socarch_filter & (provides | depends)):
+            package_arch = d.getVar("MACHINE_SOCARCH", True)
+            if not package_arch:
+                bb.parse.SkipPackage("You must set MACHINE_SOCARCH as MACHINE_SOCARCH_FILTER is set for this SoC.")
+
+        if package_arch:
+            bb.debug(1, "Use '%s' as package archictecture for '%s'" % (package_arch, PN))
+            d.setVar("PACKAGE_ARCH", package_arch)
+}