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 | |
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.
-rwxr-xr-x | bin/bitbake | 141 | ||||
-rw-r--r-- | lib/bb/__init__.py | 1 | ||||
-rw-r--r-- | lib/bb/providers.py | 163 | ||||
-rw-r--r-- | lib/bb/shell.py | 4 |
4 files changed, 170 insertions, 139 deletions
diff --git a/bin/bitbake b/bin/bitbake index 742716c0b..5a9ee428b 100755 --- a/bin/bitbake +++ b/bin/bitbake @@ -24,7 +24,7 @@ import sys, os, getopt, glob, copy, os.path, re, time sys.path.insert(0,os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib')) import bb -from bb import utils, data, parse, debug, event, fatal, cache +from bb import utils, data, parse, debug, event, fatal, cache, providers from sets import Set import itertools, optparse @@ -324,81 +324,6 @@ class BBCooker: self.building_list.remove(fn) self.build_path.remove(pathstr) - def findBestProvider( self, pn, 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 = self.status.pkg_pn - - files = pkg_pn[pn] - priorities = {} - for f in files: - priority = self.status.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(self.configuration.data) - 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 = self.status.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 = self.status.pkg_pvpr[file_name] - dp = self.status.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 showVersions( self ): pkg_pn = self.status.pkg_pn @@ -407,7 +332,7 @@ class BBCooker: # Sort by priority for pn in pkg_pn.keys(): - (last_ver,last_file,pref_ver,pref_file) = self.findBestProvider(pn) + (last_ver,last_file,pref_ver,pref_file) = self.findBestProvider(pn, self.configuration.data, self.status) preferred_versions[pn] = (pref_ver, pref_file) latest_versions[pn] = (last_ver, last_file) @@ -619,64 +544,6 @@ class BBCooker: add_all_depends( pkgs_to_build, [] ) print >> alldepends_file, "}" - def filterProviders(self, providers, item): - """ - 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 = self.status.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] = self.findBestProvider(pn, pkg_pn)[2:4] - eligible.append(preferred_versions[pn][1]) - - for p in eligible: - if p in self.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 = self.status.pkg_fn[p] - pv, pr = self.status.pkg_pvpr[p] - - stamp = '%s.do_populate_staging' % self.status.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 self.configuration.verbose: - bb.note("%s" % extra_chat) - eligible.remove(fn) - eligible = [fn] + eligible - discriminated = True - break - - return eligible - def buildProvider( self, item , buildAllDeps , build_depends = [] ): """ Build something to provide a named build requirement @@ -698,7 +565,7 @@ class BBCooker: bb.debug(1, "already built %s in this run\n" % p) return 1 - eligible = self.filterProviders(all_p, item) + eligible = bb.providers.filterProviders(all_p, item, self.configuration.data, self.status, self.build_cache_fail, self.configuration.verbose) if not eligible: return 0 @@ -767,7 +634,7 @@ class BBCooker: bb.debug(2, "Already built %s but adding any further RDEPENDS for %s\n" % (p, item)) return self.addRunDeps(p, item , buildAllDeps) - eligible = self.filterProviders(all_p, item) + eligible = bb.providers.filterProviders(all_p, item, self.configuration.data, self.status, self.build_cache_fail, self.configuration.verbose) if not eligible: return 0 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 |