From 98b61ace4bbe1d3d36e0f8e6800c00729c7a56e6 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 21 Apr 2025 19:42:58 +0800 Subject: [PATCH] cmake: Fix b2 build with postfixed compiler versions Previously, the build process used `bootstrap.sh` to build the b2 tool, which automatically selected the compiler based on the specified toolset. This failed when the compiler executable had a version postfix (e.g., /usr/bin/clang++-19) without a symlink at the expected name, producing errors like: ``` A C++11 capable compiler is required for building the B2 engine. Toolset 'clang' does not appear to support C++11. > clang++ -x c++ -std=c++11 -pthread check_clib.cpp check_cxx11.cpp ./tools/build/src/engine/build.sh: 120: clang++: not found > clang++ -x c++ -std=c++11 check_clib.cpp check_cxx11.cpp ./tools/build/src/engine/build.sh: 120: clang++: not found ** Note, the C++11 capable compiler is _only_ required for building the B2 ** engine. The B2 build system allows for using any C++ level and any other ** supported language and resource in your projects. You can specify the toolset as the argument, i.e.: ./build.sh [options] gcc ``` The issue occurred because `bootstrap.sh` hardcodes the compiler name based on the toolset (e.g., `clang++` for Clang) without supporting postfixed versions. This commit replaces the `bootstrap.sh` approach with an explicit build command using Boost's `build.sh` script. We now: 1. Directly specify the full compiler path from CMake variables 2. Manually configure the build with `--cxx=...` and `--toolset=...` 3. Avoid reliance on symlinks or `bootstrap.sh`'s internal detection This ensures the B2 engine is always built with the user-specified compiler, even when installed with version postfixes. Signed-off-by: Kefu Chai --- cmake/modules/BuildBoost.cmake | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cmake/modules/BuildBoost.cmake b/cmake/modules/BuildBoost.cmake index b9c4a7ba8ba..a662591fbf9 100644 --- a/cmake/modules/BuildBoost.cmake +++ b/cmake/modules/BuildBoost.cmake @@ -93,13 +93,15 @@ function(do_build_boost root_dir version) message(SEND_ERROR "unknown compiler: ${CMAKE_CXX_COMPILER_ID}") endif() - # build b2 and prepare the project-config.jam for boost + # prepare the project-config.jam for boost + set(bjam /b2) set(configure_command ./bootstrap.sh --prefix= --with-libraries=${boost_with_libs} - --with-toolset=${toolset}) + --with-toolset=${toolset} + --with-bjam=${bjam}) - set(b2 ./b2) + set(b2 ${bjam}) if(BOOST_J) message(STATUS "BUILDING Boost Libraries at j ${BOOST_J}") list(APPEND b2 -j${BOOST_J}) @@ -183,6 +185,13 @@ function(do_build_boost root_dir version) BUILD_BYPRODUCTS ${Boost_LIBRARIES} INSTALL_COMMAND ${install_command} PREFIX "${root_dir}") + ExternalProject_Add_Step(Boost build-bjam + COMMAND ./tools/build/src/engine/build.sh --cxx=${CMAKE_CXX_COMPILER} ${toolset} + COMMAND ${CMAKE_COMMAND} -E copy ./tools/build/src/engine/b2 ${bjam} + DEPENDEES download + DEPENDERS configure + COMMENT "Building B2 engine.." + WORKING_DIRECTORY ) endfunction() set(Boost_context_DEPENDENCIES thread chrono system date_time) -- 2.39.5