1 # Copyright (C) 2009 Chris Larson <clarson@kergoth.com>
2 # Released under the MIT license (see COPYING.MIT for the terms)
4 # srctree.bbclass enables operation inside of an existing source tree for a
5 # project, rather than using the fetch/unpack/patch idiom.
7 # By default, it expects that you're keeping the recipe(s) inside the
8 # aforementioned source tree, but you could override S to point at an external
9 # directory and place the recipes in a normal collection/overlay, if you so
12 # It also provides some convenience python functions for assembling your
13 # do_clean, if you want to leverage things like 'git clean' to simplify the
17 # Grab convenience methods & sane default for do_clean
27 merge_tasks performs two operations:
28 1) removes do_patch and its deps from the build entirely.
29 2) merges all of the operations that occur prior to do_populate_sysroot
30 into do_populate_sysroot.
32 This is necessary, because of recipe variants (normal, native, cross,
33 sdk). If a bitbake run happens to want to build more than one of
34 these variants in a single run, it's possible for them to step on one
35 another's toes, due to the shared ${S}. Interleaved
36 configure/compile/install amongst variants will break things badly.
38 from itertools import chain
41 def __gather_taskdeps(task, seen):
42 for dep in d.getVarFlag(task, "deps"):
44 __gather_taskdeps(dep, seen)
48 def gather_taskdeps(task):
50 __gather_taskdeps(task, items)
53 newtask = "do_populate_sysroot_post"
54 mergedtasks = gather_taskdeps(newtask)
56 deltasks = gather_taskdeps("do_patch")
58 for task in (key for key in d.keys()
59 if d.getVarFlag(key, "task") and
60 not key in mergedtasks):
61 deps = d.getVarFlag(task, "deps")
62 for mergetask in mergedtasks:
63 if mergetask in (d.getVarFlag(task, "recrdeptask"),
64 d.getVarFlag(task, "recdeptask"),
65 d.getVarFlag(task, "deptask")):
69 deps.remove(mergetask)
70 #note("removing dep on %s from %s" % (mergetask, task))
72 if not mergetask in deltasks and \
74 #note("adding dep on %s to %s" % (newtask, task))
76 d.setVarFlag(task, "deps", deps)
78 for task in mergedtasks[:-1]:
79 deps = d.getVarFlag(task, "deps")
80 for deltask in deltasks:
83 d.setVarFlag(task, "deps", deps)
85 # Pull cross recipe task deps over
88 for task in mergedtasks[:-1]:
89 if not task in deltasks:
90 depends.append(d.getVarFlag(task, "depends") or "")
91 deptask.append(d.getVarFlag(task, "deptask") or "")
93 d.setVarFlag("do_populate_sysroot_post", "depends", " ".join(depends))
94 d.setVarFlag("do_populate_sysroot_post", "deptask", " ".join(deptask))
100 # Manually run do_install & all of its deps
101 python do_populate_sysroot_post () {
102 from os.path import exists
103 from bb.build import exec_task, exec_func
106 stamp = d.getVar("STAMP", True)
108 def rec_exec_task(task, seen):
109 for dep in d.getVarFlag(task, "deps"):
111 rec_exec_task(dep, seen)
113 if not exists("%s.%s" % (stamp, task)):
114 note("%s: executing task %s" % (d.getVar("PF", True), task))
117 rec_exec_task("do_populate_sysroot", set())
119 addtask populate_sysroot_post after do_populate_sysroot
120 do_populate_sysroot_post[lockfiles] += "${S}/.lock"