diff options
author | Richard Purdie <rpurdie@linux.intel.com> | 2006-07-08 12:54:31 +0000 |
---|---|---|
committer | Richard Purdie <rpurdie@linux.intel.com> | 2006-07-08 12:54:31 +0000 |
commit | 856526609b2cd88a3f272ff6f4564d877a1e8c43 (patch) | |
tree | 63e7c3d7ccdc8d8310385d40a0b427832640daf9 /lib/bb | |
parent | 7d55491f88ff90a4c16ad87b1483d55b1824acfc (diff) | |
download | bitbake-856526609b2cd88a3f272ff6f4564d877a1e8c43.tar.gz |
bitbake/lib/bb/providers.py:
bitbake/lib/bb/__init__.py:
bitbake/lib/bb/shell.py:
bitbake/bin/bitbake:
* Move providers functions into their own file. The arguments are horrible
at present but we have to start somewhere with the cleanup and refactoring.
Diffstat (limited to 'lib/bb')
-rw-r--r-- | lib/bb/__init__.py | 1 | ||||
-rw-r--r-- | lib/bb/providers.py | 163 | ||||
-rw-r--r-- | lib/bb/shell.py | 4 |
3 files changed, 166 insertions, 2 deletions
diff --git a/lib/bb/__init__.py b/lib/bb/__init__.py index 6aa67b818..8d825dbe8 100644 --- a/lib/bb/__init__.py +++ b/lib/bb/__init__.py @@ -63,6 +63,7 @@ __all__ = [ "manifest", "methodpool", "cache", + "providers", ] whitespace = '\t\n\x0b\x0c\r ' diff --git a/lib/bb/providers.py b/lib/bb/providers.py new file mode 100644 index 000000000..10190b186 --- /dev/null +++ b/lib/bb/providers.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# Copyright (C) 2003, 2004 Chris Larson +# Copyright (C) 2003, 2004 Phil Blundell +# Copyright (C) 2003 - 2005 Michael 'Mickey' Lauer +# Copyright (C) 2005 Holger Hans Peter Freyther +# Copyright (C) 2005 ROAD GmbH +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place, Suite 330, Boston, MA 02111-1307 USA. + +import os, re +from bb import data, utils +import bb + +def findBestProvider(pn, cfgData, dataCache, pkg_pn = None): + """ + If there is a PREFERRED_VERSION, find the highest-priority bbfile + providing that version. If not, find the latest version provided by + an bbfile in the highest-priority set. + """ + if not pkg_pn: + pkg_pn = dataCache.pkg_pn + + files = pkg_pn[pn] + priorities = {} + for f in files: + priority = dataCache.bbfile_priority[f] + if priority not in priorities: + priorities[priority] = [] + priorities[priority].append(f) + p_list = priorities.keys() + p_list.sort(lambda a, b: a - b) + tmp_pn = [] + for p in p_list: + tmp_pn = [priorities[p]] + tmp_pn + + preferred_file = None + + localdata = data.createCopy(cfgData) + bb.data.setVar('OVERRIDES', "%s:%s" % (pn, data.getVar('OVERRIDES', localdata)), localdata) + bb.data.update_data(localdata) + + preferred_v = bb.data.getVar('PREFERRED_VERSION_%s' % pn, localdata, True) + if preferred_v: + m = re.match('(.*)_(.*)', preferred_v) + if m: + preferred_v = m.group(1) + preferred_r = m.group(2) + else: + preferred_r = None + + for file_set in tmp_pn: + for f in file_set: + pv,pr = dataCache.pkg_pvpr[f] + if preferred_v == pv and (preferred_r == pr or preferred_r == None): + preferred_file = f + preferred_ver = (pv, pr) + break + if preferred_file: + break; + if preferred_r: + pv_str = '%s-%s' % (preferred_v, preferred_r) + else: + pv_str = preferred_v + if preferred_file is None: + bb.note("preferred version %s of %s not available" % (pv_str, pn)) + else: + bb.debug(1, "selecting %s as PREFERRED_VERSION %s of package %s" % (preferred_file, pv_str, pn)) + + del localdata + + # get highest priority file set + files = tmp_pn[0] + latest = None + latest_p = 0 + latest_f = None + for file_name in files: + pv,pr = dataCache.pkg_pvpr[file_name] + dp = dataCache.pkg_dp[file_name] + + if (latest is None) or ((latest_p == dp) and (utils.vercmp(latest, (pv, pr)) < 0)) or (dp > latest_p): + latest = (pv, pr) + latest_f = file_name + latest_p = dp + if preferred_file is None: + preferred_file = latest_f + preferred_ver = latest + + return (latest,latest_f,preferred_ver, preferred_file) + +def filterProviders(providers, item, cfgData, dataCache, build_cache_fail, verbose): + """ + Take a list of providers and filter/reorder according to the + environment variables and previous build results + """ + eligible = [] + preferred_versions = {} + + # Collate providers by PN + pkg_pn = {} + for p in providers: + pn = dataCache.pkg_fn[p] + if pn not in pkg_pn: + pkg_pn[pn] = [] + pkg_pn[pn].append(p) + + bb.debug(1, "providers for %s are: %s" % (item, pkg_pn.keys())) + + for pn in pkg_pn.keys(): + preferred_versions[pn] = bb.providers.findBestProvider(pn, cfgData, dataCache, pkg_pn)[2:4] + eligible.append(preferred_versions[pn][1]) + + + for p in eligible: + if p in build_cache_fail: + bb.debug(1, "rejecting already-failed %s" % p) + eligible.remove(p) + + if len(eligible) == 0: + bb.error("no eligible providers for %s" % item) + return 0 + + # look to see if one of them is already staged, or marked as preferred. + # if so, bump it to the head of the queue + for p in providers: + pn = dataCache.pkg_fn[p] + pv, pr = dataCache.pkg_pvpr[p] + + stamp = '%s.do_populate_staging' % dataCache.stamp[p] + if os.path.exists(stamp): + (newvers, fn) = preferred_versions[pn] + if not fn in eligible: + # package was made ineligible by already-failed check + continue + oldver = "%s-%s" % (pv, pr) + newver = '-'.join(newvers) + if (newver != oldver): + extra_chat = "%s (%s) already staged but upgrading to %s to satisfy %s" % (pn, oldver, newver, item) + else: + extra_chat = "Selecting already-staged %s (%s) to satisfy %s" % (pn, oldver, item) + + if verbose: + bb.note("%s" % extra_chat) + eligible.remove(fn) + eligible = [fn] + eligible + discriminated = True + break + + return eligible + diff --git a/lib/bb/shell.py b/lib/bb/shell.py index d4b4cb4df..5db488554 100644 --- a/lib/bb/shell.py +++ b/lib/bb/shell.py @@ -107,7 +107,7 @@ class BitBakeShellCommands: preferred = data.getVar( "PREFERRED_PROVIDER_%s" % item, cooker.configuration.data, 1 ) if not preferred: preferred = item try: - lv, lf, pv, pf = cooker.findBestProvider( preferred ) + lv, lf, pv, pf = bb.providers.findBestProvider(preferred, cooker.configuration.data, cooker.status, cooker.build_cache_fail, cooker.configuration.verbose) except KeyError: if item in cooker.status.providers: pf = cooker.status.providers[item][0] @@ -537,7 +537,7 @@ SRC_URI = "" if not preferred: preferred = item try: - lv, lf, pv, pf = cooker.findBestProvider( preferred ) + lv, lf, pv, pf = bb.providers.findBestProvider(preferred, cooker.configuration.data, cooker.status, cooker.build_cache_fail, cooker.configuration.verbose) except KeyError: lv, lf, pv, pf = (None,)*4 |