Boost logo

Boost Users :

From: Nicholas Williams (nicholas_at_[hidden])
Date: 2025-01-16 14:31:26


Background: My organization uses Boost internally for one of its software
products, which is itself a C++ library. Users of our library also often
use Boost. As such, we must compile our Boost in a different namespace so
that the Boost symbols loaded when our library loads do not interfere with
whatever different-version Boost symbols our users might load.
Historically, another member of the team has been responsible for building
new versions of Boost, but now it's me. I am doing this the same way our
code/documentation has previously done it, but it is no longer working, and
the errors I'm receiving are not familiar to the team member who was
previously responsible for this. The last time we built a new Boost version
was 1.80.0. I am now doing it with 1.87.0.

The example: Further below, I include a lot of information and build
commands, but that might not be useful to you. To help, I have created a
minimal reproduction program for reproducing the error. You can clone and
use it here: https://github.com/beamerblvd/unable-find-target-with-boost-bcp

The good: With minimal effort and using our existing tools and
configurations, I was easily able to bootstrap `b2` and then run `b2` to
build stock Boost with the normal `boost` namespace. All of that worked
perfectly and without error.

The bad: When I went to do the same thing but with our custom namespace
(via bcp), things fell apart. Our existing tooling copies the untouched
1.87.0 source tree into {dir}/_src. {dir}/user-config.jam is configured as
follows:

```
constant BOOST_VERSION : mybranchname-1.87.0.a ;
constant MY_PLATFORM : macos15-clang16-arm-d ;
constant MY_LABEL : MYextralLabel ;
constant BOOST_USER_CONFIG : <my_boost/config/user.hpp> ;
using clang : 16 : clang++ : <cxxflags>-fvisibility=hidden
<cxxflags>-fvisibility-inlines-hidden ;
```

Within {dir}/_src, I call `bootstrap.sh` and then build `bcp` with:

bc -sBOOST_ROOT={dir}/_src \
  --boost-build=tools/build/src \
  cxxstd=20 \
  -d \
  2 \
  -j \
  2 \
  -q \
  --prefix={dir}/bcp \
  --build-dir={dir}/bcp \
  --stagedir={dir}/bcp/stage \
  --user-config={dir}/user-config.jam \
  --layout=system \
  toolset=clang-darwin \
  threading=multi \
  link=shared \
  architecture=arm \
  instruction-set=nocona \
  address-model=64 \
  --without-python \
  --disable-icu \
  variant=release
  tools/bcp

That takes a few minutes to complete and does so without error. Once `bcp`
is built, I run it with:

mkdir {dir}/_dst && \
{dir}/bcp/bin/bcp --boost={dir}/_src --namespace=boost_MYextralLabel
--namespace-alias Jamroot boost boost-build.jam boostcpp.jam bootstrap.bat
bootstrap.sh build status tools [insert_name_of_every_dir_in_libs]
{dir}/_dst

That takes a few minutes to complete and does so without error. The
contents of {dir}/_dst look as I would expect them to look, with diffs
against {dir}/_src reflecting the change in namespace. Once complete, I cd
into {dir}/_dst, re-bootstrap, and run `b2` to compile the modified Boost:

b2 -sBOOST_ROOT={dir}/_dst \
  --boost-build=tools/build/src \
  cxxstd=20 \
  -d \
  2 \
  -j \
  2 \
  -q \
  --prefix={dir} \
  --build-dir={dir}/shobj \
  --stagedir={dir}/stage \
  --user-config={dir}/user-config.jam \
  --layout=system \
  toolset=clang-darwin \
  threading=multi \
  link=shared \
  architecture=arm \
  instruction-set=nocona \
  address-model=64 \
  --without-python \
  --disable-icu \
  variant=debug

This fails quickly, here:

...
    - native syslog supported : yes [2]
    - pthread supports robust mutexes : no [2]
    - Boost.Regex is header-only : yes [2]
error: Unable to find file or target named
error: '/boost/align//boost_align'
error: referred to from project at
error: '{dir}/_dst/libs/atomic/build'
make: *** [build] Error 1

I have tried dozens of different things over the past two days and can't
remember most of them, but they didn't change the outcome, so I don't
supposed they're relevant. The one thing that *did* change the outcome is
that, after running `bcp` and before re-bootstrapping in {dir}/_dst, I
tried deleting the {dir}/_dst/boost directory. This still failed, but it
got slightly further and failed with a different (albeit extremely similar)
error:

...
    - std_wstreambuf : no [2]
    - std_wstreambuf : no [3]
    - BOOST_COMP_GNUC >= 4.3.0 : no [2]
    - BOOST_COMP_GNUC >= 4.3.0 : no [4]
error: Unable to find file or target named
error: 'libs/thread/build//boost_MYextralLabel_thread'
error: referred to from project at
error: '.'
make: *** [build] Error 1

I feel like I've exhausted my ability to discern what the problem is. Other
than updating a handful of compiler flags (like changing cxxstd=17 to
cxxstd=20), I'm doing this the same way we have (allegedly) always done it,
but it's not working anymore and I don't know why.

I would appreciate any guidance you can offer.

Thank you,

Nick



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net