summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@linux.intel.com>2006-07-08 12:54:31 +0000
committerRichard Purdie <rpurdie@linux.intel.com>2006-07-08 12:54:31 +0000
commit856526609b2cd88a3f272ff6f4564d877a1e8c43 (patch)
tree63e7c3d7ccdc8d8310385d40a0b427832640daf9
parent7d55491f88ff90a4c16ad87b1483d55b1824acfc (diff)
downloadbitbake-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-xbin/bitbake141
-rw-r--r--lib/bb/__init__.py1
-rw-r--r--lib/bb/providers.py163
-rw-r--r--lib/bb/shell.py4
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