diff options
Diffstat (limited to 'bitbake/bin')
| -rwxr-xr-x | bitbake/bin/bbimage | 154 | ||||
| -rwxr-xr-x | bitbake/bin/bitbake | 1131 | ||||
| -rwxr-xr-x | bitbake/bin/bitdoc | 540 |
3 files changed, 0 insertions, 1825 deletions
diff --git a/bitbake/bin/bbimage b/bitbake/bin/bbimage deleted file mode 100755 index df6caa28ed..0000000000 --- a/bitbake/bin/bbimage +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env python -# ex:ts=4:sw=4:sts=4:et -# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -# -# Copyright (C) 2003 Chris Larson -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 59 Temple -# Place, Suite 330, Boston, MA 02111-1307 USA. - -import sys, os -sys.path.append(os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib')) -import bb -from bb import * - -__version__ = 1.0 -type = "jffs2" -cfg_bb = data.init() -cfg_oespawn = data.init() - - -def usage(): - print "Usage: bbimage [options ...]" - print "Creates an image for a target device from a root filesystem," - print "obeying configuration parameters from the BitBake" - print "configuration files, thereby easing handling of deviceisms." - print "" - print " %s\t\t%s" % ("-r [arg], --root [arg]", "root directory (default=${IMAGE_ROOTFS})") - print " %s\t\t%s" % ("-t [arg], --type [arg]", "image type (jffs2[default], cramfs)") - print " %s\t\t%s" % ("-n [arg], --name [arg]", "image name (override IMAGE_NAME variable)") - print " %s\t\t%s" % ("-v, --version", "output version information and exit") - sys.exit(0) - -def version(): - print "BitBake Build Tool Core version %s" % bb.__version__ - print "BBImage version %s" % __version__ - -def emit_bb(d, base_d = {}): - for v in d.keys(): - if d[v] != base_d[v]: - data.emit_var(v, d) - -def getopthash(l): - h = {} - for (opt, val) in l: - h[opt] = val - return h - -import getopt -try: - (opts, args) = getopt.getopt(sys.argv[1:], 'vr:t:e:n:', [ 'version', 'root=', 'type=', 'bbfile=', 'name=' ]) -except getopt.GetoptError: - usage() - -# handle opts -opthash = getopthash(opts) - -if '--version' in opthash or '-v' in opthash: - version() - sys.exit(0) - -try: - cfg_bb = parse.handle(os.path.join('conf', 'bitbake.conf'), cfg_bb) -except IOError: - fatal("Unable to open bitbake.conf") - -# sanity check -if cfg_bb is None: - fatal("Unable to open/parse %s" % os.path.join('conf', 'bitbake.conf')) - usage(1) - -rootfs = None -extra_files = [] - -if '--root' in opthash: - rootfs = opthash['--root'] -if '-r' in opthash: - rootfs = opthash['-r'] - -if '--type' in opthash: - type = opthash['--type'] -if '-t' in opthash: - type = opthash['-t'] - -if '--bbfile' in opthash: - extra_files.append(opthash['--bbfile']) -if '-e' in opthash: - extra_files.append(opthash['-e']) - -for f in extra_files: - try: - cfg_bb = parse.handle(f, cfg_bb) - except IOError: - print "unable to open %s" % f - -if not rootfs: - rootfs = data.getVar('IMAGE_ROOTFS', cfg_bb, 1) - -if not rootfs: - bb.fatal("IMAGE_ROOTFS not defined") - -data.setVar('IMAGE_ROOTFS', rootfs, cfg_bb) - -from copy import copy, deepcopy -localdata = data.createCopy(cfg_bb) - -overrides = data.getVar('OVERRIDES', localdata) -if not overrides: - bb.fatal("OVERRIDES not defined.") -data.setVar('OVERRIDES', '%s:%s' % (overrides, type), localdata) -data.update_data(localdata) -data.setVar('OVERRIDES', overrides, localdata) - -if '-n' in opthash: - data.setVar('IMAGE_NAME', opthash['-n'], localdata) -if '--name' in opthash: - data.setVar('IMAGE_NAME', opthash['--name'], localdata) - -topdir = data.getVar('TOPDIR', localdata, 1) or os.getcwd() - -cmd = data.getVar('IMAGE_CMD', localdata, 1) -if not cmd: - bb.fatal("IMAGE_CMD not defined") - -outdir = data.getVar('DEPLOY_DIR_IMAGE', localdata, 1) -if not outdir: - bb.fatal('DEPLOY_DIR_IMAGE not defined') -mkdirhier(outdir) - -#depends = data.getVar('IMAGE_DEPENDS', localdata, 1) or "" -#if depends: -# bb.note("Spawning bbmake to satisfy dependencies: %s" % depends) -# ret = os.system('bbmake %s' % depends) -# if ret != 0: -# bb.error("executing bbmake to satisfy dependencies") - -bb.note("Executing %s" % cmd) -data.setVar('image_cmd', cmd, localdata) -data.setVarFlag('image_cmd', 'func', 1, localdata) -try: - bb.build.exec_func('image_cmd', localdata) -except bb.build.FuncFailed: - sys.exit(1) -#ret = os.system(cmd) -#sys.exit(ret) diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake deleted file mode 100755 index 7fbe7ed5eb..0000000000 --- a/bitbake/bin/bitbake +++ /dev/null @@ -1,1131 +0,0 @@ -#!/usr/bin/env python -# ex:ts=4:sw=4:sts=4:et -# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -# -# Copyright (C) 2003, 2004 Chris Larson -# Copyright (C) 2003, 2004 Phil Blundell -# Copyright (C) 2003 - 2005 Michael 'Mickey' Lauer -# Copyright (C) 2005 Holger Hans Peter Freyther -# Copyright (C) 2005 ROAD GmbH -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 59 Temple -# Place, Suite 330, Boston, MA 02111-1307 USA. - -import sys, os, getopt, glob, copy, os.path, re, time -sys.path.insert(0,os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib')) -import bb -from bb import utils, data, parse, debug, event, fatal, cache -from sets import Set -import itertools, optparse - -parsespin = itertools.cycle( r'|/-\\' ) -bbdebug = 0 - -__version__ = "1.4.3" - -#============================================================================# -# BBParsingStatus -#============================================================================# -class BBParsingStatus: - """ - The initial idea for this status class is to use the data when it is - already loaded instead of loading it from various place over and over - again. - """ - - def __init__(self): - self.providers = {} - self.rproviders = {} - self.packages = {} - self.packages_dynamic = {} - self.bbfile_priority = {} - self.bbfile_config_priorities = [] - self.ignored_dependencies = None - self.possible_world = [] - self.world_target = Set() - self.pkg_pn = {} - self.pkg_fn = {} - self.pkg_pvpr = {} - self.pkg_dp = {} - self.pn_provides = {} - self.all_depends = Set() - self.build_all = {} - self.rundeps = {} - self.runrecs = {} - self.stamp = {} - - def handle_bb_data(self, file_name, bb_cache, cached): - """ - We will fill the dictionaries with the stuff we - need for building the tree more fast - """ - - pn = bb_cache.getVar('PN', file_name, True) - pv = bb_cache.getVar('PV', file_name, True) - pr = bb_cache.getVar('PR', file_name, True) - dp = int(bb_cache.getVar('DEFAULT_PREFERENCE', file_name, True) or "0") - provides = Set([pn] + (bb_cache.getVar("PROVIDES", file_name, True) or "").split()) - depends = (bb_cache.getVar("DEPENDS", file_name, True) or "").split() - packages = (bb_cache.getVar('PACKAGES', file_name, True) or "").split() - packages_dynamic = (bb_cache.getVar('PACKAGES_DYNAMIC', file_name, True) or "").split() - rprovides = (bb_cache.getVar("RPROVIDES", file_name, True) or "").split() - - # build PackageName to FileName lookup table - if pn not in self.pkg_pn: - self.pkg_pn[pn] = [] - self.pkg_pn[pn].append(file_name) - - self.build_all[file_name] = int(bb_cache.getVar('BUILD_ALL_DEPS', file_name, True) or "0") - self.stamp[file_name] = bb_cache.getVar('STAMP', file_name, True) - - # build FileName to PackageName lookup table - self.pkg_fn[file_name] = pn - self.pkg_pvpr[file_name] = (pv,pr) - self.pkg_dp[file_name] = dp - - # Build forward and reverse provider hashes - # Forward: virtual -> [filenames] - # Reverse: PN -> [virtuals] - if pn not in self.pn_provides: - self.pn_provides[pn] = Set() - self.pn_provides[pn] |= provides - - for provide in provides: - if provide not in self.providers: - self.providers[provide] = [] - self.providers[provide].append(file_name) - - 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) - rprovides += (bb_cache.getVar("RPROVIDES_%s" % package, file_name, 1) or "").split() - - 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) - - # Build hash of runtime depeneds and rececommends - - def add_dep(deplist, deps): - for dep in deps: - if not dep in deplist: - deplist[dep] = "" - - if not file_name in self.rundeps: - self.rundeps[file_name] = {} - if not file_name in self.runrecs: - self.runrecs[file_name] = {} - - for package in packages + [pn]: - if not package in self.rundeps[file_name]: - self.rundeps[file_name][package] = {} - if not package in self.runrecs[file_name]: - self.runrecs[file_name][package] = {} - - add_dep(self.rundeps[file_name][package], bb.utils.explode_deps(bb_cache.getVar('RDEPENDS', file_name, True) or "")) - add_dep(self.runrecs[file_name][package], bb.utils.explode_deps(bb_cache.getVar('RRECOMMENDS', file_name, True) or "")) - add_dep(self.rundeps[file_name][package], bb.utils.explode_deps(bb_cache.getVar("RDEPENDS_%s" % package, file_name, True) or "")) - add_dep(self.runrecs[file_name][package], bb.utils.explode_deps(bb_cache.getVar("RRECOMMENDS_%s" % package, file_name, True) or "")) - - # Collect files we may need for possible world-dep - # calculations - if not bb_cache.getVar('BROKEN', file_name, True) and not bb_cache.getVar('EXCLUDE_FROM_WORLD', file_name, True): - self.possible_world.append(file_name) - - -#============================================================================# -# BBStatistics -#============================================================================# -class BBStatistics: - """ - Manage build statistics for one run - """ - def __init__(self ): - self.attempt = 0 - self.success = 0 - self.fail = 0 - self.deps = 0 - - def show( self ): - print "Build statistics:" - print " Attempted builds: %d" % self.attempt - if self.fail: - print " Failed builds: %d" % self.fail - if self.deps: - print " Dependencies not satisfied: %d" % self.deps - if self.fail or self.deps: return 1 - else: return 0 - - -#============================================================================# -# BBOptions -#============================================================================# -class BBConfiguration( object ): - """ - Manages build options and configurations for one run - """ - def __init__( self, options ): - for key, val in options.__dict__.items(): - setattr( self, key, val ) - -#============================================================================# -# BBCooker -#============================================================================# -class BBCooker: - """ - Manages one bitbake build run - """ - - ParsingStatus = BBParsingStatus # make it visible from the shell - Statistics = BBStatistics # make it visible from the shell - - def __init__( self ): - self.build_cache_fail = [] - self.build_cache = [] - self.rbuild_cache = [] - self.building_list = [] - self.build_path = [] - self.consider_msgs_cache = [] - self.preferred = {} - self.stats = BBStatistics() - self.status = None - - self.cache = None - self.bb_cache = None - - def tryBuildPackage( self, fn, item, the_data ): - """Build one package""" - bb.event.fire(bb.event.PkgStarted(item, the_data)) - try: - self.stats.attempt += 1 - if self.configuration.force: - bb.data.setVarFlag('do_%s' % self.configuration.cmd, 'force', 1, the_data) - if not self.configuration.dry_run: - bb.build.exec_task('do_%s' % self.configuration.cmd, the_data) - bb.event.fire(bb.event.PkgSucceeded(item, the_data)) - self.build_cache.append(fn) - return True - except bb.build.FuncFailed: - self.stats.fail += 1 - bb.error("task stack execution failed") - bb.event.fire(bb.event.PkgFailed(item, the_data)) - self.build_cache_fail.append(fn) - raise - except bb.build.EventException, e: - self.stats.fail += 1 - event = e.args[1] - bb.error("%s event exception, aborting" % bb.event.getName(event)) - bb.event.fire(bb.event.PkgFailed(item, the_data)) - self.build_cache_fail.append(fn) - raise - - 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.bb_cache.loadDataFull(fn, self) - - # Only follow all (runtime) dependencies if doing a build - if not buildAllDeps and self.configuration.cmd is "build": - buildAllDeps = self.status.build_all[fn] - - # 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 - - # 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) - - pathstr = "%s (%s)" % (item, virtual) - self.build_path.append(pathstr) - - 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))) - - try: - failed = False - - depcmd = self.configuration.cmd - bbdepcmd = bb.data.getVarFlag('do_%s' % self.configuration.cmd, 'bbdepcmd', the_data) - if bbdepcmd is not None: - if bbdepcmd == "": - depcmd = None - else: - depcmd = bbdepcmd - - if depcmd: - oldcmd = self.configuration.cmd - self.configuration.cmd = depcmd - - for dependency in depends_list: - if dependency in self.status.ignored_dependencies: - continue - if not depcmd: - continue - if self.buildProvider( dependency , buildAllDeps , build_depends ) == 0: - bb.error("dependency %s (for %s) not satisfied" % (dependency,item)) - failed = True - if self.configuration.abort: - break - - if depcmd: - self.configuration.cmd = oldcmd - - if failed: - 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 - - return self.tryBuildPackage( fn, item, the_data ) - - finally: - self.building_list.remove(fn) - self.build_path.remove(pathstr) - - def findBestProvider( self, pn, pkg_pn = None): - """ - If there is a PREFERRED_VERSION, find the highest-priority bbfile - providing that version. If not, find the latest version provided by - an bbfile in the highest-priority set. - """ - if not pkg_pn: - pkg_pn = self.status.pkg_pn - - files = pkg_pn[pn] - priorities = {} - for f in files: - priority = self.status.bbfile_priority[f] - if priority not in priorities: - priorities[priority] = [] - priorities[priority].append(f) - p_list = priorities.keys() - p_list.sort(lambda a, b: a - b) - tmp_pn = [] - for p in p_list: - tmp_pn = [priorities[p]] + tmp_pn - - preferred_file = None - - localdata = data.createCopy(self.configuration.data) - 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, True) - if preferred_v: - m = re.match('(.*)_(.*)', preferred_v) - if m: - preferred_v = m.group(1) - preferred_r = m.group(2) - else: - preferred_r = None - - for file_set in tmp_pn: - for f in file_set: - pv,pr = self.status.pkg_pvpr[f] - if preferred_v == pv and (preferred_r == pr or preferred_r == None): - preferred_file = f - preferred_ver = (pv, pr) - break - if preferred_file: - break; - if preferred_r: - pv_str = '%s-%s' % (preferred_v, preferred_r) - else: - pv_str = preferred_v - if preferred_file is None: - bb.note("preferred version %s of %s not available" % (pv_str, pn)) - else: - bb.debug(1, "selecting %s as PREFERRED_VERSION %s of package %s" % (preferred_file, pv_str, pn)) - - del localdata - - # get highest priority file set - files = tmp_pn[0] - latest = None - latest_p = 0 - latest_f = None - for file_name in files: - pv,pr = self.status.pkg_pvpr[file_name] - dp = self.status.pkg_dp[file_name] - - if (latest is None) or ((latest_p == dp) and (utils.vercmp(latest, (pv, pr)) < 0)) or (dp > latest_p): - latest = (pv, pr) - latest_f = file_name - latest_p = dp - if preferred_file is None: - preferred_file = latest_f - preferred_ver = latest - - return (latest,latest_f,preferred_ver, preferred_file) - - def showVersions( self ): - pkg_pn = self.status.pkg_pn - preferred_versions = {} - latest_versions = {} - - # Sort by priority - for pn in pkg_pn.keys(): - (last_ver,last_file,pref_ver,pref_file) = self.findBestProvider(pn) - preferred_versions[pn] = (pref_ver, pref_file) - latest_versions[pn] = (last_ver, last_file) - - pkg_list = pkg_pn.keys() - pkg_list.sort() - - for p in pkg_list: - pref = preferred_versions[p] - latest = latest_versions[p] - - if pref != latest: - prefstr = pref[0][0] + "-" + pref[0][1] - else: - prefstr = "" - - print "%-30s %20s %20s" % (p, latest[0][0] + "-" + latest[0][1], - prefstr) - - - def showEnvironment( self ): - """Show the outer or per-package environment""" - if self.configuration.buildfile: - self.cb = None - self.bb_cache = bb.cache.init(self) - try: - self.configuration.data = self.bb_cache.loadDataFull(self.configuration.buildfile, self) - except IOError, e: - fatal("Unable to read %s: %s" % ( self.configuration.buildfile, e )) - except Exception, e: - fatal("%s" % e) - # emit variables and shell functions - try: - data.update_data( self.configuration.data ) - data.emit_env(sys.__stdout__, self.configuration.data, True) - except Exception, e: - fatal("%s" % e) - # emit the metadata which isnt valid shell - for e in self.configuration.data.keys(): - 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 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 providers: - pn = self.status.pkg_fn[p] - if pn not in pkg_pn: - pkg_pn[pn] = [] - pkg_pn[pn].append(p) - - bb.debug(1, "providers for %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.debug(1, "rejecting already-failed %s" % p) - eligible.remove(p) - - if len(eligible) == 0: - bb.error("no eligible providers for %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 providers: - pn = self.status.pkg_fn[p] - pv, pr = self.status.pkg_pvpr[p] - - stamp = '%s.do_populate_staging' % self.status.stamp[p] - 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 = "%s (%s) already staged but upgrading to %s to satisfy %s" % (pn, oldver, newver, item) - else: - extra_chat = "Selecting already-staged %s (%s) to satisfy %s" % (pn, oldver, item) - if self.configuration.verbose: - bb.note("%s" % extra_chat) - eligible.remove(fn) - eligible = [fn] + eligible - 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) - bb.event.fire(bb.event.NoProvider(item,self.configuration.data)) - 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 - - if item in self.preferred: - for p in eligible: - pn = self.status.pkg_fn[p] - if self.preferred[item] == pn: - if self.configuration.verbose: - bb.note("selecting %s to satisfy %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 PREFERRED_PROVIDER_%s" % item) - bb.event.fire(bb.event.MultipleProviders(item,providers_list,self.configuration.data)) - 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 %s" % (fn, item)) - if self.tryBuild(fn, item, buildAllDeps, build_depends + [fn]): - return 1 - - bb.note("no buildable providers for %s" % item) - bb.event.fire(bb.event.NoProvider(item,self.configuration.data)) - 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)) - bb.event.fire(bb.event.NoProvider(item,self.configuration.data,runtime=True)) - 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) - bb.event.fire(bb.event.MultipleProviders(item,providers_list,self.configuration.data,runtime=True)) - 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) - bb.event.fire(bb.event.MultipleProviders(item,providers_list,self.configuration.data,runtime=True)) - 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) - bb.event.fire(bb.event.NoProvider(item,self.configuration.data)) - 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) - - if fn in self.status.rundeps and item in self.status.rundeps[fn]: - rdepends += self.status.rundeps[fn][item].keys() - if fn in self.status.runrecs and item in self.status.runrecs[fn]: - rdepends += self.status.runrecs[fn][item].keys() - - bb.debug(2, "Additional runtime dependencies for %s are: %s" % (item, " ".join(rdepends))) - - for rdepend in rdepends: - if rdepend in self.status.ignored_dependencies: - continue - 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 - - localdata = data.createCopy(self.configuration.data) - bb.data.update_data(localdata) - - def calc_bbfile_priority(filename): - for (regex, pri) in self.status.bbfile_config_priorities: - if regex.match(filename): - return pri - return 0 - - # Handle PREFERRED_PROVIDERS - for p in (bb.data.getVar('PREFERRED_PROVIDERS', localdata, 1) or "").split(): - (providee, provider) = p.split(':') - if providee in self.preferred and self.preferred[providee] != provider: - bb.error("conflicting preferences for %s: both %s and %s specified" % (providee, provider, self.preferred[providee])) - self.preferred[providee] = provider - - # Calculate priorities for each file - for p in self.status.pkg_fn.keys(): - self.status.bbfile_priority[p] = calc_bbfile_priority(p) - - def buildWorldTargetList(self): - """ - Build package list for "bitbake world" - """ - all_depends = self.status.all_depends - pn_provides = self.status.pn_provides - bb.debug(1, "collating packages for \"world\"") - for f in self.status.possible_world: - terminal = True - pn = self.status.pkg_fn[f] - - for p in pn_provides[pn]: - if p.startswith('virtual/'): - bb.debug(2, "skipping %s due to %s provider starting with virtual/" % (f, p)) - terminal = False - break - for pf in self.status.providers[p]: - if self.status.pkg_fn[pf] != pn: - bb.debug(2, "skipping %s due to both us and %s providing %s" % (f, pf, p)) - terminal = False - break - if terminal: - self.status.world_target.add(pn) - - # drop reference count now - self.status.possible_world = None - self.status.all_depends = None - - def myProgressCallback( self, x, y, f, bb_cache, from_cache ): - # feed the status with new input - - self.status.handle_bb_data(f, bb_cache, from_cache) - - if bbdebug > 0: - return - if os.isatty(sys.stdout.fileno()): - sys.stdout.write("\rNOTE: Handling BitBake files: %s (%04d/%04d) [%2d %%]" % ( parsespin.next(), x, y, x*100/y ) ) - sys.stdout.flush() - else: - if x == 1: - sys.stdout.write("Parsing .bb files, please wait...") - sys.stdout.flush() - if x == y: - sys.stdout.write("done.") - sys.stdout.flush() - - def interactiveMode( self ): - """Drop off into a shell""" - try: - from bb import shell - except ImportError, details: - bb.fatal("Sorry, shell not available (%s)" % details ) - else: - bb.data.update_data( self.configuration.data ) - shell.start( self ) - sys.exit( 0 ) - - def parseConfigurationFile( self, afile ): - try: - self.configuration.data = bb.parse.handle( afile, self.configuration.data ) - - # Add the handlers we inherited by INHERIT - # we need to do this manually as it is not guranteed - # we will pick up these classes... as we only INHERIT - # on .inc and .bb files but not on .conf - data = bb.data.createCopy( self.configuration.data ) - inherits = ["base"] + (bb.data.getVar('INHERIT', data, True ) or "").split() - for inherit in inherits: - data = bb.parse.handle( os.path.join('classes', '%s.bbclass' % inherit ), data, True ) - - # FIXME: This assumes that we included at least one .inc file - for var in bb.data.keys(data): - if bb.data.getVarFlag(var, 'handler', data): - bb.event.register(var,bb.data.getVar(var, data)) - - except IOError: - bb.fatal( "Unable to open %s" % afile ) - except bb.parse.ParseError, details: - bb.fatal( "Unable to parse %s (%s)" % (afile, details) ) - - def handleCollections( self, collections ): - """Handle collections""" - if collections: - collection_list = collections.split() - for c in collection_list: - regex = bb.data.getVar("BBFILE_PATTERN_%s" % c, self.configuration.data, 1) - if regex == None: - bb.error("BBFILE_PATTERN_%s not defined" % c) - continue - priority = bb.data.getVar("BBFILE_PRIORITY_%s" % c, self.configuration.data, 1) - if priority == None: - bb.error("BBFILE_PRIORITY_%s not defined" % c) - continue - try: |
