diff options
author | Richard Purdie <richard@openedhand.com> | 2007-09-02 14:10:08 +0000 |
---|---|---|
committer | Richard Purdie <richard@openedhand.com> | 2007-09-02 14:10:08 +0000 |
commit | e223238b1b88c9b6888972b7944b3854319e4928 (patch) | |
tree | ae78533078bd8e7382d50778cec144541eae65f6 /bitbake/lib/bb/providers.py | |
parent | 1cf731b1e3bb125449c2ef4e1194b6bf69e7b667 (diff) | |
download | poky-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.py | 94 |
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): | |||
31 | class NoRProvider(Exception): | 31 | class 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 | ||
34 | def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): | 34 | |
35 | def 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 | |||
67 | def 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 | 121 | def 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 | |||
141 | def 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 | ||
123 | def _filterProviders(providers, item, cfgData, dataCache): | 161 | def _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 | ||
198 | def filterProviders(providers, item, cfgData, dataCache): | 246 | def 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 | ||
224 | def filterProvidersRunTime(providers, item, cfgData, dataCache): | 274 | def 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 | ||
251 | def getRuntimeProviders(dataCache, rdepend): | 303 | def getRuntimeProviders(dataCache, rdepend): |