From 62dc8f47b3c17cf0b1a5d4bf4f0173d5d4fb4c1a Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Fri, 10 Feb 2006 10:11:32 +0000 Subject: [PATCH] Update bitbake to latest bitbake svn git-svn-id: https://svn.o-hand.com/repos/poky/trunk@262 311d38ba-8fff-0310-9ca6-ca027cbcb966 --- bitbake/ChangeLog | 17 ++ bitbake/MANIFEST | 8 +- bitbake/bin/bitbake | 244 ++++++++++++++++--- bitbake/bin/bitbakec | Bin 27715 -> 38998 bytes bitbake/doc/manual/usermanual.xml | 6 + bitbake/lib/bb/__init__.py | 2 +- bitbake/lib/bb/parse/__init__.py | 9 +- bitbake/lib/bb/parse/parse_py/ConfHandler.py | 19 +- bitbake/lib/bb/shell.py | 33 ++- bitbake/lib/bb/utils.py | 24 ++ bitbake/setup.py | 2 +- 11 files changed, 325 insertions(+), 39 deletions(-) diff --git a/bitbake/ChangeLog b/bitbake/ChangeLog index db503ffb1a..e8a91c1701 100644 --- a/bitbake/ChangeLog +++ b/bitbake/ChangeLog @@ -1,3 +1,20 @@ +Changes in BitBake 1.3.?: + - Create a new Fetcher module to ease the + development of new Fetchers. + Issue #438 fixed by rpurdie@openedhand.com + - Make the Subversion fetcher honor the SRC Date + (CVSDATE). + Issue #555 fixed by chris@openedhand.com + - Expand PREFERRED_PROVIDER properly + Issue #436 fixed by rprudie@openedhand.com + - Typo fix for Issue #531 Philipp Zabel for the + BitBake Shell + - Introduce a new special variable SRCDATE as + a generic naming to take over CVSDATE. + - Introduce a new keyword 'required' In contrast + to include parsing will fail if a to be included + can not be found. + Changes in BitBake 1.3.2: - reintegration of make.py into BitBake - bbread is gone, use bitbake -e diff --git a/bitbake/MANIFEST b/bitbake/MANIFEST index 71e3605a47..cf0aac99d9 100644 --- a/bitbake/MANIFEST +++ b/bitbake/MANIFEST @@ -9,7 +9,13 @@ lib/bb/build.py lib/bb/data.py lib/bb/data_smart.py lib/bb/event.py -lib/bb/fetch.py +lib/bb/fetch/bk.py +lib/bb/fetch/cvs.py +lib/bb/fetch/git.py +lib/bb/fetch/__init__.py +lib/bb/fetch/local.py +lib/bb/fetch/svn.py +lib/bb/fetch/wget.py lib/bb/manifest.py lib/bb/parse/__init__.py lib/bb/parse/parse_py/BBHandler.py diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake index dac3c93749..09417f6eca 100755 --- a/bitbake/bin/bitbake +++ b/bitbake/bin/bitbake @@ -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: diff --git a/bitbake/bin/bitbakec b/bitbake/bin/bitbakec index dc2e0a9fa957ea821a7ade7dd9927307e4e9debc..db6a1603030bb56b4158a131be430027e7d63526 100644 GIT binary patch literal 38998 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 s9Pr`(92aG|z8xcPjvN{r9Qj@MyY3$i Inclusion Next, there is the include directive, which causes BitBake to parse in whatever file you specify, and insert it at that location, which is not unlike make. However, if the path specified on the include line is a relative path, BitBake will locate the first one it can find within BBPATH. +
+ Requiring Inclusion + In contrast to the include directive, require will +raise an ParseError if the to be included file can not be found. Otherwise it will behave just like the +include directive. +
Python variable expansion DATE = "${@time.strftime('%Y%m%d',time.gmtime())}" diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index 00b0e8b57f..f27f53b39d 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py @@ -23,7 +23,7 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. """ -__version__ = "1.3.2" +__version__ = "1.3.2.1" __all__ = [ diff --git a/bitbake/lib/bb/parse/__init__.py b/bitbake/lib/bb/parse/__init__.py index b8839c09fd..cb27416061 100644 --- a/bitbake/lib/bb/parse/__init__.py +++ b/bitbake/lib/bb/parse/__init__.py @@ -26,6 +26,8 @@ __all__ = [ 'ParseError', 'SkipPackage', 'cached_mtime', 'mark_dependency', 'supports', 'handle', 'init' ] handlers = [] +import bb, os + class ParseError(Exception): """Exception raised when parsing fails""" @@ -34,13 +36,14 @@ class SkipPackage(Exception): __mtime_cache = {} def cached_mtime(f): - import os if not __mtime_cache.has_key(f): - __mtime_cache[f] = os.stat(f)[8] + update_mtime(f) return __mtime_cache[f] +def update_mtime(f): + __mtime_cache[f] = os.stat(f)[8] + def mark_dependency(d, f): - import bb, os if f.startswith('./'): f = "%s/%s" % (os.getcwd(), f[2:]) deps = (bb.data.getVar('__depends', d) or "").split() diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/parse/parse_py/ConfHandler.py index 41ef96d557..90978300af 100644 --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py @@ -28,6 +28,7 @@ from bb.parse import ParseError #__config_regexp__ = re.compile( r"(?Pexport\s*)?(?P[a-zA-Z0-9\-_+.${}]+)\s*(?P:)?(?P\?)?=\s*(?P['\"]?)(?P.*)(?P=apo)$") __config_regexp__ = re.compile( r"(?Pexport\s*)?(?P[a-zA-Z0-9\-_+.${}/]+)(\[(?P[a-zA-Z0-9\-_+.]+)\])?\s*((?P:=)|(?P\?=)|(?P\+=)|(?P=\+)|(?P=\.)|(?P\.=)|=)\s*(?P['\"]?)(?P.*)(?P=apo)$") __include_regexp__ = re.compile( r"include\s+(.+)" ) +__require_regexp__ = re.compile( r"require\s+(.+)" ) def init(data): if not bb.data.getVar('TOPDIR', data): @@ -83,7 +84,11 @@ def obtain(fn, data = bb.data.init()): return localfn -def include(oldfn, fn, data = bb.data.init()): +def include(oldfn, fn, data = bb.data.init(), error_out = False): + """ + + error_out If True a ParseError will be reaised if the to be included + """ if oldfn == fn: # prevent infinate recursion return None @@ -93,8 +98,10 @@ def include(oldfn, fn, data = bb.data.init()): from bb.parse import handle try: - ret = handle(fn, data, 1) + ret = handle(fn, data, True) except IOError: + if error_out: + raise ParseError("Could not include required file %(fn)s" % vars() ) debug(2, "CONF file '%s' not found" % fn) def handle(fn, data = bb.data.init(), include = 0): @@ -125,7 +132,7 @@ def handle(fn, data = bb.data.init(), include = 0): debug(1, "CONF %s %s" % (inc_string, currname)) break if f is None: - raise IOError("file not found") + raise IOError("file '%s' not found" % fn) else: f = open(fn,'r') debug(1, "CONF %s %s" % (inc_string,fn)) @@ -191,6 +198,12 @@ def feeder(lineno, s, fn, data = bb.data.init()): include(fn, s, data) return + m = __require_regexp__.match(s) + if m: + s = bb.data.expand(m.group(1), data) + include(fn, s, data, True) + return + raise ParseError("%s:%d: unparsed line: '%s'" % (fn, lineno, s)); # Add us to the handlers list diff --git a/bitbake/lib/bb/shell.py b/bitbake/lib/bb/shell.py index 97e61e1169..b86dc9753c 100644 --- a/bitbake/lib/bb/shell.py +++ b/bitbake/lib/bb/shell.py @@ -18,6 +18,12 @@ # Place, Suite 330, Boston, MA 02111-1307 USA. # ########################################################################## +# +# Thanks to: +# * Holger Freyther +# * Justin Patrin +# +########################################################################## """ BitBake Shell @@ -53,7 +59,7 @@ import sys, os, imp, readline, socket, httplib, urllib, commands, popen2, copy, imp.load_source( "bitbake", os.path.dirname( sys.argv[0] )+"/bitbake" ) from bb import data, parse, build, fatal -__version__ = "0.5.2" +__version__ = "0.5.3" __credits__ = """BitBake Shell Version %s (C) 2005 Michael 'Mickey' Lauer Type 'help' for more information, press CTRL-D to exit.""" % __version__ @@ -151,7 +157,7 @@ class BitBakeShellCommands: for name in names: try: - cooker.buildProvider( name ) + cooker.buildProvider( name, data.getVar("BUILD_ALL_DEPS", cooker.configuration.data, True) ) except build.EventException, e: print "ERROR: Couldn't build '%s'" % name global last_exception @@ -252,6 +258,19 @@ class BitBakeShellCommands: self.fileBuild( params ) fileRebuild.usage = "" + def fileReparse( self, params ): + """(re)Parse a bb file""" + bbfile = params[0] + print "SHELL: Parsing '%s'" % bbfile + parse.update_mtime( bbfile ) + bb_data, fromCache = cooker.load_bbfile( bbfile ) + cooker.pkgdata[bbfile] = bb_data + if fromCache: + print "SHELL: File has not been updated, not reparsing" + else: + print "SHELL: Parsed" + fileReparse.usage = "" + def force( self, params ): """Toggle force task execution flag (see bitbake -f)""" cooker.configuration.force = not cooker.configuration.force @@ -391,6 +410,16 @@ SRC_URI = "" parsed = True print + def reparse( self, params ): + """(re)Parse a providee's bb file""" + bbfile = self._findProvider( params[0] ) + if bbfile is not None: + print "SHELL: Found bbfile '%s' for '%s'" % ( bbfile, params[0] ) + self.fileReparse( [ bbfile ] ) + else: + print "ERROR: Nothing provides '%s'" % params[0] + reparse.usage = "" + def getvar( self, params ): """Dump the contents of an outer BitBake environment variable""" var = params[0] diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index ee8713a2d0..e2319aa123 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -69,3 +69,27 @@ def vercmp(ta, tb): if (r == 0): r = vercmp_part(ra, rb) return r + +def explode_deps(s): + """ + Take an RDEPENDS style string of format: + "DEPEND1 (optional version) DEPEND2 (optional version) ..." + and return a list of dependencies. + Version information is ignored. + """ + r = [] + l = s.split() + flag = False + for i in l: + if i[0] == '(': + flag = True + j = [] + if flag: + j.append(i) + if i.endswith(')'): + flag = False + # Ignore version + #r[-1] += ' ' + ' '.join(j) + else: + r.append(i) + return r diff --git a/bitbake/setup.py b/bitbake/setup.py index a94c967d99..adb14a7553 100755 --- a/bitbake/setup.py +++ b/bitbake/setup.py @@ -55,7 +55,7 @@ setup(name='bitbake', long_description='BitBake is a simple tool for the execution of tasks. It is derived from Portage, which is the package management system used by the Gentoo Linux distribution. It is most commonly used to build packages, as it can easily use its rudamentary inheritence to abstract common operations, such as fetching sources, unpacking them, patching them, compiling them, and so on. It is the basis of the OpenEmbedded project, which is being used for OpenZaurus, Familiar, and a number of other Linux distributions.', author='Chris Larson', author_email='clarson@elinux.org', - packages=['bb', 'bb.parse', 'bb.parse.parse_py'], + packages=['bb', 'bb.fetch', 'bb.parse', 'bb.parse.parse_py'], package_dir={'bb': os.path.join('lib', 'bb')}, scripts=[os.path.join('bin', 'bitbake'), os.path.join('bin', 'bbimage')],