diff options
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/toaster/bldcontrol/localhostbecontroller.py | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py index a9909b8e1e..62fff1da34 100644 --- a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py +++ b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py | |||
@@ -23,9 +23,11 @@ | |||
23 | import os | 23 | import os |
24 | import sys | 24 | import sys |
25 | import re | 25 | import re |
26 | import shutil | ||
26 | from django.db import transaction | 27 | from django.db import transaction |
27 | from django.db.models import Q | 28 | from django.db.models import Q |
28 | from bldcontrol.models import BuildEnvironment, BRLayer, BRVariable, BRTarget, BRBitbake | 29 | from bldcontrol.models import BuildEnvironment, BRLayer, BRVariable, BRTarget, BRBitbake |
30 | from orm.models import CustomImageRecipe, Layer, Layer_Version, ProjectLayer | ||
29 | import subprocess | 31 | import subprocess |
30 | 32 | ||
31 | from toastermain import settings | 33 | from toastermain import settings |
@@ -197,7 +199,7 @@ class LocalhostBEController(BuildEnvironmentController): | |||
197 | return local_checkout_path | 199 | return local_checkout_path |
198 | 200 | ||
199 | 201 | ||
200 | def setLayers(self, bitbakes, layers): | 202 | def setLayers(self, bitbakes, layers, targets): |
201 | """ a word of attention: by convention, the first layer for any build will be poky! """ | 203 | """ a word of attention: by convention, the first layer for any build will be poky! """ |
202 | 204 | ||
203 | assert self.be.sourcedir is not None | 205 | assert self.be.sourcedir is not None |
@@ -299,6 +301,51 @@ class LocalhostBEController(BuildEnvironmentController): | |||
299 | if not os.path.exists(bblayerconf): | 301 | if not os.path.exists(bblayerconf): |
300 | raise BuildSetupException("BE is not consistent: bblayers.conf file missing at %s" % bblayerconf) | 302 | raise BuildSetupException("BE is not consistent: bblayers.conf file missing at %s" % bblayerconf) |
301 | 303 | ||
304 | # 6. create custom layer and add custom recipes to it | ||
305 | layerpath = os.path.join(self.be.sourcedir, "_meta-toaster-custom") | ||
306 | if os.path.isdir(layerpath): | ||
307 | shutil.rmtree(layerpath) # remove leftovers from previous builds | ||
308 | for target in targets: | ||
309 | try: | ||
310 | customrecipe = CustomImageRecipe.objects.get(name=target.target, | ||
311 | project=bitbakes[0].req.project) | ||
312 | except CustomImageRecipe.DoesNotExist: | ||
313 | continue # not a custom recipe, skip | ||
314 | |||
315 | # create directory structure | ||
316 | for name in ("conf", "recipes"): | ||
317 | path = os.path.join(layerpath, name) | ||
318 | if not os.path.isdir(path): | ||
319 | os.makedirs(path) | ||
320 | |||
321 | # create layer.oonf | ||
322 | config = os.path.join(layerpath, "conf", "layer.conf") | ||
323 | if not os.path.isfile(config): | ||
324 | with open(config, "w") as conf: | ||
325 | conf.write('BBPATH .= ":${LAYERDIR}"\nBBFILES += "${LAYERDIR}/recipes/*.bb"\n') | ||
326 | |||
327 | # create recipe | ||
328 | recipe = os.path.join(layerpath, "recipes", "%s.bb" % target.target) | ||
329 | with open(recipe, "w") as recipef: | ||
330 | recipef.write("require %s\n" % customrecipe.base_recipe.recipe.file_path) | ||
331 | packages = [pkg.name for pkg in customrecipe.packages.all()] | ||
332 | if packages: | ||
333 | recipef.write('IMAGE_INSTALL = "%s"\n' % ' '.join(packages)) | ||
334 | |||
335 | # create *Layer* objects needed for build machinery to work | ||
336 | layer = Layer.objects.get_or_create(name="Toaster Custom layer", | ||
337 | summary="Layer for custom recipes", | ||
338 | vcs_url="file://%s" % layerpath)[0] | ||
339 | breq = target.req | ||
340 | lver = Layer_Version.objects.get_or_create(project=breq.project, layer=layer, | ||
341 | dirpath=layerpath, build=breq.build)[0] | ||
342 | ProjectLayer.objects.get_or_create(project=breq.project, layercommit=lver, | ||
343 | optional=False) | ||
344 | BRLayer.objects.get_or_create(req=breq, name=layer.name, dirpath=layerpath, | ||
345 | giturl="file://%s" % layerpath) | ||
346 | if os.path.isdir(layerpath): | ||
347 | layerlist.append(layerpath) | ||
348 | |||
302 | BuildEnvironmentController._updateBBLayers(bblayerconf, layerlist) | 349 | BuildEnvironmentController._updateBBLayers(bblayerconf, layerlist) |
303 | 350 | ||
304 | self.islayerset = True | 351 | self.islayerset = True |
@@ -316,7 +363,7 @@ class LocalhostBEController(BuildEnvironmentController): | |||
316 | 363 | ||
317 | def triggerBuild(self, bitbake, layers, variables, targets): | 364 | def triggerBuild(self, bitbake, layers, variables, targets): |
318 | # set up the buid environment with the needed layers | 365 | # set up the buid environment with the needed layers |
319 | self.setLayers(bitbake, layers) | 366 | self.setLayers(bitbake, layers, targets) |
320 | self.writeConfFile("conf/toaster-pre.conf", variables) | 367 | self.writeConfFile("conf/toaster-pre.conf", variables) |
321 | self.writeConfFile("conf/toaster.conf", raw = "INHERIT+=\"toaster buildhistory\"") | 368 | self.writeConfFile("conf/toaster.conf", raw = "INHERIT+=\"toaster buildhistory\"") |
322 | 369 | ||