summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Bartosh <ed.bartosh@linux.intel.com>2016-04-06 17:46:22 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-04-06 23:00:10 +0100
commitaba8e19bf609196f749e185d43571f706707e408 (patch)
tree5483908952c70959a7725f8af462f30eae927850
parent198bf7e6b8d7f847f2619b71c6bd86a9a76156c9 (diff)
downloadopenembedded-core-contrib-aba8e19bf609196f749e185d43571f706707e408.tar.gz
toaster: reimplement triggerBuild
Reimplemented triggerBuild method to support one build directory per project: - start bitbake server from the cloned repository - don't run observer - run bitbake build directly instead of triggering it through xmlrpc [YOCTO #7880] [YOCTO #9058] [YOCTO #8958] Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com> Signed-off-by: Michael Wood <michael.g.wood@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/toaster/bldcontrol/localhostbecontroller.py102
1 files changed, 67 insertions, 35 deletions
diff --git a/lib/toaster/bldcontrol/localhostbecontroller.py b/lib/toaster/bldcontrol/localhostbecontroller.py
index 0a2e41d8c8..2e3aa37d01 100644
--- a/lib/toaster/bldcontrol/localhostbecontroller.py
+++ b/lib/toaster/bldcontrol/localhostbecontroller.py
@@ -250,44 +250,76 @@ class LocalhostBEController(BuildEnvironmentController):
def triggerBuild(self, bitbake, layers, variables, targets, brbe):
- # set up the build environment with the needed layers
- self.setLayers(bitbake, layers, targets)
+ layers = self.setLayers(bitbake, layers, targets)
+
+ # init build environment from the clone
+ builddir = '%s-toaster-%d' % (self.be.builddir, bitbake.req.project.id)
+ oe_init = os.path.join(self.pokydirname, 'oe-init-build-env')
+ # init build environment
+ self._shellcmd('source %s %s' % (oe_init, builddir), self.be.sourcedir)
+
+ # update bblayers.conf
+ bblconfpath = os.path.join(builddir, "conf/bblayers.conf")
+ conflines = open(bblconfpath, "r").readlines()
+ skip = False
+ with open(bblconfpath, 'w') as bblayers:
+ for line in conflines:
+ if line.startswith("# line added by toaster"):
+ skip = True
+ continue
+ if skip:
+ skip = False
+ else:
+ bblayers.write(line)
+
+ bblayers.write('# line added by toaster build control\n'
+ 'BBLAYERS = "%s"' % ' '.join(layers))
# write configuration file
- filepath = os.path.join(self.be.builddir, "conf/toaster.conf")
- with open(filepath, 'w') as conf:
+ confpath = os.path.join(builddir, 'conf/toaster.conf')
+ with open(confpath, 'w') as conf:
for var in variables:
conf.write('%s="%s"\n' % (var.name, var.value))
conf.write('INHERIT+="toaster buildhistory"')
- # get the bb server running with the build req id and build env id
- bbctrl = self.getBBController()
-
- # set variables; TOASTER_BRBE is not set on the server, as this
- # causes events from command-line builds to be attached to the last
- # Toaster-triggered build; instead, TOASTER_BRBE is fired as an event so
- # that toasterui can set it on the buildinfohelper;
- # see https://bugzilla.yoctoproject.org/show_bug.cgi?id=9021
- for var in variables:
- if var.name == 'TOASTER_BRBE':
- bbctrl.triggerEvent('bb.event.MetadataEvent("SetBRBE", "%s")' \
- % var.value)
- else:
- bbctrl.setVariable(var.name, var.value)
-
- # Add 'toaster' and 'buildhistory' to INHERIT variable
- inherit = {item.strip() for item in bbctrl.getVariable('INHERIT').split()}
- inherit = inherit.union(["toaster", "buildhistory"])
- bbctrl.setVariable('INHERIT', ' '.join(inherit))
-
- # trigger the build command
- task = reduce(lambda x, y: x if len(y)== 0 else y, map(lambda y: y.task, targets))
- if len(task) == 0:
- task = None
-
- bbctrl.build(list(map(lambda x:x.target, targets)), task)
-
- logger.debug("localhostbecontroller: Build launched, exiting. Follow build logs at %s/toaster_ui.log" % self.be.builddir)
-
- # disconnect from the server
- bbctrl.disconnect()
+ # run bitbake server from the clone
+ bitbake = os.path.join(self.pokydirname, 'bitbake', 'bin', 'bitbake')
+ self._shellcmd('source %s %s; BITBAKE_UI="" %s --read %s '
+ '--server-only -t xmlrpc -B 0.0.0.0:0' % (oe_init, builddir,
+ bitbake, confpath), self.be.sourcedir)
+
+ # read port number from bitbake.lock
+ self.be.bbport = ""
+ bblock = os.path.join(builddir, 'bitbake.lock')
+ with open(bblock) as fplock:
+ for line in fplock:
+ if ":" in line:
+ self.be.bbport = line.split(":")[-1].strip()
+ logger.debug("localhostbecontroller: bitbake port %s", self.be.bbport)
+ break
+
+ if not self.be.bbport:
+ raise BuildSetupException("localhostbecontroller: can't read bitbake port from %s" % bblock)
+
+ self.be.bbaddress = "localhost"
+ self.be.bbstate = BuildEnvironment.SERVER_STARTED
+ self.be.lock = BuildEnvironment.LOCK_RUNNING
+ self.be.save()
+
+ bbtargets = ''
+ for target in targets:
+ task = target.task
+ if task:
+ if not task.startswith('do_'):
+ task = 'do_' + task
+ task = ':%s' % task
+ bbtargets += '%s%s ' % (target.target, task)
+
+ # run build with local bitbake
+ log = os.path.join(builddir, 'toaster_ui.log')
+ self._shellcmd('TOASTER_BRBE="%s" BBSERVER="0.0.0.0:-1" '
+ '../bitbake/bin/bitbake %s -u toasterui '
+ '>>%s 2>&1 &' % (brbe, bbtargets, log), builddir)
+
+ logger.debug('localhostbecontroller: Build launched, exiting. '
+ 'Follow build logs at %s' % log)