summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@linux.intel.com>2010-10-05 22:21:34 +0100
committerRichard Purdie <rpurdie@linux.intel.com>2010-10-05 22:26:33 +0100
commit35d095c282aa27bb2c5b90b9ebafeaa4a3de907e (patch)
treee4e5b4732ffa2e58f2e93fc51d3bd7e101e5eedf
parent2d93cb0a0d70e6219379363cd80d375e30abebae (diff)
downloadpoky-35d095c282aa27bb2c5b90b9ebafeaa4a3de907e.tar.gz
bitbake/sstate: Implement a lookup function to speed up setscene processing
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
-rw-r--r--bitbake/lib/bb/cache.py3
-rw-r--r--bitbake/lib/bb/runqueue.py26
-rw-r--r--meta/classes/deploy.bbclass2
-rw-r--r--meta/classes/sstate.bbclass26
4 files changed, 55 insertions, 2 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index 646fdecbeb..c6f3794d5e 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -453,6 +453,8 @@ class Cache:
453 if not self.getVar('BROKEN', file_name, True) and not self.getVar('EXCLUDE_FROM_WORLD', file_name, True): 453 if not self.getVar('BROKEN', file_name, True) and not self.getVar('EXCLUDE_FROM_WORLD', file_name, True):
454 cacheData.possible_world.append(file_name) 454 cacheData.possible_world.append(file_name)
455 455
456 cacheData.hashfn[file_name] = self.getVar('BB_HASHFILENAME', file_name, True)
457
456 # Touch this to make sure its in the cache 458 # Touch this to make sure its in the cache
457 self.getVar('__BB_DONT_CACHE', file_name, True) 459 self.getVar('__BB_DONT_CACHE', file_name, True)
458 self.getVar('__VARIANTS', file_name, True) 460 self.getVar('__VARIANTS', file_name, True)
@@ -545,6 +547,7 @@ class CacheData:
545 self.preferred = {} 547 self.preferred = {}
546 self.tasks = {} 548 self.tasks = {}
547 self.basetaskhash = {} 549 self.basetaskhash = {}
550 self.hashfn = {}
548 551
549 """ 552 """
550 Indirect Cache variables 553 Indirect Cache variables
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index dff4ff7f3e..b5167126ee 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -757,7 +757,8 @@ class RunQueue:
757 self.cfgData = cfgData 757 self.cfgData = cfgData
758 self.rqdata = RunQueueData(self, cooker, cfgData, dataCache, taskData, targets) 758 self.rqdata = RunQueueData(self, cooker, cfgData, dataCache, taskData, targets)
759 759
760 self.stamppolicy = bb.data.getVar("BB_STAMP_POLICY", cfgData, 1) or "perfile" 760 self.stamppolicy = bb.data.getVar("BB_STAMP_POLICY", cfgData, True) or "perfile"
761 self.hashvalidate = bb.data.getVar("BB_HASHCHECK_FUNCTION", cfgData, True) or None
761 762
762 self.state = runQueuePrepare 763 self.state = runQueuePrepare
763 764
@@ -1326,6 +1327,29 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
1326 if len(self.sq_revdeps[task]) == 0: 1327 if len(self.sq_revdeps[task]) == 0:
1327 self.runq_buildable[task] = 1 1328 self.runq_buildable[task] = 1
1328 1329
1330 if self.rq.hashvalidate:
1331 sq_hash = []
1332 sq_hashfn = []
1333 sq_fn = []
1334 sq_task = []
1335 for task in range(len(self.sq_revdeps)):
1336 realtask = self.rqdata.runq_setscene[task]
1337 fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[realtask]]
1338 sq_fn.append(fn)
1339 sq_hashfn.append(self.rqdata.dataCache.hashfn[fn])
1340 sq_hash.append(self.rqdata.runq_hash[realtask])
1341 sq_task.append(self.rqdata.runq_task[realtask])
1342
1343 call = self.rq.hashvalidate + "(sq_fn, sq_task, sq_hash, sq_hashfn, d)"
1344 locs = { "sq_fn" : sq_fn, "sq_task" : sq_task, "sq_hash" : sq_hash, "sq_hashfn" : sq_hashfn, "d" : self.cooker.configuration.data }
1345 valid = bb.utils.better_eval(call, locs)
1346 for task in range(len(self.sq_revdeps)):
1347 if task not in valid:
1348 bb.msg.debug(2, bb.msg.domain.RunQueue, "No package found so skipping setscene task %s" % (self.rqdata.get_user_idstring(task)))
1349 self.task_failoutright(task)
1350
1351 #print(str(valid))
1352
1329 bb.msg.note(1, bb.msg.domain.RunQueue, "Executing setscene Tasks") 1353 bb.msg.note(1, bb.msg.domain.RunQueue, "Executing setscene Tasks")
1330 1354
1331 self.rq.state = runQueueSceneRun 1355 self.rq.state = runQueueSceneRun
diff --git a/meta/classes/deploy.bbclass b/meta/classes/deploy.bbclass
index f697e70aa4..c3371421d8 100644
--- a/meta/classes/deploy.bbclass
+++ b/meta/classes/deploy.bbclass
@@ -1,6 +1,6 @@
1DEPLOYDIR = "${WORKDIR}/deploy-${PN}" 1DEPLOYDIR = "${WORKDIR}/deploy-${PN}"
2SSTATETASKS += "do_deploy" 2SSTATETASKS += "do_deploy"
3do_deploy[sstate-name] = "deploy-${PN}" 3do_deploy[sstate-name] = "deploy"
4do_deploy[sstate-inputdirs] = "${DEPLOYDIR}" 4do_deploy[sstate-inputdirs] = "${DEPLOYDIR}"
5do_deploy[sstate-outputdirs] = "${DEPLOY_DIR_IMAGE}" 5do_deploy[sstate-outputdirs] = "${DEPLOY_DIR_IMAGE}"
6 6
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index 855f5a45a7..7f897ae54d 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -9,6 +9,8 @@ SSTATE_PKG = "${SSTATE_DIR}/${SSTATE_PKGNAME}"
9 9
10SSTATE_SCAN_CMD ?= "find ${SSTATE_BUILDDIR} \( -name "*.la" -o -name "*-config" \) -type f" 10SSTATE_SCAN_CMD ?= "find ${SSTATE_BUILDDIR} \( -name "*.la" -o -name "*-config" \) -type f"
11 11
12BB_HASHFILENAME = "${SSTATE_PKGNAME}"
13
12python () { 14python () {
13 if bb.data.inherits_class('native', d): 15 if bb.data.inherits_class('native', d):
14 bb.data.setVar('SSTATE_PKGARCH', bb.data.getVar('BUILD_ARCH', d), d) 16 bb.data.setVar('SSTATE_PKGARCH', bb.data.getVar('BUILD_ARCH', d), d)
@@ -313,3 +315,27 @@ sstate_unpack_package () {
313 cd ${SSTATE_INSTDIR} 315 cd ${SSTATE_INSTDIR}
314 tar -xvzf ${SSTATE_PKG} 316 tar -xvzf ${SSTATE_PKG}
315} 317}
318
319BB_HASHCHECK_FUNCTION = "sstate_checkhashes"
320
321def sstate_checkhashes(sq_fn, sq_task, sq_hash, sq_hashfn, d):
322 ret = []
323 # This needs to go away, FIXME
324 mapping = {
325 "do_populate_sysroot" : "populate-sysroot",
326 "do_package_write_ipk" : "deploy-ipk",
327 "do_package_write_deb" : "deploy-deb",
328 "do_package_write_rpm" : "deploy-rpm",
329 "do_package" : "package",
330 "do_deploy" : "deploy",
331 }
332
333 for task in range(len(sq_fn)):
334 sstatefile = bb.data.expand("${SSTATE_DIR}/" + sq_hashfn[task] + "_" + mapping[sq_task[task]] + ".tgz", d)
335 sstatefile= sstatefile.replace("${BB_TASKHASH}", sq_hash[task])
336 #print("Checking for %s" % sstatefile)
337 if os.path.exists(sstatefile):
338 ret.append(task)
339
340 return ret
341