Reputation: 259
Newbie question. I recently came across a project that contained lots of files and external libraries. Some of these libraries contained Makefiles and CMakeLists.txt. Im building a similar project that involves external libraries. Is it necessary to learn both CMake and make. Or is CMake sufficient?
Upvotes: 22
Views: 14931
Reputation: 42842
No need to learn to write a makefile
, since CMake is an abstraction layer or "meta-make" generating the makefiles for you. And as any abstraction layer you just need to learn using its functions. But you also need to understand the task its was developed for. In this case e.g. What is a build tool? or What is a native build environment?
But cmake - in combination with ctest, cpack and cdash - is much more then that, it does (mostly) eliminate the need to learn the compiler/linker switches, your platforms/frameworks handling of libraries/executables and their installation, etc.
Out of my experience with using CMake in my projects:
The downside: you need to put it to a test on all your targeted environments (admittedly that's nothing specific for CMake). In an closed environment (e.g. inside a company) it's relatively easy to maintain, but in e.g. an opensource setting there will always be the one or other precedent where you will need to tweak your CMake script a little.
The upside: CMake is widely used/supported in C/C++ projects and it gives me as potential user of your project the option to take my build environment and make tool of choice (e.g. I have replaced make
with ninja
in my projects).
References
Upvotes: 15
Reputation: 70213
CMake is a meta-buildsystem.
Using cmake
and the settings in CMakeLists.txt
, CMake will generate the build files for the target platform. That could be Makefiles, Visual Studio solutions, Ninja files, KDevelop project files, ...
If the project is set up to utilize CMake, you should have no need to even look at the buildfiles (Makefiles) generated. They are strictly temporary.
Upvotes: 2
Reputation: 4031
CMake is a Makefile (and other project files) generator. You don't need to learn make
unless you're going to hook into CMake itself.
However, some classical make
knowledges are still useful, such as:
-j
flag for parallelmake V=1
for verbose outputmake clean
for cleaningmake install
and the DESTDIR
parametersUpvotes: 2