difference between a build cache and a build dependency

a build dependency defines dependencies between objects

add_custom_target(target_name DEPENDS /path/to/objectfile)

by using a file dependency CMake improves compilation performance by avoiding unnecessary recompilation. Or, perhaps the generated build system does that.

apart from offering lots of features and control, a build cache does this as well.

So, how is a compiler cache any different from what Make already does? Is it seen as a replacement or an extension of behaviour?

They work together. A build cache tool (such as ccache or sccache) can “remember” compilation output from prior runs. With just make, running git checkout $other_branch followed by git checkout $prior_branch will cause all files changed due to the switch to recompile (because timestamps changed). A compiler cache can remember that $prior_branch has been compiled before and skip the actual compilation by pulling the output from the cache instead.