#! /usr/bin/env python # encoding: utf-8 # Thomas Nagy, 2006-2010 (ita) """ Add a pre-build hook to remove all build files which do not have a corresponding target This can be used for example to remove the targets that have changed name without performing a full 'waf clean' Of course, it will only work if there are no dynamically generated nodes/tasks, in which case the method will have to be modified to exclude some folders for example. """ VERSION='0.0.1' APPNAME='cc_test' top = '.' def options(opt): opt.load('compiler_c') opt.load('gnu_dirs') def configure(conf): conf.load('compiler_c') def build(bld): import random if random.randint(0, 1): bld(rule='touch ${TGT}', target='foo.h') else: bld(rule='touch ${TGT}', target='bar.h') from waflib import Logs from waflib.Runner import Parallel old = Parallel.refill_task_list def refill_task_list(self): iit = old(self) bld = self.bld if bld.options.targets and bld.options.targets != '*': return iit # execute only once if getattr(self, 'clean', False): return iit self.clean = True # obtain the nodes to use during the build nodes = [] for i in range(len(bld.groups)): tasks = bld.get_tasks_group(i) for x in tasks: try: nodes.extend(x.outputs) except: pass # recursion over the nodes to find the stale files def iter(node): if getattr(node, 'children', []): for x in node.children.values(): iter(x) else: if not node in nodes: Logs.warn("stale file found -> %s" % node.abspath()) node.delete() iter(bld.bldnode) return iit Parallel.refill_task_list = refill_task_list