2016-03-26 13:32:11 +01:00
#! /usr/bin/env python
# encoding: UTF-8
# Thomas Nagy, 2006-2015 (ita)
"""
Add a pre - build hook to remove build files ( declared in the system )
that 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 .
2018-01-31 11:48:43 +02:00
Make sure to set bld . post_mode = waflib . Build . POST_AT_ONCE
2016-03-26 13:32:11 +01:00
"""
from waflib import Logs , Build
from waflib . Runner import Parallel
DYNAMIC_EXT = [ ] # add your non-cleanable files/extensions here
MOC_H_EXTS = ' .cpp .cxx .hpp .hxx .h ' . split ( )
def can_delete ( node ) :
""" Imperfect moc cleanup which does not look for a Q_OBJECT macro in the files """
if not node . name . endswith ( ' .moc ' ) :
return True
base = node . name [ : - 4 ]
p1 = node . parent . get_src ( )
p2 = node . parent . get_bld ( )
for k in MOC_H_EXTS :
h_name = base + k
n = p1 . search_node ( h_name )
if n :
return False
n = p2 . search_node ( h_name )
if n :
return False
# foo.cpp.moc, foo.h.moc, etc.
if base . endswith ( k ) :
return False
return True
# recursion over the nodes to find the stale files
def stale_rec ( node , nodes ) :
if node . abspath ( ) in node . ctx . env [ Build . CFG_FILES ] :
return
if getattr ( node , ' children ' , [ ] ) :
for x in node . children . values ( ) :
if x . name != " c4che " :
stale_rec ( x , nodes )
else :
for ext in DYNAMIC_EXT :
if node . name . endswith ( ext ) :
break
else :
if not node in nodes :
if can_delete ( node ) :
2018-01-31 11:48:43 +02:00
Logs . warn ( ' Removing stale file -> %r ' , node )
2016-03-26 13:32:11 +01:00
node . delete ( )
old = Parallel . refill_task_list
def refill_task_list ( self ) :
iit = old ( self )
bld = self . bld
# execute this operation only once
if getattr ( self , ' stale_done ' , False ) :
return iit
self . stale_done = True
# this does not work in partial builds
2018-01-31 11:48:43 +02:00
if bld . targets != ' * ' :
2016-03-26 13:32:11 +01:00
return iit
# this does not work in dynamic builds
2018-01-31 11:48:43 +02:00
if getattr ( bld , ' post_mode ' ) == Build . POST_AT_ONCE :
2016-03-26 13:32:11 +01:00
return iit
# obtain the nodes to use during the build
nodes = [ ]
2018-01-31 11:48:43 +02:00
for tasks in bld . groups :
2016-03-26 13:32:11 +01:00
for x in tasks :
try :
nodes . extend ( x . outputs )
2018-01-31 11:48:43 +02:00
except AttributeError :
2016-03-26 13:32:11 +01:00
pass
stale_rec ( bld . bldnode , nodes )
return iit
Parallel . refill_task_list = refill_task_list
2018-01-31 11:48:43 +02:00