You would have to have a high tolerance for learning SCons. I'm aware that this is not for everyone. Then you could write a SConstruct with dependent tasks in a normal build system way. e.g.

target = env.Command("a task", ...)
platlib = env.Whl("platlib", target, root=".")
whl = env.WhlFile(platlib)

and have each step re-build only when its sources change.

Here is a stackoverflow answer about custom distutils commands. https://stackoverflow.com/questions/1710839/custom-distutils-commands