diff options
| author | Richard Purdie <rpurdie@linux.intel.com> | 2010-01-19 14:48:19 +0000 |
|---|---|---|
| committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-01-19 14:48:19 +0000 |
| commit | 22a271aaa99daeb6b29c42c2c1dc670bf204310e (patch) | |
| tree | d2690b66e7a613820f34ceaecbce65809cbd22a3 /bitbake-dev/lib/bb | |
| parent | cefe87fc3c4202e942f34666813bc094df2ffb4b (diff) | |
| download | openembedded-core-22a271aaa99daeb6b29c42c2c1dc670bf204310e.tar.gz openembedded-core-22a271aaa99daeb6b29c42c2c1dc670bf204310e.tar.bz2 openembedded-core-22a271aaa99daeb6b29c42c2c1dc670bf204310e.zip | |
bitbake-dev: Sync with upstream
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'bitbake-dev/lib/bb')
23 files changed, 491 insertions, 346 deletions
diff --git a/bitbake-dev/lib/bb/build.py b/bitbake-dev/lib/bb/build.py index 65e8118b4f..6d80b4b549 100644 --- a/bitbake-dev/lib/bb/build.py +++ b/bitbake-dev/lib/bb/build.py @@ -55,7 +55,7 @@ class TaskBase(event.Event): def __init__(self, t, d ): self._task = t self._package = bb.data.getVar("PF", d, 1) - event.Event.__init__(self, d) + event.Event.__init__(self) self._message = "package %s: task %s: %s" % (bb.data.getVar("PF", d, 1), t, bb.event.getName(self)[4:]) def getTask(self): @@ -286,9 +286,9 @@ def exec_task(task, d): data.setVar('OVERRIDES', 'task-%s:%s' % (task[3:], old_overrides), localdata) data.update_data(localdata) data.expandKeys(localdata) - event.fire(TaskStarted(task, localdata)) + event.fire(TaskStarted(task, localdata), localdata) exec_func(task, localdata) - event.fire(TaskSucceeded(task, localdata)) + event.fire(TaskSucceeded(task, localdata), localdata) except FuncFailed, message: # Try to extract the optional logfile try: @@ -298,7 +298,7 @@ def exec_task(task, d): msg = message bb.msg.note(1, bb.msg.domain.Build, "Task failed: %s" % message ) failedevent = TaskFailed(msg, logfile, task, d) - event.fire(failedevent) + event.fire(failedevent, d) raise EventException("Function failed in task: %s" % message, failedevent) # make stamp, or cause event and raise exception diff --git a/bitbake-dev/lib/bb/command.py b/bitbake-dev/lib/bb/command.py index 1a1bf00b33..2bb5365c0c 100644 --- a/bitbake-dev/lib/bb/command.py +++ b/bitbake-dev/lib/bb/command.py @@ -94,9 +94,9 @@ class Command: def finishAsyncCommand(self, error = None): if error: - bb.event.fire(bb.command.CookerCommandFailed(self.cooker.configuration.event_data, error)) + bb.event.fire(bb.command.CookerCommandFailed(error), self.cooker.configuration.event_data) else: - bb.event.fire(bb.command.CookerCommandCompleted(self.cooker.configuration.event_data)) + bb.event.fire(bb.command.CookerCommandCompleted(), self.cooker.configuration.event_data) self.currentAsyncCommand = None @@ -247,24 +247,24 @@ class CookerCommandCompleted(bb.event.Event): """ Cooker command completed """ - def __init__(self, data): - bb.event.Event.__init__(self, data) + def __init__(self): + bb.event.Event.__init__(self) class CookerCommandFailed(bb.event.Event): """ Cooker command completed """ - def __init__(self, data, error): - bb.event.Event.__init__(self, data) + def __init__(self, error): + bb.event.Event.__init__(self) self.error = error class CookerCommandSetExitCode(bb.event.Event): """ Set the exit code for a cooker command """ - def __init__(self, data, exitcode): - bb.event.Event.__init__(self, data) + def __init__(self, exitcode): + bb.event.Event.__init__(self) self.exitcode = int(exitcode) diff --git a/bitbake-dev/lib/bb/cooker.py b/bitbake-dev/lib/bb/cooker.py index 1bf7d4bd14..25131b7406 100644 --- a/bitbake-dev/lib/bb/cooker.py +++ b/bitbake-dev/lib/bb/cooker.py @@ -245,7 +245,7 @@ class BBCooker: def compareRevisions(self): ret = bb.fetch.fetcher_compare_revisons(self.configuration.data) - bb.event.fire(bb.command.CookerCommandSetExitCode(self.configuration.event_data, ret)) + bb.event.fire(bb.command.CookerCommandSetExitCode(ret), self.configuration.event_data) def showEnvironment(self, buildfile = None, pkgs_to_build = []): """ @@ -403,7 +403,7 @@ class BBCooker: Generate an event with the result """ depgraph = self.generateDepTreeData(pkgs_to_build, task) - bb.event.fire(bb.event.DepTreeGenerated(self.configuration.data, depgraph)) + bb.event.fire(bb.event.DepTreeGenerated(depgraph), self.configuration.data) def generateDotGraphFiles(self, pkgs_to_build, task): """ @@ -544,7 +544,7 @@ class BBCooker: bb.fetch.fetcher_init(self.configuration.data) - bb.event.fire(bb.event.ConfigParsed(self.configuration.data)) + bb.event.fire(bb.event.ConfigParsed(), self.configuration.data) except IOError, e: bb.msg.fatal(bb.msg.domain.Parsing, "Error when parsing %s: %s" % (afile, str(e))) @@ -657,7 +657,7 @@ class BBCooker: taskdata.add_provider(self.configuration.data, self.status, item) buildname = bb.data.getVar("BUILDNAME", self.configuration.data) - bb.event.fire(bb.event.BuildStarted(buildname, [item], self.configuration.event_data)) + bb.event.fire(bb.event.BuildStarted(buildname, [item]), self.configuration.event_data) # Execute the runqueue runlist = [[item, "do_%s" % task]] @@ -680,7 +680,7 @@ class BBCooker: retval = False if not retval: self.command.finishAsyncCommand() - bb.event.fire(bb.event.BuildCompleted(buildname, item, self.configuration.event_data, failures)) + bb.event.fire(bb.event.BuildCompleted(buildname, item, failures), self.configuration.event_data) return False return 0.5 @@ -716,14 +716,14 @@ class BBCooker: retval = False if not retval: self.command.finishAsyncCommand() - bb.event.fire(bb.event.BuildCompleted(buildname, targets, self.configuration.event_data, failures)) + bb.event.fire(bb.event.BuildCompleted(buildname, targets, failures), self.configuration.event_data) return None return 0.5 self.buildSetVars() buildname = bb.data.getVar("BUILDNAME", self.configuration.data) - bb.event.fire(bb.event.BuildStarted(buildname, targets, self.configuration.event_data)) + bb.event.fire(bb.event.BuildStarted(buildname, targets), self.configuration.event_data) localdata = data.createCopy(self.configuration.data) bb.data.update_data(localdata) @@ -786,7 +786,7 @@ class BBCooker: self.cookerState = cookerParsed return None - return 0.00001 + return True def checkPackages(self, pkgs_to_build): @@ -904,15 +904,15 @@ class BBCooker: else: self.server.serve_forever() - bb.event.fire(CookerExit(self.configuration.event_data)) + bb.event.fire(CookerExit(), self.configuration.event_data) class CookerExit(bb.event.Event): """ Notify clients of the Cooker shutdown """ - def __init__(self, d): - bb.event.Event.__init__(self, d) + def __init__(self): + bb.event.Event.__init__(self) class CookerParser: def __init__(self, cooker, filelist, masked): @@ -932,8 +932,6 @@ class CookerParser: self.pointer = 0 def parse_next(self): - print "Pointer %d" % self.pointer - if self.pointer < len(self.filelist): f = self.filelist[self.pointer] cooker = self.cooker @@ -964,7 +962,7 @@ class CookerParser: cooker.bb_cache.remove(f) raise finally: - bb.event.fire(bb.event.ParseProgress(cooker.configuration.event_data, self.cached, self.parsed, self.skipped, self.masked, self.error, self.total)) + bb.event.fire(bb.event.ParseProgress(self.cached, self.parsed, self.skipped, self.masked, self.error, self.total), cooker.configuration.event_data) self.pointer += 1 diff --git a/bitbake-dev/lib/bb/event.py b/bitbake-dev/lib/bb/event.py index 86b566febf..3062dc51be 100644 --- a/bitbake-dev/lib/bb/event.py +++ b/bitbake-dev/lib/bb/event.py @@ -24,27 +24,19 @@ BitBake build tools. import os, re import bb.utils +import pickle # This is the pid for which we should generate the event. This is set when # the runqueue forks off. worker_pid = 0 +worker_pipe = None class Event: """Base class for events""" - type = "Event" - def __init__(self, d): - self._data = d + def __init__(self): self.pid = worker_pid - def getData(self): - return self._data - - def setData(self, data): - self._data = data - - data = property(getData, setData, None, "data property") - NotHandled = 0 Handled = 1 @@ -56,33 +48,48 @@ _handlers = {} _ui_handlers = {} _ui_handler_seq = 0 -def fire(event): +def fire(event, d): """Fire off an Event""" + if worker_pid != 0: + worker_fire(event, d) + return + for handler in _handlers: h = _handlers[handler] + event.data = d if type(h).__name__ == "code": exec(h) tmpHandler(event) else: h(event) - - # Remove the event data elements for UI handlers - too much data otherwise - # They can request data if they need it - event.data = None - event._data = None + del event.data errors = [] for h in _ui_handlers: #print "Sending event %s" % event - classid = "%s.%s" % (event.__class__.__module__, event.__class__.__name__) try: - _ui_handlers[h].event.send((classid, event)) + # We use pickle here since it better handles object instances + # which xmlrpc's marshaller does not. Events *must* be serializable + # by pickle. + _ui_handlers[h].event.send((pickle.dumps(event))) except: errors.append(h) for h in errors: del _ui_handlers[h] +def worker_fire(event, d): + data = "<event>" + pickle.dumps(event) + "</event>" + if os.write(worker_pipe, data) != len (data): + print "Error sending event to server (short write)" + +def fire_from_worker(event, d): + if not event.startswith("<event>") or not event.endswith("</event>"): + print "Error, not an event" + return + event = pickle.loads(event[7:-8]) + bb.event.fire(event, d) + def register(name, handler): """Register an Event handler""" @@ -128,17 +135,17 @@ class ConfigParsed(Event): class RecipeParsed(Event): """ Recipe Parsing Complete """ - def __init__(self, fn, d): + def __init__(self, fn): self.fn = fn - Event.__init__(self, d) + Event.__init__(self) class StampUpdate(Event): """Trigger for any adjustment of the stamp files to happen""" - def __init__(self, targets, stampfns, d): + def __init__(self, targets, stampfns): self._targets = targets self._stampfns = stampfns - Event.__init__(self, d) + Event.__init__(self) def getStampPrefix(self): return self._stampfns @@ -149,30 +156,13 @@ class StampUpdate(Event): stampPrefix = property(getStampPrefix) targets = property(getTargets) -class PkgBase(Event): - """Base class for package events""" - - def __init__(self, t, d): - self._pkg = t - Event.__init__(self, d) - self._message = "package %s: %s" % (bb.data.getVar("P", d, 1), getName(self)[3:]) - - def getPkg(self): - return self._pkg - - def setPkg(self, pkg): - self._pkg = pkg - - pkg = property(getPkg, setPkg, None, "pkg property") - - class BuildBase(Event): """Base class for bbmake run events""" - def __init__(self, n, p, c, failures = 0): + def __init__(self, n, p, failures = 0): self._name = n self._pkgs = p - Event.__init__(self, c) + Event.__init__(self) self._failures = failures def getPkgs(self): @@ -204,20 +194,7 @@ class BuildBase(Event): cfg = property(getCfg, setCfg, None, "cfg property") -class DepBase(PkgBase): - """Base class for dependency events""" - def __init__(self, t, data, d): - self._dep = d - PkgBase.__init__(self, t, data) - - def getDep(self): - return self._dep - - def setDep(self, dep): - self._dep = dep - - dep = property(getDep, setDep, None, "dep property") class BuildStarted(BuildBase): @@ -228,18 +205,13 @@ class BuildCompleted(BuildBase): """bbmake build run completed""" -class UnsatisfiedDep(DepBase): - """Unsatisfied Dependency""" - -class RecursiveDep(DepBase): - """Recursive Dependency""" class NoProvider(Event): """No Provider for an Event""" - def __init__(self, item, data, runtime=False): - Event.__init__(self, data) + def __init__(self, item, runtime=False): + Event.__init__(self) self._item = item self._runtime = runtime @@ -252,8 +224,8 @@ class NoProvider(Event): class MultipleProviders(Event): """Multiple Providers""" - def __init__(self, item, candidates, data, runtime = False): - Event.__init__(self, data) + def __init__(self, item, candidates, runtime = False): + Event.__init__(self) self._item = item self._candidates = candidates self._is_runtime = runtime @@ -281,8 +253,8 @@ class ParseProgress(Event): Parsing Progress Event """ - def __init__(self, d, cached, parsed, skipped, masked, errors, total): - Event.__init__(self, d) + def __init__(self, cached, parsed, skipped, masked, errors, total): + Event.__init__(self) self.cached = cached self.parsed = parsed self.skipped = skipped @@ -296,7 +268,7 @@ class DepTreeGenerated(Event): Event when a dependency tree has been generated """ - def __init__(self, d, depgraph): - Event.__init__(self, d) + def __init__(self, depgraph): + Event.__init__(self) self._depgraph = depgraph diff --git a/bitbake-dev/lib/bb/fetch/cvs.py b/bitbake-dev/lib/bb/fetch/cvs.py index d8bd4eaf75..90a006500e 100644 --- a/bitbake-dev/lib/bb/fetch/cvs.py +++ b/bitbake-dev/lib/bb/fetch/cvs.py @@ -41,7 +41,7 @@ class Cvs(Fetch): """ Check to see if a given url can be fetched with cvs. """ - return ud.type in ['cvs', 'pserver'] + return ud.type in ['cvs'] def localpath(self, url, ud, d): if not "module" in ud.parm: diff --git a/bitbake-dev/lib/bb/fetch/git.py b/bitbake-dev/lib/bb/fetch/git.py index 43053d6c46..0e68325db9 100644 --- a/bitbake-dev/lib/bb/fetch/git.py +++ b/bitbake-dev/lib/bb/fetch/git.py @@ -51,6 +51,10 @@ class Git(Fetch): ud.branch = ud.parm.get("branch", "master") + gitsrcname = '%s%s' % (ud.host, ud.path.replace('/', '.')) + ud.mirrortarball = 'git_%s.tar.gz' % (gitsrcname) + ud.clonedir = os.path.join(data.expand('${GITDIR}', d), gitsrcname) + tag = Fetch.srcrev_internal_helper(ud, d) if tag is True: ud.tag = self.latest_revision(url, ud, d) @@ -60,7 +64,18 @@ class Git(Fetch): if not ud.tag or ud.tag == "master": ud.tag = self.latest_revision(url, ud, d) - ud.localfile = data.expand('git_%s%s_%s.tar.gz' % (ud.host, ud.path.replace('/', '.'), ud.tag), d) + subdir = ud.parm.get("subpath", "") + if subdir != "": + if subdir.endswith("/"): + subdir = subdir[:-1] + subdirpath = os.path.join(ud.path, subdir); + else: + subdirpath = ud.path; + + if 'fullclone' in ud.parm: + ud.localfile = ud.mirrortarball + else: + ud.localfile = data.expand('git_%s%s_%s.tar.gz' % (ud.host, subdirpath.replace('/', '.'), ud.tag), d) return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile) @@ -76,24 +91,20 @@ class Git(Fetch): else: username = "" - gitsrcname = '%s%s' % (ud.host, ud.path.replace('/', '.')) - - repofilename = 'git_%s.tar.gz' % (gitsrcname) - repofile = os.path.join(data.getVar("DL_DIR", d, 1), repofilename) - repodir = os.path.join(data.expand('${GITDIR}', d), gitsrcname) + repofile = os.path.join(data.getVar("DL_DIR", d, 1), ud.mirrortarball) coname = '%s' % (ud.tag) - codir = os.path.join(repodir, coname) + codir = os.path.join(ud.clonedir, coname) - if not os.path.exists(repodir): - if Fetch.try_mirror(d, repofilename): - bb.mkdirhier(repodir) - os.chdir(repodir) + if not os.path.exists(ud.clonedir): + if Fetch.try_mirror(d, ud.mirrortarball): + bb.mkdirhier(ud.clonedir) + os.chdir(ud.clonedir) runfetchcmd("tar -xzf %s" % (repofile), d) else: - runfetchcmd("git clone -n %s://%s%s%s %s" % (ud.proto, username, ud.host, ud.path, repodir), d) + runfetchcmd("git clone -n %s://%s%s%s %s" % (ud.proto, username, ud.host, ud.path, ud.clonedir), d) - os.chdir(repodir) + os.chdir(ud.clonedir) # Remove all but the .git directory if not self._contains_ref(ud.tag, d): runfetchcmd("rm * -Rf", d) @@ -102,25 +113,45 @@ class Git(Fetch): runfetchcmd("git prune-packed", d) runfetchcmd("git pack-redundant --all | xargs -r rm", d) - os.chdir(repodir) + os.chdir(ud.clonedir) mirror_tarballs = data.getVar("BB_GENERATE_MIRROR_TARBALLS", d, True) - if mirror_tarballs != "0": + if mirror_tarballs != "0" or 'fullclone' in ud.parm: bb.msg.note(1, bb.msg.domain.Fetcher, "Creating tarball of git repository") runfetchcmd("tar -czf %s %s" % (repofile, os.path.join(".", ".git", "*") ), d) + if 'fullclone' in ud.parm: + return + if os.path.exists(codir): bb.utils.prunedir(codir) + subdir = ud.parm.get("subpath", "") + if subdir != "": + if subdir.endswith("/"): + subdirbase = os.path.basename(subdir[:-1]) + else: + subdirbase = os.path.basename(subdir) + else: + subdirbase = "" + + if subdir != "": + readpathspec = ":%s" % (subdir) + codir = os.path.join(codir, "git") + coprefix = os.path.join(codir, subdirbase, "") + else: + readpathspec = "" + coprefix = os.path.join(codir, "git", "") + bb.mkdirhier(codir) - os.chdir(repodir) - runfetchcmd("git read-tree %s" % (ud.tag), d) - runfetchcmd("git checkout-index -q -f --prefix=%s -a" % (os.path.join(codir, "git", "")), d) + os.chdir(ud.clonedir) + runfetchcmd("git read-tree %s%s" % (ud.tag, readpathspec), d) + runfetchcmd("git checkout-index -q -f --prefix=%s -a" % (coprefix), d) os.chdir(codir) bb.msg.note(1, bb.msg.domain.Fetcher, "Creating tarball of git checkout") runfetchcmd("tar -czf %s %s" % (ud.localpath, os.path.join(".", "*") ), d) - os.chdir(repodir) + os.chdir(ud.clonedir) bb.utils.prunedir(codir) def suppports_srcrev(self): @@ -145,7 +176,10 @@ class Git(Fetch): else: username = "" - output = runfetchcmd("git ls-remote %s://%s%s%s %s" % (ud.proto, username, ud.host, ud.path, ud.branch), d, True) + cmd = "git ls-remote %s://%s%s%s %s" % (ud.proto, username, ud.host, ud.path, ud.branch) + output = runfetchcmd(cmd, d, True) + if not output: + raise bb.fetch.FetchError("Fetch command %s gave empty output\n" % (cmd)) return output.split()[0] def _build_revision(self, url, ud, d): @@ -156,20 +190,20 @@ class Git(Fetch): Return a suitable buildindex for the revision specified. This is done by counting revisions using "git rev-list" which may or may not work in different circumstances. """ - gitsrcname = '%s%s' % (ud.host, ud.path.replace('/', '.')) - repodir = os.path.join(data.expand('${GITDIR}', d), gitsrcname) cwd = os.getcwd() # Check if we have the rev already - if not os.path.exists(repodir): + + if not os.path.exists(ud.clonedir): + print "no repo" self.go(None, ud, d) - if not os.path.exists(repodir): - bb.msg.error(bb.msg.domain.Fetcher, "GIT repository for %s doesn't exist in %s, cannot get sortable buildnumber, using old value" % (url, repodir)) + if not os.path.exists(ud.clonedir): + bb.msg.error(bb.msg.domain.Fetcher, "GIT repository for %s doesn't exist in %s, cannot get sortable buildnumber, using old value" % (url, ud.clonedir)) return None - os.chdir(repodir) + os.chdir(ud.clonedir) if not self._contains_ref(rev, d): self.go(None, ud, d) diff --git a/bitbake-dev/lib/bb/fetch/local.py b/bitbake-dev/lib/bb/fetch/local.py index 577774e597..f9bdf589cb 100644 --- a/bitbake-dev/lib/bb/fetch/local.py +++ b/bitbake-dev/lib/bb/fetch/local.py @@ -33,9 +33,9 @@ from bb.fetch import Fetch class Local(Fetch): def supports(self, url, urldata, d): """ - Check to see if a given url can be fetched with cvs. + Check to see if a given url represents a local fetch. """ - return urldata.type in ['file','patch'] + return urldata.type in ['file'] def localpath(self, url, urldata, d): """ diff --git a/bitbake-dev/lib/bb/fetch/svk.py b/bitbake-dev/lib/bb/fetch/svk.py index 442f85804f..120dad9d4e 100644 --- a/bitbake-dev/lib/bb/fetch/svk.py +++ b/bitbake-dev/lib/bb/fetch/svk.py @@ -36,7 +36,7 @@ class Svk(Fetch): """Class to fetch a module or modules from svk repositories""" def supports(self, url, ud, d): """ - Check to see if a given url can be fetched with cvs. + Check to see if a given url can be fetched with svk. """ return ud.type in ['svk'] diff --git a/bitbake-dev/lib/bb/fetch/wget.py b/bitbake-dev/lib/bb/fetch/wget.py index a0dca94040..fd93c7ec46 100644 --- a/bitbake-dev/lib/bb/fetch/wget.py +++ b/bitbake-dev/lib/bb/fetch/wget.py @@ -36,7 +36,7 @@ class Wget(Fetch): """Class to fetch urls via 'wget'""" def supports(self, url, ud, d): """ - Check to see if a given url can be fetched with cvs. + Check to see if a given url can be fetched with wget. """ return ud.type in ['http','https','ftp'] diff --git a/bitbake-dev/lib/bb/msg.py b/bitbake-dev/lib/bb/msg.py index 7990833c2e..3fcf7091be 100644 --- a/bitbake-dev/lib/bb/msg.py +++ b/bitbake-dev/lib/bb/msg.py @@ -47,9 +47,9 @@ domain = bb.utils.Enum( class MsgBase(bb.event.Event): """Base class for messages""" - def __init__(self, msg, d ): + def __init__(self, msg): self._message = msg - event.Event.__init__(self, d) + event.Event.__init__(self) class MsgDebug(MsgBase): """Debug Message""" @@ -100,26 +100,26 @@ def debug(level, domain, msg, fn = None): if not domain: domain = 'default' if debug_level[domain] >= level: - bb.event.fire(MsgDebug(msg, None)) + bb.event.fire(MsgDebug(msg), None) def note(level, domain, msg, fn = None): if not domain: domain = 'default' if level == 1 or verbose or debug_level[domain] >= 1: - bb.event.fire(MsgNote(msg, None)) + bb.event.fire(MsgNote(msg), None) def warn(domain, msg, fn = None): - bb.event.fire(MsgWarn(msg, None)) + bb.event.fire(MsgWarn(msg), None) def error(domain, msg, fn = None): - bb.event.fire(MsgError(msg, None)) + bb.event.fire(MsgError(msg), None) print 'ERROR: ' + msg def fatal(domain, msg, fn = None): - bb.event.fire(MsgFatal(msg, None)) + bb.event.fire(MsgFatal(msg), None) print 'FATAL: ' + msg sys.exit(1) def plain(msg, fn = None): - bb.event.fire(MsgPlain(msg, None)) + bb.event.fire(MsgPlain(msg), None) diff --git a/bitbake-dev/lib/bb/parse/parse_py/BBHandler.py b/bitbake-dev/lib/bb/parse/parse_py/BBHandler.py index f0c3409568..f34599136c 100644 --- a/bitbake-dev/lib/bb/parse/parse_py/BBHandler.py +++ b/bitbake-dev/lib/bb/parse/parse_py/BBHandler.py @@ -114,7 +114,7 @@ def finalise(fn, d): tasklist = data.getVar('__BBTASKS', d) or [] bb.build.add_tasks(tasklist, d) - bb.event.fire(bb.event.RecipeParsed(fn, d)) + bb.event.fire(bb.event.RecipeParsed(fn), d) def handle(fn, d, include = 0): diff --git a/bitbake-dev/lib/bb/parse/parse_py/ConfHandler.py b/bitbake-dev/lib/bb/parse/parse_py/ConfHandler.py index c9f1ea13fb..23316ada58 100644 --- a/bitbake-dev/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake-dev/lib/bb/parse/parse_py/ConfHandler.py @@ -34,10 +34,17 @@ __require_regexp__ = re.compile( r"require\s+(.+)" ) __export_regexp__ = re.compile( r"export\s+(.+)" ) def init(data): - if not bb.data.getVar('TOPDIR', data): - bb.data.setVar('TOPDIR', os.getcwd(), data) + topdir = bb.data.getVar('TOPDIR', data) + if not topdir: + topdir = os.getcwd() + bb.data.setVar('TOPDIR', topdir, data) if not bb.data.getVar('BBPATH', data): - bb.data.setVar('BBPATH', os.path.join(sys.prefix, 'share', 'bitbake'), data) + from pkg_resources import Requirement, resource_filename + bitbake = Requirement.parse("bitbake") + datadir = resource_filename(bitbake, "../share/bitbake") + basedir = resource_filename(bitbake, "..") + bb.data.setVar('BBPATH', '%s:%s:%s' % (topdir, datadir, basedir), data) + def supports(fn, d): return localpath(fn, d)[-5:] == ".conf" diff --git a/bitbake-dev/lib/bb/runqueue.py b/bitbake-dev/lib/bb/runqueue.py index 8b6e12d185..c3ad442e47 100644 --- a/bitbake-dev/lib/bb/runqueue.py +++ b/bitbake-dev/lib/bb/runqueue.py @@ -857,6 +857,7 @@ class RunQueue: self.runq_running = [] self.runq_complete = [] self.build_pids = {} + self.build_pipes = {} self.failed_fnids = [] # Mark initial buildable tasks @@ -870,7 +871,7 @@ class RunQueue: self.state = runQueueRunning - event.fire(bb.event.StampUpdate(self.target_pairs, self.dataCache.stamp, self.cfgData)) + event.fire(bb.event.StampUpdate(self.target_pairs, self.dataCache.stamp), self.cfgData) def task_complete(self, task): """ @@ -903,7 +904,7 @@ class RunQueue: self.stats.taskFailed() fnid = self.runq_fnid[task] self.failed_fnids.append(fnid) - bb.event.fire(runQueueTaskFailed(task, self.stats, self, self.cfgData)) + bb.event.fire(runQueueTaskFailed(task, self.stats, self), self.cfgData) if self.taskData.abort: self.state = runQueueCleanup @@ -935,53 +936,67 @@ class RunQueue: sys.stdout.flush() sys.stderr.flush() - try: + try: + pipein, pipeout = os.pipe() pid = os.fork() except OSError, e: bb.msg.fatal(bb.msg.domain.RunQueue, "fork failed: %d (%s)" % (e.errno, e.strerror)) if pid == 0: + os.close(pipein) # Save out the PID so that the event can include it the # events bb.event.worker_pid = os.getpid() + bb.event.worker_pipe = pipeout - bb.event.fire(runQueueTaskStarted(task, self.stats, self, self.cfgData)) - bb.msg.note(1, bb.msg.domain.RunQueue, - "Running task %d of %d (ID: %s, %s)" % (self.stats.completed + self.stats.active + 1, - self.stats.total, - task, - self.get_user_idstring(task))) self.state = runQueueChildProcess |
