2010-11-12 05:24:46 -08:00
|
|
|
#!/usr/bin/python
|
2010-11-21 02:08:05 -08:00
|
|
|
import sys, os
|
2010-11-16 04:13:17 -08:00
|
|
|
import options, jwack, atoi
|
2010-11-12 05:24:46 -08:00
|
|
|
|
|
|
|
|
optspec = """
|
|
|
|
|
redo [targets...]
|
|
|
|
|
--
|
2010-11-13 04:36:44 -08:00
|
|
|
j,jobs= maximum number of jobs to build at once
|
2010-11-12 07:03:06 -08:00
|
|
|
d,debug print dependency checks as they happen
|
2010-11-12 07:10:55 -08:00
|
|
|
v,verbose print commands as they are run
|
2010-11-16 00:14:57 -08:00
|
|
|
shuffle randomize the build order to find dependency bugs
|
2010-11-12 05:24:46 -08:00
|
|
|
"""
|
|
|
|
|
o = options.Options('redo', optspec)
|
|
|
|
|
(opt, flags, extra) = o.parse(sys.argv[1:])
|
|
|
|
|
|
2010-11-13 01:40:37 -08:00
|
|
|
targets = extra or ['all']
|
2010-11-12 05:24:46 -08:00
|
|
|
|
2010-11-13 00:53:55 -08:00
|
|
|
if opt.debug:
|
2010-11-16 04:13:17 -08:00
|
|
|
os.environ['REDO_DEBUG'] = str(opt.debug or 0)
|
2010-11-13 00:53:55 -08:00
|
|
|
if opt.verbose:
|
|
|
|
|
os.environ['REDO_VERBOSE'] = '1'
|
2010-11-16 00:14:57 -08:00
|
|
|
if opt.shuffle:
|
|
|
|
|
os.environ['REDO_SHUFFLE'] = '1'
|
2010-11-13 00:53:55 -08:00
|
|
|
|
2010-11-21 04:29:28 -08:00
|
|
|
is_root = not os.environ.get('REDO', '')
|
2010-11-21 02:16:08 -08:00
|
|
|
|
|
|
|
|
if is_root:
|
|
|
|
|
# toplevel call to redo
|
|
|
|
|
exenames = [os.path.abspath(sys.argv[0]), os.path.realpath(sys.argv[0])]
|
|
|
|
|
if exenames[0] == exenames[1]:
|
|
|
|
|
exenames = [exenames[0]]
|
|
|
|
|
dirnames = [os.path.dirname(p) for p in exenames]
|
|
|
|
|
os.environ['PATH'] = ':'.join(dirnames) + ':' + os.environ['PATH']
|
|
|
|
|
|
2010-11-13 00:53:55 -08:00
|
|
|
base = os.path.commonprefix([os.path.abspath(os.path.dirname(t))
|
|
|
|
|
for t in targets] + [os.getcwd()])
|
|
|
|
|
bsplit = base.split('/')
|
|
|
|
|
for i in range(len(bsplit)-1, 0, -1):
|
2010-11-19 03:15:45 -08:00
|
|
|
newbase = '/'.join(bsplit[:i])
|
|
|
|
|
if os.path.exists(newbase + '/.redo'):
|
2010-11-13 00:53:55 -08:00
|
|
|
base = newbase
|
|
|
|
|
break
|
|
|
|
|
os.environ['REDO_BASE'] = base
|
2010-11-13 01:55:07 -08:00
|
|
|
os.environ['REDO_STARTDIR'] = os.getcwd()
|
2010-11-15 20:39:34 -08:00
|
|
|
os.environ['REDO'] = os.path.abspath(sys.argv[0])
|
2010-11-13 00:53:55 -08:00
|
|
|
|
2010-11-19 03:13:40 -08:00
|
|
|
|
2010-11-21 02:08:05 -08:00
|
|
|
import vars, state, builder
|
|
|
|
|
from helpers import err
|
2010-11-19 03:13:40 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if is_root:
|
2010-11-21 02:08:05 -08:00
|
|
|
state.init()
|
2010-11-13 02:47:54 -08:00
|
|
|
|
2010-11-13 04:36:44 -08:00
|
|
|
try:
|
2010-11-16 04:13:17 -08:00
|
|
|
j = atoi.atoi(opt.jobs or 1)
|
2010-11-13 04:36:44 -08:00
|
|
|
if j < 1 or j > 1000:
|
|
|
|
|
err('invalid --jobs value: %r\n' % opt.jobs)
|
|
|
|
|
jwack.setup(j)
|
|
|
|
|
try:
|
2010-11-19 07:21:09 -08:00
|
|
|
retcode = builder.main(targets, builder.build)
|
2010-11-13 04:36:44 -08:00
|
|
|
finally:
|
|
|
|
|
jwack.force_return_tokens()
|
|
|
|
|
if retcode:
|
|
|
|
|
err('exiting: %d\n' % retcode)
|
2010-11-13 02:09:42 -08:00
|
|
|
sys.exit(retcode)
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
|
sys.exit(200)
|