If a checksummed target A used to exist but is now missing, and we tried to redo-ifchange that exact file, we would unnecessarily run 'redo-oob A A'; that is, we have to build A in order to determine if A needs to be built. The sub-targets of redo-oob aren't run with REDO_UNLOCKED, so this would deadlock instantly. Add an assertion to redo-oob to ensure we never try to redo-ifchange the primary target (thus converting the deadlock into an exception). And skip doing redo-oob when the target is already the same as the thing we have to check.
30 lines
649 B
Python
Executable file
30 lines
649 B
Python
Executable file
#!/usr/bin/python
|
|
import sys, os
|
|
import state
|
|
from helpers import err
|
|
|
|
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)
|
|
|
|
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.
|
|
os.environ['REDO_UNLOCKED'] = '1'
|
|
argv = ['redo-ifchange', target]
|
|
rv = os.spawnvp(os.P_WAIT, argv[0], argv)
|
|
if rv:
|
|
sys.exit(rv)
|