CMake: A Developer’s Journey

DZone 's Guide to

CMake: A Developer’s Journey

Anything that makes cross-platform building less of a hassle is worth a look. CMake has its quirks but it just might simplify your multiplatform world.

· Mobile Zone ·
Free Resource

I love build tools, and CMake has great potential. The documentation and examples aren’t great, though. Here’s my journey so far…

What is CMake?

If you’ve not come across it, CMake is a cross-platform build tool. Given a single project definition of dependencies, components, libraries, and executables, CMake can generate system-specific build configuration for many platforms. You are then free to use the development tools of your choice.

A single definition allows generation of Unix Makefiles, Eclipse project files, Mac XCode project files, and Visual Studio files, to name but a few.

This means supporting cross-platform development is much easier… in theory.

Sounds Too Good to Be True!

Of course, the devil is in the detail. CMake’s strength is its flexibility. Its weakness is that this flexibility means you can construct the files in a number of ways to accomplish the same task. This can make it hard to learn and to find examples to apply to your own project.

Think of CMake as the Perl of build systems.

The documentation on cmake.org isn’t the easiest to follow either. Descriptions are provided for common CMake tasks, but no real world examples for how they are used.

Equally, as we all know, build settings need to be tweaked depending on Operating System and Compiler used. These are left for the CMake build file developer to fathom.

In my project, MLCPlusPlus (A MarkLogic Server C++ REST API binding library), I copied the CMake file for my main dependency, Microsoft’s excellent cpprest library, and re-worked it.

This at least gave me a working build I knew would link with their cpprest (a.k.a. casablanca) library.

From there the real fun began.

Adding Doxygen documentation build support, supporting Mac OS X Universal Binary builds (archaic I know… don’t ask…), supporting make install and CPack.

I’m still not quite complete. For example, installing dependencies before build isn’t generally supported — CMake assumes all dependencies exist and just ‘discovers’ their location/settings on your machine. No links to npm/yum/brew/nuget or the like.

In short, there’s a lot of leg work to get CMake working.

Negative Nancy

I don’t want to appear all negative and shouty. I love CMake. It’s just that the documentation ain’t great.

The CMake files I have now, for example, are positively well laid out, logical, and even quite pretty (for a text file…). It’s taken a lot of effort to get there, though.

The Solution

I’d love to spend some time documenting a set of basic tutorials for CMake using a real library as an example. It’s just getting the time as ever, isn’t it?

I certainly wish that the excellent people behind CMake spend more time prettifying their website and generating good tutorial documentation.

CMake could easily become the build system of choice if they spent just a little time working on docs, and CMake’s integration with dependency tools, and install tools — not just build tools.

If I get time I’ll certainly write a few blog posts about it, and provide some sample project folders. In the meantime, if you have some great resources for CMake, please add a comment and share with the community!

build tools, cmake, cross platform

Published at DZone with permission of Adam Fowler , DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}