2010-11-13 00:45:49 -08:00
|
|
|
#!/usr/bin/python
|
2010-12-05 03:58:20 -08:00
|
|
|
import sys, os, errno, stat
|
2010-11-21 21:15:24 -08:00
|
|
|
import vars, state, builder, jwack
|
2010-11-25 06:35:22 -08:00
|
|
|
from helpers import debug, debug2, err, mkdirp, unlink
|
2010-11-13 00:45:49 -08:00
|
|
|
|
|
|
|
|
|
2010-11-21 05:25:47 -08:00
|
|
|
def dirty_deps(t, depth):
|
2010-11-24 02:48:27 -08:00
|
|
|
try:
|
|
|
|
|
st = os.stat(t)
|
|
|
|
|
realtime = st.st_mtime
|
|
|
|
|
except OSError:
|
|
|
|
|
st = None
|
|
|
|
|
realtime = 0
|
|
|
|
|
|
2010-11-21 04:14:52 -08:00
|
|
|
debug('%s?%s\n' % (depth, t))
|
2010-11-21 04:57:04 -08:00
|
|
|
if state.isbuilt(t):
|
2010-11-21 04:14:52 -08:00
|
|
|
debug('%s-- DIRTY (built)\n' % depth)
|
|
|
|
|
return True # has already been built during this session
|
2010-11-21 04:57:04 -08:00
|
|
|
if state.ismarked(t):
|
2010-11-21 04:14:52 -08:00
|
|
|
debug('%s-- CLEAN (marked)\n' % depth)
|
2010-11-21 00:54:35 -08:00
|
|
|
return False # has already been checked during this session
|
2010-11-21 04:14:52 -08:00
|
|
|
|
2010-11-21 04:57:04 -08:00
|
|
|
stamptime = state.stamped(t)
|
2010-11-19 03:03:05 -08:00
|
|
|
if stamptime == None:
|
|
|
|
|
debug('%s-- DIRTY (no stamp)\n' % depth)
|
|
|
|
|
return True
|
2010-11-13 00:45:49 -08:00
|
|
|
|
2010-12-05 03:58:20 -08:00
|
|
|
if stamptime != realtime and not (st and stat.S_ISDIR(st.st_mode)):
|
2010-11-13 00:45:49 -08:00
|
|
|
debug('%s-- DIRTY (mtime)\n' % depth)
|
|
|
|
|
return True
|
|
|
|
|
|
2010-11-21 04:57:04 -08:00
|
|
|
for mode,name in state.deps(t):
|
2010-11-13 00:45:49 -08:00
|
|
|
if mode == 'c':
|
|
|
|
|
if os.path.exists(name):
|
|
|
|
|
debug('%s-- DIRTY (created)\n' % depth)
|
|
|
|
|
return True
|
|
|
|
|
elif mode == 'm':
|
2010-11-21 04:57:04 -08:00
|
|
|
if dirty_deps(os.path.join(vars.BASE, name), depth + ' '):
|
2010-11-21 04:14:52 -08:00
|
|
|
debug('%s-- DIRTY (sub)\n' % depth)
|
2010-11-21 05:25:47 -08:00
|
|
|
state.unstamp(t) # optimization for future callers
|
2010-11-13 00:45:49 -08:00
|
|
|
return True
|
2010-11-21 04:57:04 -08:00
|
|
|
state.mark(t)
|
2010-11-13 00:45:49 -08:00
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
2010-11-21 04:14:52 -08:00
|
|
|
def should_build(t):
|
|
|
|
|
return not state.isbuilt(t) and dirty_deps(t, depth = '')
|
|
|
|
|
|
|
|
|
|
|
2010-11-19 07:32:16 -08:00
|
|
|
rv = 202
|
2010-11-13 02:09:42 -08:00
|
|
|
try:
|
2010-11-25 06:35:22 -08:00
|
|
|
me = os.path.join(vars.STARTDIR,
|
|
|
|
|
os.path.join(vars.PWD, vars.TARGET))
|
|
|
|
|
debug2('TARGET: %r %r %r\n' % (vars.STARTDIR, vars.PWD, vars.TARGET))
|
2010-11-21 21:15:24 -08:00
|
|
|
try:
|
2010-11-21 23:33:11 -08:00
|
|
|
targets = sys.argv[1:]
|
|
|
|
|
for t in targets:
|
2010-11-25 06:35:22 -08:00
|
|
|
state.add_dep(me, 'm', t)
|
2010-11-21 23:33:11 -08:00
|
|
|
rv = builder.main(targets, should_build)
|
2010-11-21 21:15:24 -08:00
|
|
|
finally:
|
|
|
|
|
jwack.force_return_tokens()
|
2010-11-13 02:09:42 -08:00
|
|
|
except KeyboardInterrupt:
|
|
|
|
|
sys.exit(200)
|
2010-11-19 07:32:16 -08:00
|
|
|
sys.exit(rv)
|