[oe-commits] org.nslu2-linux.bitbake temporary patch version 4 from RP
jbowler commit
openembedded-commits at lists.openembedded.org
Mon Oct 23 17:44:57 UTC 2006
temporary patch version 4 from RP
Author: jbowler at nslu2-linux.org
Branch: org.nslu2-linux.bitbake
Revision: 334c0d2dc58bf8d889b6996772fd3589ac3ce552
ViewMTN: http://monotone.openembedded.org/revision.psp?id=334c0d2dc58bf8d889b6996772fd3589ac3ce552
Files:
1
bin/bitbake
Diffs:
#
# mt diff -r17970596310cf5b084702b68f677b680fcc0d5b3 -r334c0d2dc58bf8d889b6996772fd3589ac3ce552
#
#
#
# patch "bin/bitbake"
# from [d39d47aac1a22bc0d210b1d322ae49d5b84a67ff]
# to [b1b0d707f65b8305610e2e45986075c0aa3db275]
#
============================================================
--- bin/bitbake d39d47aac1a22bc0d210b1d322ae49d5b84a67ff
+++ bin/bitbake b1b0d707f65b8305610e2e45986075c0aa3db275
@@ -182,6 +182,7 @@ class BBCooker:
def __init__( self ):
self.build_cache_fail = []
self.build_cache = []
+ self.rbuild_cache = []
self.building_list = []
self.build_path = []
self.consider_msgs_cache = []
@@ -241,14 +242,24 @@ class BBCooker:
bb.note("clean %s" % ":".join(clean_deps))
return clean_deps
- def tryBuild( self, fn, virtual , buildAllDeps ):
+ def tryBuild( self, fn, virtual , itemtype , buildAllDeps ):
"""Build a provider and its dependencies"""
- if fn in self.building_list:
- bb.error("%s depends on itself (eventually)" % fn)
- bb.error("upwards chain is: %s" % (" -> ".join(self.build_path)))
- return False
the_data = self.pkgdata[fn]
+
+ if not buildAllDeps:
+ buildAllDeps = bb.data.getVar('BUILD_ALL_DEPS', the_data, 1) or False
+
+ self.addRunDeps(fn, virtual , buildAllDeps)
+
+ if fn in self.building_list:
+ if itemtype == "runtime":
+ return True
+ else:
+ bb.error("%s depends on itself (eventually)" % fn)
+ bb.error("upwards chain is: %s" % (" -> ".join(self.build_path)))
+ return False
+
item = self.status.pkg_fn[fn]
self.building_list.append(fn)
@@ -256,37 +267,15 @@ class BBCooker:
pathstr = "%s (%s)" % (item, virtual)
self.build_path.append(pathstr)
- depends_list = (bb.data.getVar('DEPENDS', the_data, 1) or "").split()
- if not buildAllDeps:
- buildAllDeps = bb.data.getVar('BUILD_ALL_DEPS', the_data, 1) or False
- bb.note("dependencies for %s are: %s" % (item, " ".join(depends_list)))
+ depends_list = (bb.data.getVar('DEPENDS', the_data, 1) or "").split()
- if buildAllDeps:
- bb.note("building all deps")
- subdeps = []
- subdeps += bb.utils.explode_deps(bb.data.getVar('RDEPENDS', the_data, 1) or "")
- subdeps += bb.utils.explode_deps(bb.data.getVar('RRECOMMENDS', the_data, 1) or "")
- # Need to include subpackage dependencies but not circular ones
- packages = (bb.data.getVar('PACKAGES', the_data, 1).split() or "")
- for package in packages:
- #if virtual != package:
- #bb.note("%s: %s not equal to %s, skipping" % (item, virtual, package))
- #continue
- subdeps += bb.utils.explode_deps(bb.data.getVar("RDEPENDS_%s" % package, the_data, 1) or "")
- subdeps += bb.utils.explode_deps(bb.data.getVar("RRECOMMENDS_%s" % package, the_data, 1) or "")
- depends_list += self.removeSelfDeps(the_data, subdeps)
- else:
- bb.note("not building all deps")
+ bb.note("build dependencies for %s are: %s" % (item, " ".join(depends_list)))
- bb.note("dependencies for %s are: %s" % (item, " ".join(depends_list)))
-
if self.configuration.verbose:
bb.note("current path: %s" % (" -> ".join(self.build_path)))
bb.note("dependencies for %s are: %s" % (item, " ".join(depends_list)))
-
-
try:
failed = False
@@ -480,15 +469,14 @@ class BBCooker:
def buildProvider( self, item , buildAllDeps ):
fn = None
-
discriminated = False
- all_p = self.getProviders(item, buildAllDeps)
-
- if not all_p:
- bb.error("Nothing provides %s" % item)
+ if not item in self.status.providers:
+ bb.error("Nothing provides %s dependency %s" % (itemtype, item))
return 0
+ all_p = self.status.providers[item]
+
for p in all_p:
if p in self.build_cache:
bb.debug(1, "already built %s in this run\n" % p)
@@ -574,13 +562,170 @@ class BBCooker:
# run through the list until we find one that we can build
for fn in eligible:
- bb.debug(2, "selecting %s to satisfy %s" % (fn, item))
- if self.tryBuild(fn, item, buildAllDeps):
+ bb.note( "selecting %s to satisfy %s" % (fn, item))
+ if self.tryBuild(fn, item, "build", buildAllDeps):
return 1
bb.note("no buildable providers for %s" % item)
return 0
+ def getProvidersRun(self, rdepend):
+ # Get the providers of run time dependency rdepend
+ rproviders = []
+
+ if rdepend in self.status.rproviders:
+ rproviders += self.status.rproviders[rdepend]
+
+ if rdepend in self.status.packages:
+ rproviders += self.status.packages[rdepend]
+
+ if rproviders:
+ return rproviders
+
+ # Only search dynamic packages if we can't find anything in other variables
+ for pattern in self.status.packages_dynamic:
+ regexp = re.compile(pattern)
+ if regexp.match(rdepend):
+ rproviders += self.status.packages_dynamic[pattern]
+
+ return rproviders
+
+ def addRunDeps(self , fn, item , buildAllDeps):
+
+ if item in self.rbuild_cache:
+ return
+
+ rdepends = []
+ self.rbuild_cache.append(item)
+ the_data = self.pkgdata[fn]
+ pn = self.status.pkg_fn[fn]
+
+ bb.note("Building RDEPENDS for %s" % pn)
+
+ if (item == pn):
+ rdepends += bb.utils.explode_deps(bb.data.getVar('RDEPENDS', the_data, 1) or "")
+ rdepends += bb.utils.explode_deps(bb.data.getVar('RRECOMMENDS', the_data, 1) or "")
+ else:
+ packages = (bb.data.getVar('PACKAGES', the_data, 1).split() or "")
+ for package in packages:
+ if package == item:
+ rdepends += bb.utils.explode_deps(bb.data.getVar("RDEPENDS_%s" % package, the_data, 1) or "")
+ rdepends += bb.utils.explode_deps(bb.data.getVar("RRECOMMENDS_%s" % package, the_data, 1) or "")
+
+ #depends_list += self.removeSelfDeps(the_data, subdeps)
+
+ bb.note("runtime dependencies for %s are: %s" % (item, " ".join(rdepends)))
+
+ for rdepend in rdepends:
+ self.buildRProvider(rdepend, buildAllDeps)
+
+ def buildRProvider( self, item , buildAllDeps ):
+
+ fn = None
+ all_p = []
+ discriminated = False
+
+ if not buildAllDeps:
+ bb.note("not building all deps")
+ return 1
+
+ all_p = self.getProvidersRun(item)
+
+ if not all_p:
+ bb.error("Nothing provides runtime dependency %s" % (item))
+ return 0
+
+ for p in all_p:
+ if p in self.rbuild_cache:
+ bb.note("already built %s providing runtime %s\n" % (p,item))
+ return 1
+ if p in self.build_cache:
+ bb.note("Already built %s but adding any further RDEPENDS for %s\n" % (p, item))
+ self.addRunDeps(p, item , buildAllDeps)
+ return 1
+
+ eligible = []
+ preferred_versions = {}
+
+ # Collate providers by PN
+ pkg_pn = {}
+ for p in all_p:
+ pn = self.status.pkg_fn[p]
+ if pn not in pkg_pn:
+ pkg_pn[pn] = []
+ pkg_pn[pn].append(p)
+
+ bb.note("providers for runtime %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.note("rejecting already-failed %s" % p)
+ eligible.remove(p)
+
+ if len(eligible) == 0:
+ bb.error("no eligible providers for runtime %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 all_p:
+ the_data = self.pkgdata[p]
+ pn = bb.data.getVar('PN', the_data, 1)
+ pv = bb.data.getVar('PV', the_data, 1)
+ pr = bb.data.getVar('PR', the_data, 1)
+ tmpdir = bb.data.getVar('TMPDIR', the_data, 1)
+ stamp = '%s/stamps/%s-%s-%s.do_populate_staging' % (tmpdir, pn, pv, pr)
+ 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 = "; upgrading from %s to %s" % (oldver, newver)
+ else:
+ extra_chat = ""
+ if self.configuration.verbose:
+ bb.note("selecting already-staged %s to satisfy %s%s" % (pn, item, extra_chat))
+ eligible.remove(fn)
+ eligible = [fn] + eligible
+ discriminated = True
+ break
+
+ for p in eligible:
+ pn = self.status.pkg_fn[p]
+ prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % pn, self.configuration.data, 1)
+ if prefervar:
+ if self.configuration.verbose:
+ bb.note("selecting %s to satisfy runtime %s due to PREFERRED_PROVIDERS" % (pn, item))
+ eligible.remove(p)
+ eligible = [p] + eligible
+ discriminated = True
+ break
+
+ if len(eligible) > 1 and discriminated == False:
+ if item not in self.consider_msgs_cache:
+ providers_list = []
+ for fn in eligible:
+ providers_list.append(self.status.pkg_fn[fn])
+ bb.note("multiple providers are available (%s);" % ", ".join(providers_list))
+ bb.note("consider defining a PREFERRED_PROVIDER to match runtime %s" % item)
+ self.consider_msgs_cache.append(item)
+
+ # run through the list until we find one that we can build
+ for fn in eligible:
+ bb.note("selecting %s to satisfy runtime %s" % (fn, item))
+ if self.tryBuild(fn, item, "runtime", buildAllDeps):
+ return 1
+
+ bb.note("no buildable providers for runtime %s" % item)
+ return 0
+
def buildDepgraph( self ):
all_depends = self.status.all_depends
pn_provides = self.status.pn_provides
More information about the Openembedded-commits
mailing list