summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/providers.py
diff options
context:
space:
mode:
authorRichard Purdie <richard@openedhand.com>2007-09-02 14:10:08 +0000
committerRichard Purdie <richard@openedhand.com>2007-09-02 14:10:08 +0000
commite223238b1b88c9b6888972b7944b3854319e4928 (patch)
treeae78533078bd8e7382d50778cec144541eae65f6 /bitbake/lib/bb/providers.py
parent1cf731b1e3bb125449c2ef4e1194b6bf69e7b667 (diff)
downloadpoky-e223238b1b88c9b6888972b7944b3854319e4928.tar.gz
bitbake: Update to latest bitbake-1.8 branch
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@2651 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'bitbake/lib/bb/providers.py')
-rw-r--r--bitbake/lib/bb/providers.py94
1 files changed, 73 insertions, 21 deletions
diff --git a/bitbake/lib/bb/providers.py b/bitbake/lib/bb/providers.py
index e6f08fb4bd..da762d3d5b 100644
--- a/bitbake/lib/bb/providers.py
+++ b/bitbake/lib/bb/providers.py
@@ -31,12 +31,12 @@ class NoProvider(Exception):
31class NoRProvider(Exception): 31class NoRProvider(Exception):
32 """Exception raised when no provider of a runtime dependency can be found""" 32 """Exception raised when no provider of a runtime dependency can be found"""
33 33
34def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): 34
35def sortPriorities(pn, dataCache, pkg_pn = None):
35 """ 36 """
36 If there is a PREFERRED_VERSION, find the highest-priority bbfile 37 Reorder pkg_pn by file priority and default preference
37 providing that version. If not, find the latest version provided by
38 an bbfile in the highest-priority set.
39 """ 38 """
39
40 if not pkg_pn: 40 if not pkg_pn:
41 pkg_pn = dataCache.pkg_pn 41 pkg_pn = dataCache.pkg_pn
42 42
@@ -44,14 +44,30 @@ def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None):
44 priorities = {} 44 priorities = {}
45 for f in files: 45 for f in files:
46 priority = dataCache.bbfile_priority[f] 46 priority = dataCache.bbfile_priority[f]
47 preference = dataCache.pkg_dp[f]
47 if priority not in priorities: 48 if priority not in priorities:
48 priorities[priority] = [] 49 priorities[priority] = {}
49 priorities[priority].append(f) 50 if preference not in priorities[priority]:
50 p_list = priorities.keys() 51 priorities[priority][preference] = []
51 p_list.sort(lambda a, b: a - b) 52 priorities[priority][preference].append(f)
53 pri_list = priorities.keys()
54 pri_list.sort(lambda a, b: a - b)
52 tmp_pn = [] 55 tmp_pn = []
53 for p in p_list: 56 for pri in pri_list:
54 tmp_pn = [priorities[p]] + tmp_pn 57 pref_list = priorities[pri].keys()
58 pref_list.sort(lambda a, b: b - a)
59 tmp_pref = []
60 for pref in pref_list:
61 tmp_pref.extend(priorities[pri][pref])
62 tmp_pn = [tmp_pref] + tmp_pn
63
64 return tmp_pn
65
66
67def findPreferredProvider(pn, cfgData, dataCache, pkg_pn = None, item = None):
68 """
69 Find the first provider in pkg_pn with a PREFERRED_VERSION set.
70 """
55 71
56 preferred_file = None 72 preferred_file = None
57 73
@@ -76,7 +92,7 @@ def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None):
76 preferred_e = None 92 preferred_e = None
77 preferred_r = None 93 preferred_r = None
78 94
79 for file_set in tmp_pn: 95 for file_set in pkg_pn:
80 for f in file_set: 96 for f in file_set:
81 pe,pv,pr = dataCache.pkg_pepvpr[f] 97 pe,pv,pr = dataCache.pkg_pepvpr[f]
82 if preferred_v == pv and (preferred_r == pr or preferred_r == None) and (preferred_e == pe or preferred_e == None): 98 if preferred_v == pv and (preferred_r == pr or preferred_r == None) and (preferred_e == pe or preferred_e == None):
@@ -99,14 +115,18 @@ def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None):
99 else: 115 else:
100 bb.msg.debug(1, bb.msg.domain.Provider, "selecting %s as PREFERRED_VERSION %s of package %s%s" % (preferred_file, pv_str, pn, itemstr)) 116 bb.msg.debug(1, bb.msg.domain.Provider, "selecting %s as PREFERRED_VERSION %s of package %s%s" % (preferred_file, pv_str, pn, itemstr))
101 117
102 del localdata 118 return (preferred_v, preferred_file)
119
103 120
104 # get highest priority file set 121def findLatestProvider(pn, cfgData, dataCache, file_set):
105 files = tmp_pn[0] 122 """
123 Return the highest version of the providers in file_set.
124 Take default preferences into account.
125 """
106 latest = None 126 latest = None
107 latest_p = 0 127 latest_p = 0
108 latest_f = None 128 latest_f = None
109 for file_name in files: 129 for file_name in file_set:
110 pe,pv,pr = dataCache.pkg_pepvpr[file_name] 130 pe,pv,pr = dataCache.pkg_pepvpr[file_name]
111 dp = dataCache.pkg_dp[file_name] 131 dp = dataCache.pkg_dp[file_name]
112 132
@@ -114,11 +134,29 @@ def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None):
114 latest = (pe, pv, pr) 134 latest = (pe, pv, pr)
115 latest_f = file_name 135 latest_f = file_name
116 latest_p = dp 136 latest_p = dp
137
138 return (latest, latest_f)
139
140
141def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None):
142 """
143 If there is a PREFERRED_VERSION, find the highest-priority bbfile
144 providing that version. If not, find the latest version provided by
145 an bbfile in the highest-priority set.
146 """
147
148 sortpkg_pn = sortPriorities(pn, dataCache, pkg_pn)
149 # Find the highest priority provider with a PREFERRED_VERSION set
150 (preferred_ver, preferred_file) = findPreferredProvider(pn, cfgData, dataCache, sortpkg_pn, item)
151 # Find the latest version of the highest priority provider
152 (latest, latest_f) = findLatestProvider(pn, cfgData, dataCache, sortpkg_pn[0])
153
117 if preferred_file is None: 154 if preferred_file is None:
118 preferred_file = latest_f 155 preferred_file = latest_f
119 preferred_ver = latest 156 preferred_ver = latest
120 157
121 return (latest,latest_f,preferred_ver, preferred_file) 158 return (latest, latest_f, preferred_ver, preferred_file)
159
122 160
123def _filterProviders(providers, item, cfgData, dataCache): 161def _filterProviders(providers, item, cfgData, dataCache):
124 """ 162 """
@@ -127,6 +165,7 @@ def _filterProviders(providers, item, cfgData, dataCache):
127 """ 165 """
128 eligible = [] 166 eligible = []
129 preferred_versions = {} 167 preferred_versions = {}
168 sortpkg_pn = {}
130 169
131 # The order of providers depends on the order of the files on the disk 170 # The order of providers depends on the order of the files on the disk
132 # up to here. Sort pkg_pn to make dependency issues reproducible rather 171 # up to here. Sort pkg_pn to make dependency issues reproducible rather
@@ -143,15 +182,24 @@ def _filterProviders(providers, item, cfgData, dataCache):
143 182
144 bb.msg.debug(1, bb.msg.domain.Provider, "providers for %s are: %s" % (item, pkg_pn.keys())) 183 bb.msg.debug(1, bb.msg.domain.Provider, "providers for %s are: %s" % (item, pkg_pn.keys()))
145 184
185 # First add PREFERRED_VERSIONS
186 for pn in pkg_pn.keys():
187 sortpkg_pn[pn] = sortPriorities(pn, dataCache, pkg_pn)
188 preferred_versions[pn] = findPreferredProvider(pn, cfgData, dataCache, sortpkg_pn[pn], item)
189 if preferred_versions[pn][1]:
190 eligible.append(preferred_versions[pn][1])
191
192 # Now add latest verisons
146 for pn in pkg_pn.keys(): 193 for pn in pkg_pn.keys():
147 preferred_versions[pn] = bb.providers.findBestProvider(pn, cfgData, dataCache, pkg_pn, item)[2:4] 194 if pn in preferred_versions and preferred_versions[pn][1]:
195 continue
196 preferred_versions[pn] = findLatestProvider(pn, cfgData, dataCache, sortpkg_pn[pn][0])
148 eligible.append(preferred_versions[pn][1]) 197 eligible.append(preferred_versions[pn][1])
149 198
150 if len(eligible) == 0: 199 if len(eligible) == 0:
151 bb.msg.error(bb.msg.domain.Provider, "no eligible providers for %s" % item) 200 bb.msg.error(bb.msg.domain.Provider, "no eligible providers for %s" % item)
152 return 0 201 return 0
153 202
154
155 # If pn == item, give it a slight default preference 203 # If pn == item, give it a slight default preference
156 # This means PREFERRED_PROVIDER_foobar defaults to foobar if available 204 # This means PREFERRED_PROVIDER_foobar defaults to foobar if available
157 for p in providers: 205 for p in providers:
@@ -192,7 +240,7 @@ def _filterProviders(providers, item, cfgData, dataCache):
192 eligible = [fn] + eligible 240 eligible = [fn] + eligible
193 break 241 break
194 242
195 return eligible, preferred_versions 243 return eligible
196 244
197 245
198def filterProviders(providers, item, cfgData, dataCache): 246def filterProviders(providers, item, cfgData, dataCache):
@@ -202,7 +250,7 @@ def filterProviders(providers, item, cfgData, dataCache):
202 Takes a "normal" target item 250 Takes a "normal" target item
203 """ 251 """
204 252
205 eligible, pref_vers = _filterProviders(providers, item, cfgData, dataCache) 253 eligible = _filterProviders(providers, item, cfgData, dataCache)
206 254
207 prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % item, cfgData, 1) 255 prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % item, cfgData, 1)
208 if prefervar: 256 if prefervar:
@@ -219,6 +267,8 @@ def filterProviders(providers, item, cfgData, dataCache):
219 foundUnique = True 267 foundUnique = True
220 break 268 break
221 269
270 bb.msg.debug(1, bb.msg.domain.Provider, "sorted providers for %s are: %s" % (item, eligible))
271
222 return eligible, foundUnique 272 return eligible, foundUnique
223 273
224def filterProvidersRunTime(providers, item, cfgData, dataCache): 274def filterProvidersRunTime(providers, item, cfgData, dataCache):
@@ -228,7 +278,7 @@ def filterProvidersRunTime(providers, item, cfgData, dataCache):
228 Takes a "runtime" target item 278 Takes a "runtime" target item
229 """ 279 """
230 280
231 eligible, pref_vers = _filterProviders(providers, item, cfgData, dataCache) 281 eligible = _filterProviders(providers, item, cfgData, dataCache)
232 282
233 # Should use dataCache.preferred here? 283 # Should use dataCache.preferred here?
234 preferred = [] 284 preferred = []
@@ -246,6 +296,8 @@ def filterProvidersRunTime(providers, item, cfgData, dataCache):
246 296
247 numberPreferred = len(preferred) 297 numberPreferred = len(preferred)
248 298
299 bb.msg.debug(1, bb.msg.domain.Provider, "sorted providers for %s are: %s" % (item, eligible))
300
249 return eligible, numberPreferred 301 return eligible, numberPreferred
250 302
251def getRuntimeProviders(dataCache, rdepend): 303def getRuntimeProviders(dataCache, rdepend):