[v2,1/2] multiarch: avoid separate builds when DPKG_ARCH is all

Message ID 20240917070048.577-2-cedric.hombourger@siemens.com
State Under Review
Headers show
Series do not build -compat/-native for dpkg-raw packages | expand

Commit Message

Cedric Hombourger Sept. 17, 2024, 7 a.m. UTC
Binary-independent packages (DPKG_ARCH == all) do not require separate
builds for our special -compat and -native targets: extend PROVIDES for
these cases. It should be noted that DPKG_ARCH is always set for all
dpkg variants and defaults to "any" (only recipes setting DPKG_ARCH to
all explicitly will be impacted).

Signed-off-by: Cedric Hombourger <cedric.hombourger@siemens.com>
---
 meta/classes/multiarch.bbclass | 34 ++++++++++++++++++++++++----------
 1 file changed, 24 insertions(+), 10 deletions(-)

Patch

diff --git a/meta/classes/multiarch.bbclass b/meta/classes/multiarch.bbclass
index bb0f7983..9df8eefd 100644
--- a/meta/classes/multiarch.bbclass
+++ b/meta/classes/multiarch.bbclass
@@ -5,25 +5,39 @@ 
 
 inherit compat
 python() {
+    pn = d.getVar('PN')
+    archDiffers = d.getVar('HOST_ARCH') != d.getVar('DISTRO_ARCH')
+    archIsAll = d.getVar('DPKG_ARCH') == 'all'
+
+    def pn_multiarch_target(pn):
+        return pn.endswith('-native') or pn.endswith('-compat')
+
+    def extend_provides(pn, provides, d):
+        if not pn_multiarch_target(pn):
+            all_provides = (d.getVar('PROVIDES') or '').split()
+            for p in all_provides:
+                if not pn_multiarch_target(p):
+                    d.appendVar('PROVIDES', f' {p}-{provides}')
+            d.appendVar('PROVIDES', f' {pn}-{provides}')
+
     # provide compat only when we can build it
     if isar_can_build_compat(d):
-        d.appendVar('BBCLASSEXTEND', ' compat')
+        # but do not build separately if architecture-independent
+        if archIsAll:
+            extend_provides(pn, 'compat', d)
+        else:
+            d.appendVar('BBCLASSEXTEND', ' compat')
 
     # build native separately only when it differs from the target variant
-    if d.getVar('HOST_ARCH') == d.getVar('DISTRO_ARCH'):
-        pn = d.getVar('PN')
-        if not pn.endswith('-native') and not pn.endswith('-compat'):
-            provides = (d.getVar('PROVIDES') or '').split()
-            for p in provides:
-                d.appendVar('PROVIDES', f' {p}-native')
-            d.appendVar('PROVIDES', f' {pn}-native')
-    else:
+    if archIsAll is False and archDiffers:
         d.appendVar('BBCLASSEXTEND', ' native')
+    else:
+        extend_provides(pn, 'native', d)
 
     # drop own -native build dependencies at recipe level if building natively
     # and not for the builder architecture
     depends = d.getVar('DEPENDS')
-    if depends is not None and d.getVar('HOST_ARCH') != d.getVar('DISTRO_ARCH') \
+    if depends is not None and archDiffers \
        and not bb.utils.to_boolean(d.getVar('ISAR_CROSS_COMPILE')):
         new_deps = []
         for dep in depends.split():