2010-11-13 00:45:49 -08:00
|
|
|
#!/usr/bin/python
|
|
|
|
|
import sys, os
|
|
|
|
|
import vars
|
2010-11-13 01:39:37 -08:00
|
|
|
from helpers import sname, add_dep, debug, err, mkdirp, unlink
|
2010-11-13 00:45:49 -08:00
|
|
|
|
|
|
|
|
|
2010-11-16 05:46:52 -08:00
|
|
|
def _dirty_deps(t, depth, fromdir):
|
2010-11-13 00:45:49 -08:00
|
|
|
debug('%s?%s\n' % (depth, t))
|
2010-11-16 05:46:52 -08:00
|
|
|
if not os.path.exists(sname('stamp', t, fromdir)):
|
2010-11-13 00:45:49 -08:00
|
|
|
debug('%s-- DIRTY (no stamp)\n' % depth)
|
|
|
|
|
return True
|
|
|
|
|
|
2010-11-16 05:46:52 -08:00
|
|
|
stamptime = os.stat(sname('stamp', t, fromdir)).st_mtime
|
2010-11-13 00:45:49 -08:00
|
|
|
try:
|
2010-11-16 05:46:52 -08:00
|
|
|
realtime = os.stat(os.path.join(fromdir or '', t)).st_mtime
|
2010-11-13 00:45:49 -08:00
|
|
|
except OSError:
|
|
|
|
|
realtime = 0
|
|
|
|
|
|
|
|
|
|
if stamptime != realtime:
|
|
|
|
|
debug('%s-- DIRTY (mtime)\n' % depth)
|
|
|
|
|
return True
|
|
|
|
|
|
2010-11-16 05:46:52 -08:00
|
|
|
for sub in open(sname('dep', t, fromdir)).readlines():
|
2010-11-13 00:45:49 -08:00
|
|
|
assert(sub[0] in ('c','m'))
|
|
|
|
|
assert(sub[1] == ' ')
|
|
|
|
|
assert(sub[-1] == '\n')
|
|
|
|
|
mode = sub[0]
|
|
|
|
|
name = sub[2:-1]
|
|
|
|
|
if mode == 'c':
|
|
|
|
|
if os.path.exists(name):
|
|
|
|
|
debug('%s-- DIRTY (created)\n' % depth)
|
|
|
|
|
return True
|
|
|
|
|
elif mode == 'm':
|
2010-11-16 05:46:52 -08:00
|
|
|
if dirty_deps(name, depth + ' ', fromdir=vars.BASE):
|
2010-11-13 00:45:49 -08:00
|
|
|
#debug('%s-- DIRTY (sub)\n' % depth)
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
2010-11-16 05:46:52 -08:00
|
|
|
def dirty_deps(t, depth, fromdir=None):
|
|
|
|
|
if _dirty_deps(t, depth, fromdir):
|
|
|
|
|
unlink(sname('stamp', t, fromdir)) # short circuit future checks
|
2010-11-13 00:45:49 -08:00
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not vars.TARGET:
|
2010-11-13 01:21:59 -08:00
|
|
|
err('redo-ifchange: error: must be run from inside a .do\n')
|
|
|
|
|
sys.exit(100)
|
2010-11-13 00:45:49 -08:00
|
|
|
|
2010-11-13 02:09:42 -08:00
|
|
|
try:
|
|
|
|
|
want_build = []
|
|
|
|
|
for t in sys.argv[1:]:
|
|
|
|
|
mkdirp('%s/.redo' % vars.BASE)
|
|
|
|
|
add_dep(vars.TARGET, 'm', t)
|
|
|
|
|
if dirty_deps(t, depth = ''):
|
|
|
|
|
want_build.append(t)
|
|
|
|
|
|
|
|
|
|
if want_build:
|
|
|
|
|
os.execvp('redo', ['redo', '--'] + want_build)
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
|
sys.exit(200)
|