[OE-core] [RFC][PATCH] Attempt to unify predefined package feed handling
David Nyström
david.c.nystrom at gmail.com
Thu Feb 27 13:28:21 UTC 2014
local.conf defines
PACKAGE_FEED_URIS = "http://www.feed_repo.org/repo/"
should we do it this way or some other way ?
[Bug 5407]
Signed-off-by: David Nyström <david.nystrom at enea.com>
---
meta/lib/oe/package_manager.py | 76 +++++++++++++++++++++++++++++++++++++++++-
meta/lib/oe/rootfs.py | 15 +++++++--
2 files changed, 87 insertions(+), 4 deletions(-)
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index d29adac..d4050c6 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -223,6 +223,7 @@ class PackageManager(object):
self.d = d
self.deploy_dir = None
self.deploy_lock = None
+ self.feed_uris = None
"""
Update the package manager package database.
@@ -262,6 +263,10 @@ class PackageManager(object):
def list_installed(self, format=None):
pass
+ @abstractmethod
+ def insert_feeds_uris(self):
+ pass
+
"""
Install complementary packages based upon the list of currently installed
packages e.g. locales, *-dev, *-dbg, etc. This will only attempt to install
@@ -339,6 +344,7 @@ class RpmPM(PackageManager):
self.providename = providename
self.fullpkglist = list()
self.deploy_dir = self.d.getVar('DEPLOY_DIR_RPM', True)
+ self.feed_uris = self.d.getVar('PACKAGE_FEED_URIS', True)
self.etcrpm_dir = os.path.join(self.target_rootfs, "etc/rpm")
self.install_dir = os.path.join(self.target_rootfs, "install")
self.rpm_cmd = bb.utils.which(os.getenv('PATH'), "rpm")
@@ -358,6 +364,41 @@ class RpmPM(PackageManager):
self.ml_prefix_list, self.ml_os_list = self.indexer.get_ml_prefix_and_os_list(arch_var, os_var)
+
+ def insert_feeds_uris(self):
+ # List must be prefered to least preferred order
+ channel_priority = 5
+ default_platform_extra = set()
+ platform_extra = set()
+ bbextendvariant = self.d.getVar('BBEXTENDVARIANT', True) or ""
+ for mlib in self.ml_os_list:
+ for arch in self.ml_prefix_list[mlib]:
+ plt = arch.replace('-', '_') + '-.*-' + self.ml_os_list[mlib]
+ if mlib == bbextendvariant:
+ default_platform_extra.add(plt)
+ else:
+ platform_extra.add(plt)
+ channel_priority += 5
+
+ platform_extra = platform_extra.union(default_platform_extra)
+
+ for uri in self.feed_uris.split():
+ channel_priority *= 2
+ uri_iterator = 0
+ for canonical_arch in platform_extra:
+ arch = canonical_arch.split('-')[0]
+ if arch == "noarch" or arch == "any":
+ continue
+
+ bb.note('Note: adding Smart channel url%d%s (%s)' %
+ (uri_iterator, arch, channel_priority))
+ self._invoke_smart('channel --add url%d-%s type=rpm-md baseurl=%s/rpm/%s -y'
+ % (uri_iterator, arch, uri, arch))
+ self._invoke_smart('channel --set url%d-%s priority=%d' %
+ (uri_iterator, arch, channel_priority))
+ channel_priority -= 5
+ uri_iterator += 1
+
'''
Create configs for rpm and smart, and multilib is supported
'''
@@ -944,7 +985,7 @@ class OpkgPM(PackageManager):
self.deploy_dir = self.d.getVar("DEPLOY_DIR_IPK", True)
self.deploy_lock_file = os.path.join(self.deploy_dir, "deploy.lock")
-
+ self.feed_uris = self.d.getVar('PACKAGE_FEED_URIS', True)
self.opkg_cmd = bb.utils.which(os.getenv('PATH'), "opkg-cl")
self.opkg_args = "-f %s -o %s " % (self.config_file, target_rootfs)
self.opkg_args += self.d.getVar("OPKG_ARGS", True)
@@ -1050,6 +1091,24 @@ class OpkgPM(PackageManager):
config_file.write("src oe-%s file:%s\n" %
(arch, pkgs_dir))
+ def insert_feeds_uris(self):
+ rootfs_config = os.path.join('%s/etc/opkg/base-feeds.conf'
+ % self.target_rootfs)
+
+ with open(rootfs_config, "w+") as config_file:
+ priority = 5
+ uri_iterator = 0
+ for uri in self.feed_uris.split():
+ config_file.write("src/gz url-%d %s/ipk\n" %
+ (uri_iterator, uri))
+
+ for arch in self.pkg_archs.split():
+ if arch == "noarch" or arch == "any":
+ continue
+ config_file.write("src/gz uri-%s-%d %s/ipk/%s\n" %
+ (arch, uri_iterator, uri, arch))
+ uri_iterator += 1
+
def update(self):
self.deploy_dir_lock()
@@ -1250,6 +1309,7 @@ class DpkgPM(PackageManager):
def __init__(self, d, target_rootfs, archs, base_archs, apt_conf_dir=None):
super(DpkgPM, self).__init__(d)
self.target_rootfs = target_rootfs
+ self.feed_uris = self.d.getVar('PACKAGE_FEED_URIS', True)
self.deploy_dir = self.d.getVar('DEPLOY_DIR_DEB', True)
if apt_conf_dir is None:
self.apt_conf_dir = self.d.expand("${APTCONF_TARGET}/apt")
@@ -1410,6 +1470,20 @@ class DpkgPM(PackageManager):
if result is not None:
bb.fatal(result)
+ def insert_feeds_uris(self):
+ sources_conf = os.path.join("%s/etc/apt/sources.list"
+ % self.target_rootfs)
+ arch_list = []
+ archs = self.d.getVar('PACKAGE_ARCHS', True)
+ arch_list = archs.split()
+ with open(sources_conf, "w+") as sources_file:
+ for uri in self.feed_uris.split():
+ for arch in arch_list:
+ if arch == "noarch" or arch == "any":
+ continue
+ sources_file.write("deb %s/deb/%s ./\n" %
+ (uri, arch))
+
def _create_configs(self, archs, base_archs):
base_archs = re.sub("_", "-", base_archs)
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index be0afa6..7be2a18 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -350,7 +350,10 @@ class RpmRootfs(Rootfs):
bb.fatal(message)
def _insert_feed_uris(self):
- pass
+ if base_contains("IMAGE_FEATURES", "package-management",
+ False, True, self.d):
+ return
+ self.pm.insert_feeds_uris()
def _handle_intercept_failure(self, registered_pkgs):
rpm_postinsts_dir = self.image_rootfs + self.d.expand('${sysconfdir}/rpm-postinsts/')
@@ -433,7 +436,10 @@ class DpkgRootfs(Rootfs):
pass
def _insert_feed_uris(self):
- pass
+ if base_contains("IMAGE_FEATURES", "package-management",
+ False, True, self.d):
+ return
+ self.pm.insert_feeds_uris()
class OpkgRootfs(Rootfs):
@@ -699,8 +705,11 @@ class OpkgRootfs(Rootfs):
pass
def _insert_feed_uris(self):
- pass
+ if base_contains("IMAGE_FEATURES", "package-management",
+ False, True, self.d):
+ return
+ self.pm.insert_feeds_uris()
def create_rootfs(d, manifest_dir=None):
env_bkp = os.environ.copy()
--
1.8.3.2
More information about the Openembedded-core
mailing list