xref: /OK3568_Linux_fs/yocto/poky/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1SLOWTASKS ??= ""
2SSTATEVALID ??= ""
3
4def stamptask(d):
5    import time
6
7    thistask = d.expand("${PN}:${BB_CURRENTTASK}")
8    stampname = d.expand("${TOPDIR}/%s.run" % thistask)
9    with open(stampname, "a+") as f:
10        f.write(d.getVar("BB_UNIHASH") + "\n")
11
12    if d.getVar("BB_CURRENT_MC") != "default":
13        thistask = d.expand("${BB_CURRENT_MC}:${PN}:${BB_CURRENTTASK}")
14    if thistask in d.getVar("SLOWTASKS").split():
15        bb.note("Slowing task %s" % thistask)
16        time.sleep(0.5)
17    if d.getVar("BB_HASHSERVE"):
18        task = d.getVar("BB_CURRENTTASK")
19        if task in ['package', 'package_qa', 'packagedata', 'package_write_ipk', 'package_write_rpm', 'populate_lic', 'populate_sysroot']:
20            bb.parse.siggen.report_unihash(os.getcwd(), d.getVar("BB_CURRENTTASK"), d)
21
22    with open(d.expand("${TOPDIR}/task.log"), "a+") as f:
23        f.write(thistask + "\n")
24
25
26def sstate_output_hash(path, sigfile, task, d):
27    import hashlib
28    h = hashlib.sha256()
29    h.update(d.expand("${PN}:${BB_CURRENTTASK}").encode('utf-8'))
30    return h.hexdigest()
31
32python do_fetch() {
33    # fetch
34    stamptask(d)
35}
36python do_unpack() {
37    # unpack
38    stamptask(d)
39}
40python do_patch() {
41    # patch
42    stamptask(d)
43}
44python do_populate_lic() {
45    # populate_lic
46    stamptask(d)
47}
48python do_prepare_recipe_sysroot() {
49    # prepare_recipe_sysroot
50    stamptask(d)
51}
52python do_configure() {
53    # configure
54    stamptask(d)
55}
56python do_compile() {
57    # compile
58    stamptask(d)
59}
60python do_install() {
61    # install
62    stamptask(d)
63}
64python do_populate_sysroot() {
65    # populate_sysroot
66    stamptask(d)
67}
68python do_package() {
69    # package
70    stamptask(d)
71}
72python do_package_write_ipk() {
73    # package_write_ipk
74    stamptask(d)
75}
76python do_package_write_rpm() {
77    # package_write_rpm
78    stamptask(d)
79}
80python do_packagedata() {
81    # packagedata
82    stamptask(d)
83}
84python do_package_qa() {
85    # package_qa
86    stamptask(d)
87}
88python do_build() {
89    # build
90    stamptask(d)
91}
92do_prepare_recipe_sysroot[deptask] = "do_populate_sysroot"
93do_package[deptask] += "do_packagedata"
94do_build[recrdeptask] += "do_deploy"
95do_build[recrdeptask] += "do_package_write_ipk"
96do_build[recrdeptask] += "do_package_write_rpm"
97do_package_qa[rdeptask] = "do_packagedata"
98do_populate_lic_deploy[recrdeptask] += "do_populate_lic do_deploy"
99
100DEBIANRDEP = "do_packagedata"
101oo_package_write_ipk[rdeptask] = "${DEBIANRDEP}"
102do_package_write_rpm[rdeptask] = "${DEBIANRDEP}"
103
104addtask fetch
105addtask unpack after do_fetch
106addtask patch after do_unpack
107addtask prepare_recipe_sysroot after do_patch
108addtask configure after do_prepare_recipe_sysroot
109addtask compile after do_configure
110addtask install after do_compile
111addtask populate_sysroot after do_install
112addtask package after do_install
113addtask package_write_ipk after do_packagedata do_package
114addtask package_write_rpm after do_packagedata do_package
115addtask packagedata after do_package
116addtask package_qa after do_package
117addtask build after do_package_qa do_package_write_rpm do_package_write_ipk do_populate_sysroot
118
119python do_package_setscene() {
120    stamptask(d)
121}
122python do_package_qa_setscene() {
123    stamptask(d)
124}
125python do_package_write_ipk_setscene() {
126    stamptask(d)
127}
128python do_package_write_rpm_setscene() {
129    stamptask(d)
130}
131python do_packagedata_setscene() {
132    stamptask(d)
133}
134python do_populate_lic_setscene() {
135    stamptask(d)
136}
137python do_populate_sysroot_setscene() {
138    stamptask(d)
139}
140
141addtask package_setscene
142addtask package_qa_setscene
143addtask package_write_ipk_setscene
144addtask package_write_rpm_setscene
145addtask packagedata_setscene
146addtask populate_lic_setscene
147addtask populate_sysroot_setscene
148
149BB_SETSCENE_DEPVALID = "setscene_depvalid"
150
151def setscene_depvalid(task, taskdependees, notneeded, d, log=None):
152    # taskdependees is a dict of tasks which depend on task, each being a 3 item list of [PN, TASKNAME, FILENAME]
153    # task is included in taskdependees too
154    # Return - False - We need this dependency
155    #        - True - We can skip this dependency
156    import re
157
158    def logit(msg, log):
159        if log is not None:
160            log.append(msg)
161        else:
162            bb.debug(2, msg)
163
164    logit("Considering setscene task: %s" % (str(taskdependees[task])), log)
165
166    def isNativeCross(x):
167        return x.endswith("-native") or "-cross-" in x or "-crosssdk" in x or x.endswith("-cross")
168
169    # We only need to trigger populate_lic through direct dependencies
170    if taskdependees[task][1] == "do_populate_lic":
171        return True
172
173    # We only need to trigger packagedata through direct dependencies
174    # but need to preserve packagedata on packagedata links
175    if taskdependees[task][1] == "do_packagedata":
176        for dep in taskdependees:
177            if taskdependees[dep][1] == "do_packagedata":
178                return False
179        return True
180
181    for dep in taskdependees:
182        logit("  considering dependency: %s" % (str(taskdependees[dep])), log)
183        if task == dep:
184            continue
185        if dep in notneeded:
186            continue
187        # do_package_write_* and do_package doesn't need do_package
188        if taskdependees[task][1] == "do_package" and taskdependees[dep][1] in ['do_package', 'do_package_write_ipk', 'do_package_write_rpm', 'do_packagedata', 'do_package_qa']:
189            continue
190        # do_package_write_* need do_populate_sysroot as they're mainly postinstall dependencies
191        if taskdependees[task][1] == "do_populate_sysroot" and taskdependees[dep][1] in ['do_package_write_ipk', 'do_package_write_rpm']:
192            return False
193        # do_package/packagedata/package_qa don't need do_populate_sysroot
194        if taskdependees[task][1] == "do_populate_sysroot" and taskdependees[dep][1] in ['do_package', 'do_packagedata', 'do_package_qa']:
195            continue
196        # Native/Cross packages don't exist and are noexec anyway
197        if isNativeCross(taskdependees[dep][0]) and taskdependees[dep][1] in ['do_package_write_ipk', 'do_package_write_rpm', 'do_packagedata', 'do_package', 'do_package_qa']:
198            continue
199
200        # This is due to the [depends] in useradd.bbclass complicating matters
201        # The logic *is* reversed here due to the way hard setscene dependencies are injected
202        if (taskdependees[task][1] == 'do_package' or taskdependees[task][1] == 'do_populate_sysroot') and taskdependees[dep][0].endswith(('shadow-native', 'shadow-sysroot', 'base-passwd', 'pseudo-native')) and taskdependees[dep][1] == 'do_populate_sysroot':
203            continue
204
205        # Consider sysroot depending on sysroot tasks
206        if taskdependees[task][1] == 'do_populate_sysroot' and taskdependees[dep][1] == 'do_populate_sysroot':
207            # Native/Cross populate_sysroot need their dependencies
208            if isNativeCross(taskdependees[task][0]) and isNativeCross(taskdependees[dep][0]):
209                return False
210            # Target populate_sysroot depended on by cross tools need to be installed
211            if isNativeCross(taskdependees[dep][0]):
212                return False
213            # Native/cross tools depended upon by target sysroot are not needed
214            # Add an exception for shadow-native as required by useradd.bbclass
215            if isNativeCross(taskdependees[task][0]) and taskdependees[task][0] != 'shadow-native':
216                continue
217            # Target populate_sysroot need their dependencies
218            return False
219
220
221        if taskdependees[dep][1] == "do_populate_lic":
222            continue
223
224        # Safe fallthrough default
225        logit(" Default setscene dependency fall through due to dependency: %s" % (str(taskdependees[dep])), log)
226        return False
227    return True
228
229BB_HASHCHECK_FUNCTION = "sstate_checkhashes"
230
231def sstate_checkhashes(sq_data, d, siginfo=False, currentcount=0, **kwargs):
232
233    found = set()
234    missed = set()
235
236    valid = d.getVar("SSTATEVALID").split()
237
238    for tid in sorted(sq_data['hash']):
239        n = os.path.basename(bb.runqueue.fn_from_tid(tid)).split(".")[0] + ":do_" + bb.runqueue.taskname_from_tid(tid)[3:]
240        print(n)
241        stampfile = d.expand("${TOPDIR}/%s.run" % n.replace("do_", ""))
242        if n in valid:
243            bb.note("SState: Found valid sstate for %s" % n)
244            found.add(tid)
245        elif n + ":" + sq_data['hash'][tid] in valid:
246            bb.note("SState: Found valid sstate for %s" % n)
247            found.add(tid)
248        elif os.path.exists(stampfile):
249            with open(stampfile, "r") as f:
250                hash = f.readline().strip()
251            if hash == sq_data['hash'][tid]:
252                bb.note("SState: Found valid sstate for %s (already run)" % n)
253                found.add(tid)
254            else:
255                bb.note("SState: sstate hash didn't match previous run for %s (%s vs %s)" % (n, sq_data['hash'][tid], hash))
256                missed.add(tid)
257        else:
258            missed.add(tid)
259            bb.note("SState: Found no valid sstate for %s (%s)" % (n, sq_data['hash'][tid]))
260
261    return found
262
263