CMake is anarchy. In order to do it better, here's an example project that contains the following structure:
- A library
foo
that privately depends onBoost::date_time
and provides some functionality. - A library
bar
that solely depends onfoo
. - An executable
baz
that calls a method inbar
.
All projects are set up in a way that they can be installed
and found using find_package()
, as well as added
using add_subdirectory()
. The CMakeLists.txt
files
are heavily documented, but care should be taken to
also have a look at the cmake/*-cmake.in
files of
the individual libraries.
Each installation is versioned, allowing for keeping multiple different versions at the same time. Likewise, installation paths are prefixed with the build configuration.
Blog posts and repositories that helped in assembling this:
- It's Time To Do CMake Right by Pablo Arias and the companion repo
- modern-cmake-sample, as well as
- Easily supporting CMake install and find_package() by Jonathan Müller.