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