Hi all, I'm wondering if someone can help me debug this problem a
little as it's getting into the parts of bitbake I don't know very
well, in particular the determination of whether a task needs to
re-run or not.

I've attached a patch which adds code to do_package_write_ipk in
package_ipk.bbclass to split up the package feed if
IPK_HIERARCHICAL_FEED is set to "1". The commit message in the patch
explains why I'm doing this and if it all works I'll submit this to
master. The attached patch isn't ready for submission yet, it needs
more testing first.

As expected, if IPK_HIERARCHICAL_FEED is not set in local.conf, the
package feed is created in the old way. If IPK_HIERARCHICAL_FEED is
set to "1" in local.conf, the package feed is created in my modified
way. This was tested by building from scratch in each case, with no
sstate or tmp directory present.

However if IPK_HIERARCHICAL_FEED is changed in local.conf, the package
feed is not recreated. I can force do_write_package_ipk and the new
value is taken into account, but if I just do my usual 'bitbake
kitchen-sink' where kitchen-sink is a packagegroup which depends on
everything I want in the package feed, do_write_package_ipk is not
re-ran for any recipe.

Am I missing something here? Is it expected that this variable change
is detected and the relevant tasks re-executed? I know changing
variables like PREFERRED_PROVIDER_* in local.conf causes things to be
rebuilt, so why does that work and this not?

Cheers,

-- 
Paul Barker

Email: [email protected]
http://www.paulbarker.me.uk
From 75e80008b2f6bb702bd49c47eca6e61b6a047373 Mon Sep 17 00:00:00 2001
From: Paul Barker <[email protected]>
Date: Fri, 2 May 2014 14:51:35 +0000
Subject: [PATCH] package_ipk.bbclass: Support hierarchical feed
To: [email protected]

This patch allows for an optional new layout for ipk feed directories which I've
called a 'hierarchical feed' and is based on how Debian pools package files. It
is disabled by default and is enabled by setting IPK_HIERARCHICAL_FEED to "1".

In the traditional feed layout, package files are placed in <outdir>/<arch>/.
This can lead to several thousand files existing in a single directory which is
often a problem if developers want to upload a package feed to a shared web
hosting provider. For example, in my case, listing files via FTP only shows the
first 2000 files, breaking my scripts which attempt to upload only new and
changed files via FTP.

In the hierarchical feed, package files are written to
<outdir>/<arch>/<pkg_prefix>/<pkg_subdir>, where pkg_prefix is the first letter
of the package file name for non-lib packages or "lib" plus the 4th letter of
the pacakge file name for lib pacakges (eg, 'l' for less, 'libc' for libc6).
pkg_subdir is the root of the pacakge file name, discarding the version and
architecture parts and the common suffixes '-dbg', '-dev', '-doc', '-staticdev'
and '-locale-*'.

This change relies on recent patches to opkg-utils which support hierarchical
package feeds.

Signed-off-by: Paul Barker <[email protected]>
---
 meta/classes/package_ipk.bbclass | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/meta/classes/package_ipk.bbclass b/meta/classes/package_ipk.bbclass
index 2949d1d..680b9bf 100644
--- a/meta/classes/package_ipk.bbclass
+++ b/meta/classes/package_ipk.bbclass
@@ -63,7 +63,26 @@ python do_package_ipk () {
         bb.data.update_data(localdata)
         basedir = os.path.join(os.path.dirname(root))
         arch = localdata.getVar('PACKAGE_ARCH', True)
-        pkgoutdir = "%s/%s" % (outdir, arch)
+        if localdata.getVar('IPK_HIERARCHICAL_FEED') == "1":
+            # Spread packages across subdirectories so each isn't too crowded
+            if pkgname.startswith('lib'):
+                pkg_prefix = 'lib' + pkgname[3]
+            else:
+                pkg_prefix = pkgname[0]
+
+            # Keep -dbg, -dev, -doc, -staticdev and -locale-* packages together
+            if pkgname[-4:] in ('-dbg', '-dev', '-doc'):
+                pkg_subdir = pkgname[:-4]
+            elif pkgname.endswith('-staticdev'):
+                pkg_subdir = pkgname[:-10]
+            elif '-locale-' in pkgname:
+                pkg_subdir = pkgname[:pkgname.find('-locale-')]
+            else:
+                pkg_subdir = pkgname
+
+            pkgoutdir = "%s/%s/%s/%s" % (outdir, arch, pkg_prefix, pkg_subdir)
+        else:
+            pkgoutdir = "%s/%s" % (outdir, arch)
         bb.utils.mkdirhier(pkgoutdir)
         os.chdir(root)
         cleanupcontrol(root)
-- 
1.9.2

-- 
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to