序言
我有一个基于预设的普通CMake项目,这样我就可以用cmake --preset $PRESET && cmake --build --preset $PRESET && ctest --preset $PRESET
构建和测试它。请注意,无论是用于构建、测试、调试还是Intellisense,它都能很好地与Microsoft针对Visual Studio Code的CMake Tools扩展进行交互。
由于我想并行处理多个预设,所以我将CMakePresets.json
的binaryDir
属性设置为${sourceDir}/build/${presetName}/
。
问题
我也想用colcon构建这个简单的CMake项目。colcon build --cmake-args "--preset $PRESET"
不起作用,因为它产生
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
是CMake的project()
命令在顶部CMakeLists.txt
中的自变量。
如何解决此警告和随后的生成失败?
直接解决方案
完全不设置CMakePresets.json
的binaryDir
属性可以很好地使用colcon,但不允许并行进行多个预设构建。
具有多个并行预设构建的解决方案
这种行为的原因是colcon core的build
谓词将以找到的包的名称(此处为:root_project_name
)为后缀的构建基目录(默认值:build
)传递给此处的colcon cmake扩展。
解决方案是将正确的构建基传递给colcon(即colcon build --build-base ./build/$PRESET/ --cmake-args "--preset $PRESET"
),并将CMakePresets.json
的binaryDir
属性调整为${sourceDir}/build/${presetName}/root_project_name/
。
注意,这也适用于colcon test
,即colcon test --build-base ./build/$PRESET/ --ctest-args "--preset $PRESET"
。