Blame third_party/waf/waflib/extras/why.py

Packit Service fa3ceb
#! /usr/bin/env python
Packit Service fa3ceb
# encoding: utf-8
Packit Service fa3ceb
# Thomas Nagy, 2010 (ita)
Packit Service fa3ceb
Packit Service fa3ceb
"""
Packit Service fa3ceb
This tool modifies the task signature scheme to store and obtain
Packit Service fa3ceb
information about the task execution (why it must run, etc)::
Packit Service fa3ceb
Packit Service fa3ceb
	def configure(conf):
Packit Service fa3ceb
		conf.load('why')
Packit Service fa3ceb
Packit Service fa3ceb
After adding the tool, a full rebuild is necessary:
Packit Service fa3ceb
waf clean build --zones=task
Packit Service fa3ceb
"""
Packit Service fa3ceb
Packit Service fa3ceb
from waflib import Task, Utils, Logs, Errors
Packit Service fa3ceb
Packit Service fa3ceb
def signature(self):
Packit Service fa3ceb
	# compute the result one time, and suppose the scan_signature will give the good result
Packit Service fa3ceb
	try:
Packit Service fa3ceb
		return self.cache_sig
Packit Service fa3ceb
	except AttributeError:
Packit Service fa3ceb
		pass
Packit Service fa3ceb
Packit Service fa3ceb
	self.m = Utils.md5()
Packit Service fa3ceb
	self.m.update(self.hcode)
Packit Service fa3ceb
	id_sig = self.m.digest()
Packit Service fa3ceb
Packit Service fa3ceb
	# explicit deps
Packit Service fa3ceb
	self.m = Utils.md5()
Packit Service fa3ceb
	self.sig_explicit_deps()
Packit Service fa3ceb
	exp_sig = self.m.digest()
Packit Service fa3ceb
Packit Service fa3ceb
	# env vars
Packit Service fa3ceb
	self.m = Utils.md5()
Packit Service fa3ceb
	self.sig_vars()
Packit Service fa3ceb
	var_sig = self.m.digest()
Packit Service fa3ceb
Packit Service fa3ceb
	# implicit deps / scanner results
Packit Service fa3ceb
	self.m = Utils.md5()
Packit Service fa3ceb
	if self.scan:
Packit Service fa3ceb
		try:
Packit Service fa3ceb
			self.sig_implicit_deps()
Packit Service fa3ceb
		except Errors.TaskRescan:
Packit Service fa3ceb
			return self.signature()
Packit Service fa3ceb
	impl_sig = self.m.digest()
Packit Service fa3ceb
Packit Service fa3ceb
	ret = self.cache_sig = impl_sig + id_sig + exp_sig + var_sig
Packit Service fa3ceb
	return ret
Packit Service fa3ceb
Packit Service fa3ceb
Packit Service fa3ceb
Task.Task.signature = signature
Packit Service fa3ceb
Packit Service fa3ceb
old = Task.Task.runnable_status
Packit Service fa3ceb
def runnable_status(self):
Packit Service fa3ceb
	ret = old(self)
Packit Service fa3ceb
	if ret == Task.RUN_ME:
Packit Service fa3ceb
		try:
Packit Service fa3ceb
			old_sigs = self.generator.bld.task_sigs[self.uid()]
Packit Service fa3ceb
		except (KeyError, AttributeError):
Packit Service fa3ceb
			Logs.debug("task: task must run as no previous signature exists")
Packit Service fa3ceb
		else:
Packit Service fa3ceb
			new_sigs = self.cache_sig
Packit Service fa3ceb
			def v(x):
Packit Service fa3ceb
				return Utils.to_hex(x)
Packit Service fa3ceb
Packit Service fa3ceb
			Logs.debug('Task %r', self)
Packit Service fa3ceb
			msgs = ['* Implicit or scanner dependency', '* Task code', '* Source file, explicit or manual dependency', '* Configuration data variable']
Packit Service fa3ceb
			tmp = 'task: -> %s: %s %s'
Packit Service fa3ceb
			for x in range(len(msgs)):
Packit Service fa3ceb
				l = len(Utils.SIG_NIL)
Packit Service fa3ceb
				a = new_sigs[x*l : (x+1)*l]
Packit Service fa3ceb
				b = old_sigs[x*l : (x+1)*l]
Packit Service fa3ceb
				if (a != b):
Packit Service fa3ceb
					Logs.debug(tmp, msgs[x].ljust(35), v(a), v(b))
Packit Service fa3ceb
	return ret
Packit Service fa3ceb
Task.Task.runnable_status = runnable_status
Packit Service fa3ceb