summaryrefslogtreecommitdiff
path: root/bitbake/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/bin')
-rwxr-xr-xbitbake/bin/bbimage155
-rwxr-xr-xbitbake/bin/bitbake853
-rwxr-xr-xbitbake/bin/bitdoc540
3 files changed, 0 insertions, 1548 deletions
diff --git a/bitbake/bin/bbimage b/bitbake/bin/bbimage
deleted file mode 100755
index 9adedbfc63..0000000000
--- a/bitbake/bin/bbimage
+++ /dev/null
@@ -1,155 +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.insert(0,os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib'))
-import bb
-from bb import *
-
-__version__ = 1.1
-type = "jffs2"
-cfg_bb = data.init()
-cfg_oespawn = data.init()
-
-bb.msg.set_debug_level(0)
-
-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 85a0cbc398..0000000000
--- a/bitbake/bin/bitbake
+++ /dev/null
@@ -1,853 +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
-# Copyright (C) 2006 Richard Purdie
-#
-# 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, event, cache, providers, taskdata, runqueue
-from sets import Set
-import itertools, optparse
-
-parsespin = itertools.cycle( r'|/-\\' )
-
-__version__ = "1.7.4"
-
-#============================================================================#
-# 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
- """
-
- Statistics = BBStatistics # make it visible from the shell
-
- def __init__( self ):
- self.build_cache_fail = []
- self.build_cache = []
- self.stats = BBStatistics()
- self.status = None
-
- self.cache = None
- self.bb_cache = None
-
- def tryBuildPackage(self, fn, item, task, the_data, build_depends):
- """
- Build one task of a package, optionally build following task depends
- """
- bb.event.fire(bb.event.PkgStarted(item, the_data))
- try:
- self.stats.attempt += 1
- if self.configuration.force:
- bb.data.setVarFlag('do_%s' % task, 'force', 1, the_data)
- if not build_depends:
- bb.data.setVarFlag('do_%s' % task, 'dontrundeps', 1, the_data)
- if not self.configuration.dry_run:
- bb.build.exec_task('do_%s' % task, 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.msg.error(bb.msg.domain.Build, "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.msg.error(bb.msg.domain.Build, "%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, 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.configuration.data)
-
- item = self.status.pkg_fn[fn]
-
- if bb.build.stamp_is_current('do_%s' % self.configuration.cmd, the_data) and not self.configuration.force:
- self.build_cache.append(fn)
- return True
-
- return self.tryBuildPackage(fn, item, self.configuration.cmd, the_data, build_depends)
-
- 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) = bb.providers.findBestProvider(pn, self.configuration.data, self.status)
- 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.configuration.data)
- except IOError, e:
- bb.msg.fatal(bb.msg.domain.Parsing, "Unable to read %s: %s" % ( self.configuration.buildfile, e ))
- except Exception, e:
- bb.msg.fatal(bb.msg.domain.Parsing, "%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:
- bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e)
- # emit the metadata which isnt valid shell
- data.expandKeys( self.configuration.data )
- 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 generateDotGraph( self, pkgs_to_build, ignore_deps ):
- """
- Generate two graphs one for the DEPENDS and RDEPENDS. The current
- implementation creates crappy graphs ;)
-
- pkgs_to_build A list of packages that needs to be built
- ignore_deps A list of names where processing of dependencies
- should be stopped. e.g. dependencies that get
- """
-
- def myFilterProvider( providers, item):
- """
- Take a list of providers and filter according to environment
- variables. In contrast to filterProviders we do not discriminate
- and take PREFERRED_PROVIDER into account.
- """
- 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.msg.debug(1, bb.msg.domain.Provider, "providers for %s are: %s" % (item, pkg_pn.keys()))
-
- for pn in pkg_pn.keys():
- preferred_versions[pn] = bb.providers.findBestProvider(pn, self.configuration.data, self.status, pkg_pn)[2:4]
- eligible.append(preferred_versions[pn][1])
-
- for p in eligible:
- if p in self.build_cache_fail:
- bb.msg.debug(1, bb.msg.domain.Provider, "rejecting already-failed %s" % p)
- eligible.remove(p)
-
- if len(eligible) == 0:
- bb.msg.error(bb.msg.domain.Provider, "no eligible providers for %s" % item)
- return 0
-
- prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % item, self.configuration.data, 1)
-
- # try the preferred provider first
- if prefervar:
- for p in eligible:
- if prefervar == self.status.pkg_fn[p]:
- bb.msg.note(1, bb.msg.domain.Provider, "Selecting PREFERRED_PROVIDER %s" % prefervar)
- eligible.remove(p)
- eligible = [p] + eligible
-
- return eligible
-
-
- # try to avoid adding the same rdepends over an over again
- seen_depends = []
- seen_rdepends = []
-
-
- def add_depends(package_list):
- """
- Add all depends of all packages from this list
- """
- for package in package_list:
- if package in seen_depends or package in ignore_deps:
- continue
-
- seen_depends.append( package )
- if not package in self.status.providers:
- """
- We have not seen this name -> error in
- dependency handling
- """
- bb.msg.note(1, bb.msg.domain.Depends, "ERROR with provider: %(package)s" % vars() )
- print >> depends_file, '"%(package)s" -> ERROR' % vars()
- continue
-
- # get all providers for this package
- providers = self.status.providers[package]
-
- # now let us find the bestProvider for it
- fn = myFilterProvider(providers, package)[0]
-
- depends = bb.utils.explode_deps(self.bb_cache.getVar('DEPENDS', fn, True) or "")
- version = self.bb_cache.getVar('PV', fn, True ) + '-' + self.bb_cache.getVar('PR', fn, True)
- add_depends ( depends )
-
- # now create the node
- print >> depends_file, '"%(package)s" [label="%(package)s\\n%(version)s"]' % vars()
-
- depends = filter( (lambda x: x not in ignore_deps), depends )
- for depend in depends:
- print >> depends_file, '"%(package)s" -> "%(depend)s"' % vars()
-
-
- def add_all_depends( the_depends, the_rdepends ):
- """
- Add both DEPENDS and RDEPENDS. RDEPENDS will get dashed
- lines
- """
- package_list = the_depends + the_rdepends
- for package in package_list:
- if package in seen_rdepends or package in ignore_deps:
- continue
-
- seen_rdepends.append( package )
-
- # Let us find out if the package is a DEPENDS or RDEPENDS
- # and we will set 'providers' with the avilable providers
- # for the package.
- if package in the_depends:
- if not package in self.status.providers:
- bb.msg.note(1, bb.msg.domain.Depends, "ERROR with provider: %(package)s" % vars() )
- print >> alldepends_file, '"%(package)s" -> ERROR' % vars()
- continue
-
- providers = self.status.providers[package]
- elif package in the_rdepends:
- if len(bb.providers.getRuntimeProviders(self.status, package)) == 0:
- bb.msg.note(1, bb.msg.domain.Depends, "ERROR with rprovider: %(package)s" % vars() )
- print >> alldepends_file, '"%(package)s" -> ERROR [style="dashed"]' % vars()
- continue
-
- providers = bb.providers.getRuntimeProviders(self.status, package)
- else:
- # something went wrong...
- print "Complete ERROR! %s" % package
- continue
-
- # now let us find the bestProvider for it
- fn = myFilterProvider(providers, package)[0]
-
- # Now we have a filename let us get the depends and RDEPENDS of it
- depends = bb.utils.explode_deps(self.bb_cache.getVar('DEPENDS', fn, True) or "")
- if fn in self.status.rundeps and package in self.status.rundeps[fn]:
- rdepends= self.status.rundeps[fn][package].keys()
- else:
- rdepends = []
- version = self.bb_cache.getVar('PV', fn, True ) + '-' + self.bb_cache.getVar('PR', fn, True)
-
- # handle all the depends and rdepends of package
- add_all_depends ( depends, rdepends )
-
- # now create the node using package name
- print >> alldepends_file, '"%(package)s" [label="%(package)s\\n%(version)s"]' % vars()
-
- # remove the stuff we want to ignore and add the edges
- depends = filter( (lambda x: x not in ignore_deps), depends )
- rdepends = filter( (lambda x: x not in ignore_deps), rdepends )
- for depend in depends:
- print >> alldepends_file, '"%(package)s" -> "%(depend)s"' % vars()
- for depend in rdepends:
- print >> alldepends_file, '"%(package)s" -> "%(depend)s" [style=dashed]' % vars()
-
-
- # Add depends now
- depends_file = file('depends.dot', 'w' )
- print >> depends_file, "digraph depends {"
- add_depends( pkgs_to_build )
- print >> depends_file, "}"
-
- # Add all depends now
- alldepends_file = file('alldepends.dot', 'w' )
- print >> alldepends_file, "digraph alldepends {"
- add_all_depends( pkgs_to_build, [] )
- print >> alldepends_file, "}"
-
- 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)
- bb.data.expandKeys(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.status.preferred and self.status.preferred[providee] != provider:
- bb.msg.error(bb.msg.domain.Provider, "conflicting preferences for %s: both %s and %s specified" % (providee, provider, self.status.preferred[providee]))
- self.status.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.msg.debug(1, bb.msg.domain.Parsing, "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.msg.debug(2, bb.msg.domain.Parsing, "World build 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.msg.debug(2, bb.msg.domain.Parsing, "World build 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, from_cache ):
- """Update any tty with the progress change"""
- 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.msg.fatal(bb.msg.domain.Parsing, "Sorry, shell not available (%s)" % details )
- else:
- bb.data.update_data( self.configuration.data )
- bb.data.expandKeys(localdata)
- 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.msg.fatal(bb.msg.domain.Parsing, "Unable to open %s" % afile )
- except bb.parse.ParseError, details:
- bb.msg.fatal(bb.msg.domain.Parsing, "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.msg.error(bb.msg.domain.Parsing, "BBFILE_PATTERN_%s not defined" % c)
- continue
- priority = bb.data.getVar("BBFILE_PRIORITY_%s" % c, self.configuration.data, 1)
- if priority == None:
- bb.msg.error(bb.msg.domain.Parsing, "BBFILE_PRIORITY_%s not defined" % c)
- continue
- try:
- cre = re.compile(regex)
- except re.error:
- bb.msg.error(bb.msg.domain.Parsing, "BBFILE_PATTERN_%s \"%s\" is not a valid regular expression" % (c, regex))
- continue
- try:
- pri = int(priority)
- self.status.bbfile_config_priorities.append((cre, pri))
- except ValueError:
- bb.msg.error(bb.msg.domain.Parsing, "invalid value for BBFILE_PRIORITY_%s: \"%s\"" % (c, priority))
-
-
- def cook( self, configuration, args ):
- """
- We are building stuff here. We do the building
- from here. By default we try to execute task
- build.
- """
-
- self.configuration = configuration
-
- if self.configuration.verbose:
- bb.msg.set_verbose(True)
-
- if self.configuration.debug:
- bb.msg.set_debug_level(self.configuration.debug)
- else:
- bb.msg.set_debug_level(0)
-
- if self.configuration.debug_domains:
- bb.msg.set_debug_domains(self.configuration.debug_domains)
-
- self.configuration.data = bb.data.init()
-
- for f in self.configuration.file:
- self.parseConfigurationFile( f )
-
- self.parseConfigurationFile( os.path.join( "conf", "bitbake.conf" ) )
-
- if not self.configuration.cmd:
- self.configuration.cmd = bb.data.getVar("BB_DEFAULT_TASK", self.configuration.data)
-
- # For backwards compatibility - REMOVE ME
- if not self.configuration.cmd:
- self.configuration.cmd = "build"
-
- #
- # Special updated configuration we use for firing events
- #
- self.configuration.event_data = bb.data.createCopy(self.configuration.data)
- bb.data.update_data(self.configuration.event_data)
-
- if self.configuration.show_environment:
- self.showEnvironment()
- sys.exit( 0 )
-
- # inject custom variables
- if not bb.data.getVar("BUILDNAME", self.configuration.data):
- bb.data.setVar("BUILDNAME", os.popen('date +%Y%m%d%H%M').readline().strip(), self.configuration.data)
- bb.data.setVar("BUILDSTART", time.strftime('%m/%d/%Y %H:%M:%S',time.gmtime()),self.configuration.data)
-
- buildname = bb.data.getVar("BUILDNAME", self.configuration.data)
-
- if self.configuration.interactive:
- self.interactiveMode()
-
- if self.configuration.buildfile is not None:
- bf = os.path.abspath( self.configuration.buildfile )
- try:
- os.stat(bf)
- except OSError:
- (filelist, masked) = self.collect_bbfiles()
- regexp = re.compile(self.configuration.buildfile)
- matches = []
- for f in filelist:
- if regexp.search(f) and os.path.isfile(f):
- bf = f
- matches.append(f)
- if len(matches) != 1:
- bb.msg.error(bb.msg.domain.Parsing, "Unable to match %s (%s matches found):" % (self.configuration.buildfile, len(matches)))
- for f in matches:
- bb.msg.error(bb.msg.domain.Parsing, " %s" % f)
- sys.exit(1)
- bf = matches[0]
-
- bbfile_data = bb.parse.handle(bf, self.configuration.data)
-
- item = bb.data.getVar('PN', bbfile_data, 1)
- try:
- self.tryBuildPackage(bf, item, self.configuration.cmd, bbfile_data, True)
- except bb.build.EventException:
- bb.msg.error(bb.msg.domain.Build, "Build of '%s' failed" % item )
-
- sys.exit( self.stats.show() )
-
- # initialise the parsing status now we know we will need deps
- self.status = bb.cache.CacheData()
-
- ignore = bb.data.getVar("ASSUME_PROVIDED", self.configuration.data, 1) or ""
- self.status.ignored_dependencies = Set( ignore.split() )
-
- self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) )
-
- pkgs_to_build = None
- if args:
- if not pkgs_to_build:
- pkgs_to_build = []
- pkgs_to_build.extend(args)
- if not pkgs_to_build:
- bbpkgs = bb.data.getVar('BBPKGS', self.configuration.data, 1)
- if bbpkgs:
- pkgs_to_build = bbpkgs.split()
- if not pkgs_to_build and not self.configuration.show_versions \
- and not self.configuration.interactive \
- and not self.configuration.show_environment:
- print "Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help'"
- print "for usage information."
- sys.exit(0)
-
- # Import Psyco if available and not disabled
- if not self.configuration.disable_psyco:
- try:
- import psyco
- except ImportError:
- bb.msg.note(1, bb.msg.domain.Collection, "Psyco JIT Compiler (http://psyco.sf.net) not available. Install it to increase performance.")
- else:
- psyco.bind( self.parse_bbfiles )
- else:
- bb.msg.note(1, bb.msg.domain.Collection, "You have disabled Psyco. This decreases performance.")
-
- try:
- bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files")
- (filelist, masked) = self.collect_bbfiles()
- self.parse_bbfiles(filelist, masked, self.myProgressCallback)
- bb.msg.debug(1, bb.msg.domain.Collection, "parsing complete")
- print
- if self.configuration.parse_only:
- bb.msg.note(1, bb.msg.domain.Collection, "Requested parsing .bb files only. Exiting.")
- return
-
-
- self.buildDepgraph()
-
- if self.configuration.show_versions:
- self.showVersions()
- sys.exit( 0 )
- if 'world' in pkgs_to_build:
- self.buildWorldTargetList()
- pkgs_to_build.remove('world')
- for t in self.status.world_target:
- pkgs_to_build.append(t)
-
- if self.configuration.dot_graph:
- self.generateDotGraph( pkgs_to_build, self.configuration.ignored_dot_deps )
- sys.exit( 0 )
-
- bb.event.fire(bb.event.BuildStarted(buildname, pkgs_to_build, self.configuration.event_data))
-
- localdata = data.createCopy(self.configuration.data)
- bb.data.update_data(localdata)
- bb.data.expandKeys(localdata)
-
- taskdata = bb.taskdata.TaskData(self.configuration.abort)
-
- runlist = []
- try:
- for k in pkgs_to_build:
- taskdata.add_provider(localdata, self.status, k)
- runlist.append([k, "do_%s" % self.configuration.cmd])
- taskdata.add_unresolved(localdata, self.status)
- except bb.providers.NoProvider:
- sys.exit(1)
-
- rq = bb.runqueue.RunQueue()
- rq.prepare_runqueue(self.configuration.data, self.status, taskdata, runlist)
- try:
- failures = rq.execute_runqueue(self, self.configuration.data, self.status, taskdata, runlist)
- except runqueue.TaskFailure, (fnid, fn, taskname):
- bb.msg.error(bb.msg.domain.Build, "'%s, %s' failed" % (fn, taskname))
- sys.exit(1)
-
- bb.event.fire(bb.event.BuildCompleted(buildname, pkgs_to_build, self.configuration.event_data, failures))
-
- sys.exit( self.stats.show() )
-
- except KeyboardInterrupt:
- bb.msg.note(1, bb.msg.domain.Collection, "KeyboardInterrupt - Build not completed.")
- sys.exit(1)
-
- def get_bbfiles( self, path = os.getcwd() ):
- """Get list of default .bb files by reading out the current directory"""
- contents = os.listdir(path)
- bbfiles = []
- for f in contents:
- (root, ext) = os.path.splitext(f)
- if ext == ".bb":
- bbfiles.append(os.path.abspath(os.path.join(os.getcwd(),f)))
- return bbfiles
-
- def find_bbfiles( self, path ):
- """Find all the .bb files in a directory (uses find)"""
- findcmd = 'find ' + path + ' -name *.bb | grep -v SCCS/'
- try:
- finddata = os.popen(findcmd)
- except OSError:
- return []
- return finddata.readlines()
-
- def collect_bbfiles( self ):
- """Collect all available .bb build files"""
- parsed, cached, skipped, masked = 0, 0, 0, 0
- self.bb_cache = bb.cache.init(self)
-
- files = (data.getVar( "BBFILES", self.configuration.data, 1 ) or "").split()
- data.setVar("BBFILES", " ".join(files), self.configuration.data)
-
- if not len(files):
- files = self.get_bbfiles()
-
- if not len(files):
- bb.msg.error(bb.msg.domain.Collection, "no files to build.")
-
- newfiles = []
- for f in files:
- if os.path.isdir(f):
- dirfiles = self.find_bbfiles(f)
- if dirfiles:
- newfiles += dirfiles
- continue
- newfiles += glob.glob(f) or [ f ]
-
- bbmask = bb.data.getVar('BBMASK', self.configuration.data, 1)
-
- if not bbmask:
- return (newfiles, 0)
-
- try:
- bbmask_compiled = re.compile(bbmask)
- except sre_constants.error:
- bb.msg.fatal(bb.msg.domain.Collection, "BBMASK is not a valid regular expression.")
-
- finalfiles = []
- for i in xrange( len( newfiles ) ):
- f = newfiles[i]
- if bbmask and bbmask_compiled.search(f):
- bb.msg.debug(1, bb.msg.domain.Collection, "skipping masked file %s" % f)
- masked += 1
- continue
- finalfiles.append(f)
-
- return (finalfiles, masked)
-
- def parse_bbfiles(self, filelist, masked, progressCallback = None):
- parsed, cached, skipped = 0, 0, 0
- for i in xrange( len( filelist ) ):
- f = filelist[i]
-
- bb.msg.debug(1, bb.msg.domain.Collection, "parsing %s" % f)
-
- # read a file's metadata
- try:
- fromCache, skip = self.bb_cache.loadData(f, self.configuration.data)
- if skip:
- skipped += 1
- bb.msg.debug(2, bb.msg.domain.Collection, "skipping %s" % f)
- self.bb_cache.skip(f)
- continue
- elif fromCache: cached += 1
- else: parsed += 1
- deps = None
-
- # Disabled by RP as was no longer functional
- # allow metadata files to add items to BBFILES
- #data.update_data(self.pkgdata[f])
- #addbbfiles = self.bb_cache.getVar('BBFILES', f, False) or None
- #if addbbfiles:
- # for aof in addbbfiles.split():
- # if not files.count(aof):
- # if not os.path.isabs(aof):
- # aof = os.path.join(os.path.dirname(f),aof)
- # files.append(aof)
-
- self.bb_cache.handle_data(f, self.status)
-
- # now inform the caller
- if progressCallback is not None:
- progressCallback( i + 1, len( filelist ), f, fromCache )
-
- except IOError, e:
- self.bb_cache.remove(f)
- bb.msg.error(bb.msg.domain.Collection, "opening %s: %s" % (f, e))
- pass
- except KeyboardInterrupt:
- self.bb_cache.sync()
- raise
- except Exception, e:
- self.bb_cache.remove(f)
- bb.msg.error(bb.msg.domain.Collection, "%s while parsing %s" % (e, f))
- except:
- self.bb_cache.remove(f)
- raise
-
- if progressCallback is not None:
- print "\r" # need newline after Handling Bitbake files message
- bb.msg.note(1, bb.msg.domain.Collection, "Parsing finished. %d cached, %d parsed, %d skipped, %d masked." % ( cached, parsed, skipped, masked ))
-
- self.bb_cache.sync()
-
-#============================================================================#
-# main
-#============================================================================#
-
-def main():
- parser = optparse.OptionParser( version = "BitBake Build Tool Core version %s, %%prog version %s" % ( bb.__version__, __version__ ),