1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-30 00:20:08 +00:00

Update bitbake to latest bitbake svn

git-svn-id: https://svn.o-hand.com/repos/poky/trunk@262 311d38ba-8fff-0310-9ca6-ca027cbcb966
This commit is contained in:
Richard Purdie
2006-02-10 10:11:32 +00:00
parent 9a262964c8
commit 62dc8f47b3
11 changed files with 325 additions and 39 deletions
+216 -28
View File
@@ -46,9 +46,12 @@ class BBParsingStatus:
def __init__(self):
self.cache_dirty = False
self.providers = {}
self.rproviders = {}
self.packages = {}
self.packages_dynamic = {}
self.bbfile_priority = {}
self.bbfile_config_priorities = []
self.ignored_depedencies = None
self.ignored_dependencies = None
self.possible_world = []
self.world_target = Set()
self.pkg_pn = {}
@@ -74,7 +77,10 @@ class BBParsingStatus:
pr = bb.data.getVar('PR', bb_data, True)
dp = int(bb.data.getVar('DEFAULT_PREFERENCE', bb_data, True) or "0")
provides = Set([pn] + (bb.data.getVar("PROVIDES", bb_data, 1) or "").split())
rprovides = (bb.data.getVar("RPROVIDES", bb_data, 1) or "").split()
depends = (bb.data.getVar("DEPENDS", bb_data, True) or "").split()
packages = (bb.data.getVar('PACKAGES', bb_data, True) or "").split()
packages_dynamic = (bb.data.getVar('PACKAGES_DYNAMIC', bb_data, True) or "").split()
# build PackageName to FileName lookup table
@@ -102,6 +108,24 @@ class BBParsingStatus:
for dep in depends:
self.all_depends.add(dep)
# Build reverse hash for PACKAGES, so runtime dependencies
# can be be resolved (RDEPENDS, RRECOMMENDS etc.)
for package in packages:
if not package in self.packages:
self.packages[package] = []
self.packages[package].append(file_name)
for package in packages_dynamic:
if not package in self.packages_dynamic:
self.packages_dynamic[package] = []
self.packages_dynamic[package].append(file_name)
for rprovide in rprovides:
if not rprovide in self.rproviders:
self.rproviders[rprovide] = []
self.rproviders[rprovide].append(file_name)
# Collect files we may need for possible world-dep
# calculations
if not bb.data.getVar('BROKEN', bb_data, True) and not bb.data.getVar('EXCLUDE_FROM_WORLD', bb_data, True):
@@ -158,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 = []
@@ -194,14 +219,29 @@ class BBCooker:
self.build_cache_fail.append(fn)
raise
def tryBuild( self, fn, virtual ):
"""Build a provider and its dependencies"""
if fn in self.building_list:
def tryBuild( self, fn, virtual , buildAllDeps , build_depends = []):
"""
Build a provider and its dependencies.
build_depends is a list of previous build dependencies (not runtime)
If build_depends is empty, we're dealing with a runtime depends
"""
the_data = self.pkgdata[fn]
if not buildAllDeps:
buildAllDeps = bb.data.getVar('BUILD_ALL_DEPS', the_data, True) or False
# Error on build time dependency loops
if build_depends and build_depends.count(fn) > 1:
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]
# See if this is a runtime dependency we've already built
# Or a build dependency being handled in a different build chain
if fn in self.building_list:
return self.addRunDeps(fn, virtual , buildAllDeps)
item = self.status.pkg_fn[fn]
self.building_list.append(fn)
@@ -209,7 +249,8 @@ class BBCooker:
pathstr = "%s (%s)" % (item, virtual)
self.build_path.append(pathstr)
depends_list = (bb.data.getVar('DEPENDS', the_data, 1) or "").split()
depends_list = (bb.data.getVar('DEPENDS', the_data, True) or "").split()
if self.configuration.verbose:
bb.note("current path: %s" % (" -> ".join(self.build_path)))
bb.note("dependencies for %s are: %s" % (item, " ".join(depends_list)))
@@ -234,7 +275,7 @@ class BBCooker:
continue
if not depcmd:
continue
if self.buildProvider( dependency ) == 0:
if self.buildProvider( dependency , buildAllDeps , build_depends ) == 0:
bb.error("dependency %s (for %s) not satisfied" % (dependency,item))
failed = True
if self.configuration.abort:
@@ -247,6 +288,9 @@ class BBCooker:
self.stats.deps += 1
return False
if not self.addRunDeps(fn, virtual , buildAllDeps):
return False
if bb.build.stamp_is_current('do_%s' % self.configuration.cmd, the_data):
self.build_cache.append(fn)
return True
@@ -285,7 +329,7 @@ class BBCooker:
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, 1)
preferred_v = bb.data.getVar('PREFERRED_VERSION_%s' % pn, localdata, True)
if preferred_v:
m = re.match('(.*)_(.*)', preferred_v)
if m:
@@ -379,28 +423,17 @@ class BBCooker:
if data.getVarFlag( e, 'python', self.configuration.data ):
sys.__stdout__.write("\npython %s () {\n%s}\n" % (e, data.getVar(e, self.configuration.data, 1)))
def buildProvider( self, item ):
fn = None
discriminated = False
if item not in self.status.providers:
bb.error("Nothing provides %s" % 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)
return 1
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 all_p:
for p in providers:
pn = self.status.pkg_fn[p]
if pn not in pkg_pn:
pkg_pn[pn] = []
@@ -423,7 +456,7 @@ class BBCooker:
# 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:
for p in providers:
the_data = self.pkgdata[p]
pn = bb.data.getVar('PN', the_data, 1)
pv = bb.data.getVar('PV', the_data, 1)
@@ -448,6 +481,33 @@ class BBCooker:
discriminated = True
break
return eligible
def buildProvider( self, item , buildAllDeps , build_depends = [] ):
"""
Build something to provide a named build requirement
(takes item names from DEPENDS namespace)
"""
fn = None
discriminated = False
if not item in self.status.providers:
bb.error("Nothing provides dependency %s" % 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)
return 1
eligible = self.filterProviders(all_p, item)
if not eligible:
return 0
prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % item, self.configuration.data, 1)
if prefervar:
self.preferred[item] = prefervar
@@ -476,12 +536,140 @@ 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):
if self.tryBuild(fn, item, buildAllDeps, build_depends + [fn]):
return 1
bb.note("no buildable providers for %s" % item)
return 0
def buildRProvider( self, item , buildAllDeps ):
"""
Build something to provide a named runtime requirement
(takes item names from RDEPENDS/PACKAGES namespace)
"""
fn = None
all_p = []
discriminated = False
if not buildAllDeps:
return True
all_p = self.getProvidersRun(item)
if not all_p:
bb.error("Nothing provides runtime dependency %s" % (item))
return False
for p in all_p:
if p in self.rbuild_cache:
bb.debug(2, "Already built %s providing runtime %s\n" % (p,item))
return True
if p in self.build_cache:
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)
if not eligible:
return 0
preferred = []
for p in eligible:
pn = self.status.pkg_fn[p]
provides = self.status.pn_provides[pn]
for provide in provides:
prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % provide, self.configuration.data, 1)
if prefervar == pn:
if self.configuration.verbose:
bb.note("selecting %s to satisfy runtime %s due to PREFERRED_PROVIDERS" % (pn, item))
eligible.remove(p)
eligible = [p] + eligible
preferred.append(p)
if len(eligible) > 1 and len(preferred) == 0:
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)
if len(preferred) > 1:
if item not in self.consider_msgs_cache:
providers_list = []
for fn in preferred:
providers_list.append(self.status.pkg_fn[fn])
bb.note("multiple preferred providers are available (%s);" % ", ".join(providers_list))
bb.note("consider defining only one 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.debug(2, "selecting %s to satisfy runtime %s" % (fn, item))
if self.tryBuild(fn, item, buildAllDeps):
return True
bb.error("No buildable providers for runtime %s" % item)
return False
def getProvidersRun(self, rdepend):
"""
Return any potential providers of runtime 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):
"""
Add any runtime dependencies of runtime item provided by fn
as long as item has't previously been processed by this function.
"""
if item in self.rbuild_cache:
return True
if not buildAllDeps:
return True
rdepends = []
self.rbuild_cache.append(item)
the_data = self.pkgdata[fn]
pn = self.status.pkg_fn[fn]
if (item == pn):
rdepends += bb.utils.explode_deps(bb.data.getVar('RDEPENDS', the_data, True) or "")
rdepends += bb.utils.explode_deps(bb.data.getVar('RRECOMMENDS', the_data, True) 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, True) or "")
rdepends += bb.utils.explode_deps(bb.data.getVar("RRECOMMENDS_%s" % package, the_data, True) or "")
bb.debug(2, "Additional runtime dependencies for %s are: %s" % (item, " ".join(rdepends)))
for rdepend in rdepends:
if not self.buildRProvider(rdepend, buildAllDeps):
return False
return True
def buildDepgraph( self ):
all_depends = self.status.all_depends
pn_provides = self.status.pn_provides
@@ -694,7 +882,7 @@ class BBCooker:
for k in pkgs_to_build:
failed = False
try:
if self.buildProvider( k ) == 0:
if self.buildProvider( k , False ) == 0:
# already diagnosed
failed = True
except bb.build.EventException:
Binary file not shown.