Example of tracking files in the build directory to force partial rebuilds

This commit is contained in:
Thomas Nagy 2015-02-08 11:05:28 +01:00
parent d68e1ff072
commit 1985579cb4
No known key found for this signature in database
GPG Key ID: 67A565EDFDF90E64
4 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1 @@
int kkk() {return 0; }

View File

@ -0,0 +1,5 @@
extern int kkk();
int main() {
return kkk();
}

View File

@ -0,0 +1,43 @@
#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2015 (ita)
VERSION = '0.0.1'
APPNAME = 'track_output_files'
top = '.'
import os
from waflib import Logs, Options
def options(opt):
opt.load('compiler_c')
opt.load('build_file_tracker')
def configure(conf):
conf.load('compiler_c')
test_lib = False
def play_test(ctx):
if ctx.cmd != 'build':
return
global test_lib
if not test_lib:
# schedule one more build
test_lib = True
Options.commands.append('change_the_lib')
Options.commands.append(ctx.cmd)
def change_the_lib(ctx):
lst = ctx.path.ant_glob('build/*stlib1.*')
if lst:
os.utime(lst[0].abspath(), None)
Logs.pprint('YELLOW', '-> Touch %r' % lst[0].abspath())
Logs.pprint('YELLOW', '-> Expect a rebuild of dependent files')
def build(bld):
bld.stlib(source='foo.c', target='stlib1')
bld.program(source='main.c', target='app', use='stlib1')
play_test(bld)

View File

@ -0,0 +1,32 @@
#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2015
"""
Force files to depend on the timestamps of those located in the build directory. You may
want to use this to force partial rebuilds, see playground/track_output_files/ for a working example.
Note that there is a variety of ways to implement this, one may want use timestamps on source files too for example,
or one may want to hash the files in the source directory only under certain conditions (md5_tstamp tool)
or to hash the file in the build directory with its timestamp (similar to 'update_outputs')
"""
import os
from waflib import Node, Utils
def get_bld_sig(self):
try:
return self.cache_sig
except AttributeError:
pass
if not self.is_bld() or self.ctx.bldnode is self.ctx.srcnode:
self.sig = Utils.h_file(self.abspath())
self.cache_sig = ret = self.sig
else:
# add the
self.cache_sig = ret = self.sig + str(os.stat(self.abspath()).st_mtime)
return ret
Node.Node.get_bld_sig = get_bld_sig