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