./configure is not for dependencies, but for platform configuration. Consider that ./configure is used before you do a full build. A full build doesn't need dependencies; an incremental one does.
The configure script is hack to solve another "worse": no direct way to get pertinent platform information from the C environment, like what functions are available, how big is some type and so forth.
You can get the size of a type, the problem is you can't get it at preprocessor time. Which is the result of another problem: the C language operates in two phases: preprocessing and compiling (three, if you count linking). Preprocessing, compiling, and linking phases are walled off from each other, resulting in problems. (Preprocessing shouldn't even be a thing that you do to most source code.)
My understanding is that other languages that don't have this separation of compiling objects and linking them together, can't do incremental builds, and are generally quite slow to build.
C++ is infamously slow to build. I've seen the results of profiling Clang (known as a particularly fast C++ compiler) and the preprocessor takes a big chunk of time. C compiles a fair bit faster.
Try out the Mono compiler for C# some time. It is so fast that you might as well recompile your entire project every time you change one line of code. I'd pay serious money to get that kind of performance from a C++ compiler. Tons of other compilers are really fast. JIT is fast all modern browsers. Go compiles in a snap. Python starts running immediately.
The only other language I use with a compile time comparable to C++ is Haskell.
The configure script is hack to solve another "worse": no direct way to get pertinent platform information from the C environment, like what functions are available, how big is some type and so forth.