It completely depends on what you are doing.
For a small app of a couple of source files that you wrote for your own use, a quick Makefile is completely sufficient.
When the app grows, you can scale up to a
"real" Makefile that does proper header dependencies, cleanup etc.
But how many Makefiles have you seen that do even that much, properly? And the scaling-up pretty much ends there, unless you're a real wizard with make... and which version of it, anyway?
If your app grows and gets popular, you are going to face issues. You will want to test your app against various versions of third-party libs. You might want to be cross-platform, or at the very least cater for people with different tastes in development environment. (Eclipse CDT vs. ninja vs. make vs. ...) You might want to make use of advanced CMake features, like automated testing, continuous integration, build / test dashboard, or packaging. You might want to integrate other tools into your build process, like code formatters, doxygen, valgrind, or LaTeX for building documentation.
Make and CMake are for different things. Make is one step up from a build script, with an eye on dependency handling, Autotools were a step up from Make
trying to do
some of the things I mentioned above and making a fine hash out of it. CMake is one or two steps up from autotools.
Point in case, you might want to have a look at my
JAWS CMake template setup. I used it for several years to build two seriously large C++ applications at work, and its use has spread into other projects / teams. It is no longer actively maintained, and uses some techniques that are considered obsolete now, but it is / was perfectly servicable. It created DEB packages for Debian-based systems, RPM for RedHat-based systems, and a setup.exe installer for Windows systems, on demand, on checkin, and nightly. It serviced Make builds (both native Linux and MXE-supported MinGW cross-builds), Ninja builds, NMake builds, and MSVC solutions. Every morning I looked at the
CDash dashboard to check if all the builds went well, and if they didn't, I could look up the logfiles to check what went wrong, and with which build / commit.
This goes well beyond what make can do. Overkill for a small app? Yes. Useful for a large, potentially cross-platform app? Hell yes.
It's even more of a no-brainer when you approach it from the other side (VisualStudio). I'd prefer a CMake setup over maintaining a .sln any time.