From: Robert Ramey (ramey_at_[hidden])
Date: 2024-06-11 05:21:11


I'm trying to figure out how to switch to CMake to build and test my
libraries. I have some experience with this as I've made such files on
sort of an experimental/prototype basis. However it's been some time
since I messed with this so a forgot a lot. Now I'm getting serious so I
have some questions. I've looked over the official CMake documentation.
  It seems complete but some stuff is not well explained. I've spent
some time studying https://github.com/boostorg/cmake at I'm beginning to
see what I have to do. Never-the-less, I still have a few questions:

1) The first lines show

mkdir __build
cd __build
cmake ..
cmake --build .

Does this presume that one starts from the library directory?
Does this syntax work for out of source tree builds? That is, would the
following work?

mkdir /temp/__build
cd /temp/__build
cmake ..
cmake --build .

(very confusing usage of leading __)

ahhhh - I see a problem. I'm thinking of starting from within the
directory of a particular library. I'm presuming "modular boost". Is
this supported?

2) BOOST_INCLUDE_LIBRARY

I would like my CMakeLists.txt file to explicitly list the direct
antecedent libraries (dependencies - bad word usage). So I'd expect to
see something like

add_directory(../filesystem)
add_directory(../regex)
...

So I could just
cd to .../libs/serialization
cmake --build

and have it build the antecedent if and only if required.

3) CMAKE_INSTALL_INCLUDEDIR

I would prefer not to "install" (copy) the include files but just use
the ones from their original locations.

4) BUILD_TESTING

I would prefer to have my library source to look like:

... libs/serialization
   CMakeLists.txt
     // includes add_directory for subdirectorys build, test, example,
profile and ...
     // includes add_directory for antecedent libraries like
add_directory(../libs/filesystem)
   include // directory with include files for users of serialization
library
   build(or src) // source files for library build
     CMakeLists.txt // to build library
   test
     CMakeLists.txt
   example
     CMakeLists.txt
   profile
     CMakeLists.txt

Maybe the add_directory would be conditioned on a CMAKE variable.

So if I invoke

CMake --build test_polymorphic_binary_archive

It would recursively (re)build everything necessary and nothing not
necessary

If I didn't specify a list of targets, it would recursively (re)build
everything that needs (re)building.

This seems totally reasonable and natural to me - it work like make -
but better. It would dovetail with efforts to "modularize" boost.
Users would only have to download libraries they actually use - if
that's what they want. I realized I've glossed over a couple of details,
in particular recursive inclusion of header files and likely some other
stuff. I've also experimented with CMake enough to have a feeling that
what I want to do is not possible. And this is the short version of
what I'd like to do.

Any thoughts on this?