The link-order fix alone does not survive a build image that exports
TBB_INC/TBB_LIB. RcppParallel's configure.R then never reaches the
bundled branch at all: it links the image's TBB, install.libs.R fills
RcppParallel/lib with absolute symlinks into the image's library dir,
and the published binary records NEEDED libtbb.so.12 (libtbb.so.2 for
the classic Intel TBB on el8/el9), so it cannot dyn.load on a consumer
machine without that exact library. build-env-images dropped those
variables, but its images are rebuilt only by cron or a manual run, and
R reads ~/.Renviron after the process environment, so nothing on the
pipeline side can override them in the meantime.
Patch the package to ignore an ambient TBB_ROOT/TBB_LIB/TBB_INC instead
of relying on the image being clean, in all four places that read them:
configure.R (branch selection), install.libs.R (which R CMD INSTALL runs
outside the src/Makevars rule that passes the configured values), and
R/tbb.R at run time -- .onLoad() would otherwise dyn.load a second,
unrelated TBB next to the bundled one, which segfaults R on load, and
RcppParallelLibs()/CxxFlags() would hand the system TBB to dependents
such as rstan. BINCRAFT_ALLOW_SYSTEM_TBB=TRUE restores the upstream
behaviour. Keep the link-order hunk: the bundled branch passes its build
dir as '-Wl,-L', which gcc still places after its own search dirs.
Verified on the current (pre-fix) build-env images, which still export
TBB_INC/TBB_LIB -- ubuntu jammy, redhat 9 and alpine 3.24: NEEDED
libtbb.so, rpath $ORIGIN/../lib, real libtbb.so.2 in RcppParallel/lib,
and the package loads with every system libtbb moved away. Without the
patch on jammy the same build yields NEEDED libtbb.so.12 and fails to
load; with the configure-only patch it builds the bundled TBB but
segfaults on the post-install load test.