Dependencies are hard to maintain in any build system. For C++, GNU make can read the files and determine the dependency tree from the #include statements.
Using other sub-components, in the make world, would be using other makefiles. These are known as dependent makefiles and is a very common thing to do. Apache2, for example, requires APR. That, in turn, often requires neon. It's opensource for a reason.
make can also grab the source. Just create another task. (Why are you using CVS and not SVN/SVK/Git/Darcs?)
make can call out to other tools.
Now, if you're absolutely set on hating make (which is dumb, imho), then take a look at Rake (Ruby's make). It, at least, is sane.
My criteria for good software:
Does it work?
Can someone else come in, make a change, and be reasonably certain no bugs were introduced?