I have a preset-based plain CMake project so that I can build and test it with cmake --preset $PRESET && cmake --build --preset $PRESET && ctest --preset $PRESET
. Note that it nicely interacts with Microsoft's CMake Tools extension for Visual Studio Code, be it for building, testing, debugging and Intellisense.
Since I want to handle multiple presets in parallel, I set CMakePresets.json
's binaryDir
property to ${sourceDir}/build/${presetName}/
.
I want to also build this plain CMake project with colcon. colcon build --cmake-args "--preset $PRESET"
doesn't work, though, as it produces
WARNING:colcon.colcon_cmake.task.cmake.build:Could not build CMake package 'root_project_name' because the CMake cache has no 'CMAKE_PROJECT_NAME' variable
root_project_name
being the argument to CMake's project()
command in the top CMakeLists.txt
.
How can I resolve this warning and the subsequent build failure?
Not setting CMakePresets.json
's binaryDir
property at all works fine with colcon, but doesn't allow for multiple preset builds in parallel.
The reason for this behavior is colcon-core's build
verb's passing the build base directory (default: build
) suffixed by the found package's name (here: root_project_name
) to the colcon-cmake extension here.
The solution is to pass the correct build base to colcon (i.e. colcon build --build-base ./build/$PRESET/ --cmake-args "--preset $PRESET"
) and to adapt your CMakePresets.json
's binaryDir
property to ${sourceDir}/build/${presetName}/root_project_name/
.
Note that this then works with colcon test
as well, i.e. colcon test --build-base ./build/$PRESET/ --ctest-args "--preset $PRESET"
.