Merge the two files into env, and make each command explicitly call the function that sets it up in the way that's needed for that command. This means we can finally just import all the modules at the top of each file, without worrying about import order. Phew. While we're here, remove the weird auto-appending-'all'-to-targets feature in env.init(). Instead, do it explicitly, and only from redo and redo-ifchange, only if is_toplevel and no other targets are given.
41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
import sys, os
|
|
import env, state
|
|
from logs import err
|
|
|
|
|
|
def main():
|
|
env.inherit()
|
|
if len(sys.argv[1:]) < 2:
|
|
err('%s: at least 2 arguments expected.\n' % sys.argv[0])
|
|
sys.exit(1)
|
|
|
|
target = sys.argv[1]
|
|
deps = sys.argv[2:]
|
|
|
|
for d in deps:
|
|
assert d != target
|
|
|
|
me = state.File(name=target)
|
|
|
|
# Build the known dependencies of our primary target. This *does* require
|
|
# grabbing locks.
|
|
os.environ['REDO_NO_OOB'] = '1'
|
|
argv = ['redo-ifchange'] + deps
|
|
rv = os.spawnvp(os.P_WAIT, argv[0], argv)
|
|
if rv:
|
|
sys.exit(rv)
|
|
|
|
# We know our caller already owns the lock on target, so we don't have to
|
|
# acquire another one; tell redo-ifchange about that. Also, REDO_NO_OOB
|
|
# persists from up above, because we don't want to do OOB now either.
|
|
# (Actually it's most important for the primary target, since it's the one
|
|
# who initiated the OOB in the first place.)
|
|
os.environ['REDO_UNLOCKED'] = '1'
|
|
argv = ['redo-ifchange', target]
|
|
rv = os.spawnvp(os.P_WAIT, argv[0], argv)
|
|
if rv:
|
|
sys.exit(rv)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|