Fabricate uses strace to find all uses of open() during the build (gcc or whichever compilation tool) to build a dependency tree for each the sources specified, for each target built, so that later re-builds only re-compile the files modified since the last build. This way, you don't need to specify the dependency structure yourself.
As for standardizing on a build system, I have mixed feelings about using automake. It's a PITA, even the presenters admit this. All the problems with regenerating the configure, autoconf-ing, incompatibilities between versions, etc make it an absolute pain to use. Extending something like waf or fabricate to perform all the tests that are needed (is libA around? what about libB?, etc), and to build a monolithic C function to grab platform-specific information seems like a much less painful approach. Also, fabricate is a single python file that can easily be included with your package -- not the best approach, but it could give something like a make.py a fallback if it's not available system-wide.