Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
e29c540ed3 |
4 changed files with 381 additions and 40 deletions
152
local/patches/RcppParallel/force-bundled-tbb-6.0.0.patch
Normal file
152
local/patches/RcppParallel/force-bundled-tbb-6.0.0.patch
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
diff --git a/R/aaa.R b/R/aaa.R
|
||||||
|
index 568a2aa..2744059 100644
|
||||||
|
--- a/R/aaa.R
|
||||||
|
+++ b/R/aaa.R
|
||||||
|
@@ -5,4 +5,21 @@ TBB_LIB <- ""
|
||||||
|
TBB_INC <- ""
|
||||||
|
|
||||||
|
TBB_NAME <- "tbb"
|
||||||
|
-TBB_MALLOC_NAME <- "tbbmalloc"
|
||||||
|
\ No newline at end of file
|
||||||
|
+TBB_MALLOC_NAME <- "tbbmalloc"
|
||||||
|
+
|
||||||
|
+# bincraft patch: build images (ours did until build-env-images c51ed09) and
|
||||||
|
+# plenty of user environments export TBB_ROOT / TBB_LIB / TBB_INC. A binary we
|
||||||
|
+# publish always carries its own oneTBB in RcppParallel/lib -- see the
|
||||||
|
+# companion changes in tools/config/configure.R and src/install.libs.R -- so
|
||||||
|
+# honouring those variables at run time is actively harmful: .onLoad() would
|
||||||
|
+# dyn.load() a second, unrelated TBB into the process next to the bundled one
|
||||||
|
+# (two copies of the same symbols in the global scope, which segfaults R on
|
||||||
|
+# load), and RcppParallelLibs() / CxxFlags() would hand that system TBB to
|
||||||
|
+# dependents such as rstan, putting NEEDED libtbb.so.12 back into their
|
||||||
|
+# binaries. Read the variables only when explicitly opted back in.
|
||||||
|
+bincraftGetenv <- function(name, unset = "") {
|
||||||
|
+ if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") == "TRUE")
|
||||||
|
+ Sys.getenv(name, unset = unset)
|
||||||
|
+ else
|
||||||
|
+ unset
|
||||||
|
+}
|
||||||
|
\ No newline at end of file
|
||||||
|
diff --git a/R/tbb.R b/R/tbb.R
|
||||||
|
index 3d8fbb3..9560165 100644
|
||||||
|
--- a/R/tbb.R
|
||||||
|
+++ b/R/tbb.R
|
||||||
|
@@ -17,7 +17,7 @@ tbbLibraryPath <- function(name = NULL) {
|
||||||
|
sysname <- Sys.info()[["sysname"]]
|
||||||
|
|
||||||
|
# find root for TBB install
|
||||||
|
- tbbRoot <- Sys.getenv("TBB_LIB", unset = tbbRoot())
|
||||||
|
+ tbbRoot <- bincraftGetenv("TBB_LIB", unset = tbbRoot())
|
||||||
|
if (is.null(name))
|
||||||
|
return(tbbRoot)
|
||||||
|
|
||||||
|
@@ -60,7 +60,7 @@ tbbCxxFlags <- function() {
|
||||||
|
flags <- c("-DRCPP_PARALLEL_USE_TBB=1")
|
||||||
|
|
||||||
|
# if TBB_INC is set, apply those library paths
|
||||||
|
- tbbInc <- Sys.getenv("TBB_INC", unset = TBB_INC)
|
||||||
|
+ tbbInc <- bincraftGetenv("TBB_INC", unset = TBB_INC)
|
||||||
|
if (!file.exists(tbbInc)) {
|
||||||
|
tbbInc <- system.file("include", package = "RcppParallel")
|
||||||
|
}
|
||||||
|
@@ -100,7 +100,7 @@ tbbLdFlags <- function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
# shortcut if TBB_LIB defined
|
||||||
|
- tbbLib <- Sys.getenv("TBB_LINK_LIB", Sys.getenv("TBB_LIB", unset = TBB_LIB))
|
||||||
|
+ tbbLib <- bincraftGetenv("TBB_LINK_LIB", bincraftGetenv("TBB_LIB", unset = TBB_LIB))
|
||||||
|
if (nzchar(tbbLib)) {
|
||||||
|
if (R.version$os == "emscripten") {
|
||||||
|
fmt <- "-L%1$s -l%2$s"
|
||||||
|
diff --git a/src/install.libs.R b/src/install.libs.R
|
||||||
|
index 4dcbac2..57dbc74 100644
|
||||||
|
--- a/src/install.libs.R
|
||||||
|
+++ b/src/install.libs.R
|
||||||
|
@@ -258,6 +258,18 @@ prependFlags <- function(prependFlags, toFlags) {
|
||||||
|
tbbLib <- Sys.getenv("TBB_LIB")
|
||||||
|
tbbInc <- Sys.getenv("TBB_INC")
|
||||||
|
|
||||||
|
+# bincraft patch: the companion change in tools/config/configure.R stops an
|
||||||
|
+# ambient TBB_LIB / TBB_INC from selecting a system TBB, but this script is
|
||||||
|
+# also run directly by `R CMD INSTALL` (not only through the `tbb` rule in
|
||||||
|
+# src/Makevars, which passes the configured values), so at install time it
|
||||||
|
+# still sees the image's environment and would symlink the system libraries
|
||||||
|
+# into RcppParallel/lib. Drop them here for the same reason, under the same
|
||||||
|
+# opt-out.
|
||||||
|
+if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") != "TRUE") {
|
||||||
|
+ tbbLib <- ""
|
||||||
|
+ tbbInc <- ""
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
args <- commandArgs(trailingOnly = TRUE)
|
||||||
|
if (identical(args, "build")) {
|
||||||
|
if (nzchar(tbbLib) && nzchar(tbbInc)) {
|
||||||
|
diff --git a/tools/config/configure.R b/tools/config/configure.R
|
||||||
|
index a001e63..bfe8c8e 100644
|
||||||
|
--- a/tools/config/configure.R
|
||||||
|
+++ b/tools/config/configure.R
|
||||||
|
@@ -144,6 +144,24 @@ tbbRoot <- Sys.getenv("TBB_ROOT", unset = NA)
|
||||||
|
tbbLib <- Sys.getenv("TBB_LIB", unset = NA)
|
||||||
|
tbbInc <- Sys.getenv("TBB_INC", unset = NA)
|
||||||
|
|
||||||
|
+# bincraft patch: ignore an ambient TBB_ROOT / TBB_LIB / TBB_INC. Our build
|
||||||
|
+# images exported these until build-env-images c51ed09 (a leftover from
|
||||||
|
+# RcppParallel 5.x, whose bundled Intel TBB would not build on musl or with
|
||||||
|
+# modern g++), and any of them switches the branches below to a system TBB.
|
||||||
|
+# The published binary then records NEEDED libtbb.so.12 (or libtbb.so.2 for
|
||||||
|
+# the classic Intel TBB) and gets a RcppParallel/lib full of absolute symlinks
|
||||||
|
+# into the image's library dir, so it cannot dyn.load on a consumer machine
|
||||||
|
+# without that exact TBB. 6.x bundles oneTBB 2022 and builds it with cmake on
|
||||||
|
+# every platform we ship, so the bundled copy is always the right choice here;
|
||||||
|
+# forcing it in the package rather than relying on the image environment keeps
|
||||||
|
+# the binary correct whichever image version CI happens to pull. Set
|
||||||
|
+# BINCRAFT_ALLOW_SYSTEM_TBB=TRUE to restore the upstream behaviour.
|
||||||
|
+if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") != "TRUE") {
|
||||||
|
+ tbbRoot <- NA
|
||||||
|
+ tbbLib <- NA
|
||||||
|
+ tbbInc <- NA
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
tbbName <- Sys.getenv("TBB_NAME", unset = "tbb")
|
||||||
|
tbbMallocName <- Sys.getenv("TBB_MALLOC_NAME", unset = "tbbmalloc")
|
||||||
|
|
||||||
|
@@ -224,10 +242,21 @@ define(
|
||||||
|
)
|
||||||
|
|
||||||
|
# set PKG_LIBS
|
||||||
|
+#
|
||||||
|
+# bincraft patch: the library directories below are passed as plain '-L', not
|
||||||
|
+# '-Wl,-L'. gcc expands its own search dirs (/usr/lib64, /usr/lib/<triplet>)
|
||||||
|
+# into explicit '-L' options ahead of anything forwarded verbatim with '-Wl,',
|
||||||
|
+# so with '-Wl,-L' a system libtbb.so wins over the one named here: on a build
|
||||||
|
+# host with a distro TBB installed, '-ltbb' resolves to that library and
|
||||||
|
+# RcppParallel.so records its SONAME (libtbb.so.12, or libtbb.so.2 for the
|
||||||
|
+# classic Intel TBB) instead of the bundled 'libtbb.so'. The binary then loads
|
||||||
|
+# the system TBB rather than the copy shipped in RcppParallel/lib, and fails
|
||||||
|
+# outright on a machine that has no system TBB. gcc places a plain '-L' before
|
||||||
|
+# its built-in dirs, so the intended library is found first.
|
||||||
|
pkgLibs <- if (!is.na(tbbLib)) {
|
||||||
|
|
||||||
|
c(
|
||||||
|
- "-Wl,-L\"$(TBB_LIB)\"",
|
||||||
|
+ "-L\"$(TBB_LIB)\"",
|
||||||
|
sprintf("-Wl,-rpath,%s", shQuote(tbbLib)),
|
||||||
|
"-l$(TBB_NAME)",
|
||||||
|
"-l$(TBB_MALLOC_NAME)"
|
||||||
|
@@ -240,14 +269,14 @@ pkgLibs <- if (!is.na(tbbLib)) {
|
||||||
|
} else if (R.version$os == "emscripten") {
|
||||||
|
|
||||||
|
c(
|
||||||
|
- "-Wl,-Ltbb/build/lib_release",
|
||||||
|
+ "-Ltbb/build/lib_release",
|
||||||
|
"-l$(TBB_NAME)"
|
||||||
|
)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
c(
|
||||||
|
- "-Wl,-Ltbb/build/lib_release",
|
||||||
|
+ "-Ltbb/build/lib_release",
|
||||||
|
"-l$(TBB_NAME)",
|
||||||
|
"-l$(TBB_MALLOC_NAME)"
|
||||||
|
)
|
||||||
157
local/patches/RcppParallel/force-bundled-tbb-6.1.x.patch
Normal file
157
local/patches/RcppParallel/force-bundled-tbb-6.1.x.patch
Normal file
|
|
@ -0,0 +1,157 @@
|
||||||
|
diff --git a/R/aaa.R b/R/aaa.R
|
||||||
|
index 568a2aa..2744059 100644
|
||||||
|
--- a/R/aaa.R
|
||||||
|
+++ b/R/aaa.R
|
||||||
|
@@ -5,4 +5,21 @@ TBB_LIB <- ""
|
||||||
|
TBB_INC <- ""
|
||||||
|
|
||||||
|
TBB_NAME <- "tbb"
|
||||||
|
-TBB_MALLOC_NAME <- "tbbmalloc"
|
||||||
|
\ No newline at end of file
|
||||||
|
+TBB_MALLOC_NAME <- "tbbmalloc"
|
||||||
|
+
|
||||||
|
+# bincraft patch: build images (ours did until build-env-images c51ed09) and
|
||||||
|
+# plenty of user environments export TBB_ROOT / TBB_LIB / TBB_INC. A binary we
|
||||||
|
+# publish always carries its own oneTBB in RcppParallel/lib -- see the
|
||||||
|
+# companion changes in tools/config/configure.R and src/install.libs.R -- so
|
||||||
|
+# honouring those variables at run time is actively harmful: .onLoad() would
|
||||||
|
+# dyn.load() a second, unrelated TBB into the process next to the bundled one
|
||||||
|
+# (two copies of the same symbols in the global scope, which segfaults R on
|
||||||
|
+# load), and RcppParallelLibs() / CxxFlags() would hand that system TBB to
|
||||||
|
+# dependents such as rstan, putting NEEDED libtbb.so.12 back into their
|
||||||
|
+# binaries. Read the variables only when explicitly opted back in.
|
||||||
|
+bincraftGetenv <- function(name, unset = "") {
|
||||||
|
+ if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") == "TRUE")
|
||||||
|
+ Sys.getenv(name, unset = unset)
|
||||||
|
+ else
|
||||||
|
+ unset
|
||||||
|
+}
|
||||||
|
\ No newline at end of file
|
||||||
|
diff --git a/R/tbb.R b/R/tbb.R
|
||||||
|
index 152fd16..4b06aa5 100644
|
||||||
|
--- a/R/tbb.R
|
||||||
|
+++ b/R/tbb.R
|
||||||
|
@@ -17,7 +17,7 @@ tbbLibraryPath <- function(name = NULL) {
|
||||||
|
sysname <- Sys.info()[["sysname"]]
|
||||||
|
|
||||||
|
# find root for TBB install
|
||||||
|
- tbbRoot <- Sys.getenv("TBB_LIB", unset = tbbRoot())
|
||||||
|
+ tbbRoot <- bincraftGetenv("TBB_LIB", unset = tbbRoot())
|
||||||
|
if (is.null(name))
|
||||||
|
return(tbbRoot)
|
||||||
|
|
||||||
|
@@ -58,7 +58,7 @@ tbbCxxFlags <- function() {
|
||||||
|
flags <- c("-DRCPP_PARALLEL_USE_TBB=1")
|
||||||
|
|
||||||
|
# if TBB_INC is set, apply those library paths
|
||||||
|
- tbbInc <- Sys.getenv("TBB_INC", unset = TBB_INC)
|
||||||
|
+ tbbInc <- bincraftGetenv("TBB_INC", unset = TBB_INC)
|
||||||
|
if (!file.exists(tbbInc)) {
|
||||||
|
tbbInc <- system.file("include", package = "RcppParallel")
|
||||||
|
}
|
||||||
|
@@ -96,7 +96,7 @@ tbbLdFlags <- function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
# shortcut if TBB_LIB defined
|
||||||
|
- tbbLib <- Sys.getenv("TBB_LINK_LIB", Sys.getenv("TBB_LIB", unset = TBB_LIB))
|
||||||
|
+ tbbLib <- bincraftGetenv("TBB_LINK_LIB", bincraftGetenv("TBB_LIB", unset = TBB_LIB))
|
||||||
|
if (nzchar(tbbLib)) {
|
||||||
|
if (R.version$os == "emscripten") {
|
||||||
|
fmt <- "-L%1$s -l%2$s"
|
||||||
|
diff --git a/src/install.libs.R b/src/install.libs.R
|
||||||
|
index e770838..1dd2fc7 100644
|
||||||
|
--- a/src/install.libs.R
|
||||||
|
+++ b/src/install.libs.R
|
||||||
|
@@ -492,6 +492,18 @@ prependFlags <- function(prependFlags, toFlags) {
|
||||||
|
tbbLib <- Sys.getenv("TBB_LIB")
|
||||||
|
tbbInc <- Sys.getenv("TBB_INC")
|
||||||
|
|
||||||
|
+# bincraft patch: the companion change in tools/config/configure.R stops an
|
||||||
|
+# ambient TBB_LIB / TBB_INC from selecting a system TBB, but this script is
|
||||||
|
+# also run directly by `R CMD INSTALL` (not only through the `tbb` rule in
|
||||||
|
+# src/Makevars, which passes the configured values), so at install time it
|
||||||
|
+# still sees the image's environment and would symlink the system libraries
|
||||||
|
+# into RcppParallel/lib. Drop them here for the same reason, under the same
|
||||||
|
+# opt-out.
|
||||||
|
+if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") != "TRUE") {
|
||||||
|
+ tbbLib <- ""
|
||||||
|
+ tbbInc <- ""
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
args <- commandArgs(trailingOnly = TRUE)
|
||||||
|
if (identical(args, "build")) {
|
||||||
|
if (nzchar(tbbLib) && nzchar(tbbInc)) {
|
||||||
|
diff --git a/tools/config/configure.R b/tools/config/configure.R
|
||||||
|
index c3842f9..adf7876 100644
|
||||||
|
--- a/tools/config/configure.R
|
||||||
|
+++ b/tools/config/configure.R
|
||||||
|
@@ -66,6 +66,24 @@ tbbRoot <- Sys.getenv("TBB_ROOT", unset = NA)
|
||||||
|
tbbLib <- Sys.getenv("TBB_LIB", unset = NA)
|
||||||
|
tbbInc <- Sys.getenv("TBB_INC", unset = NA)
|
||||||
|
|
||||||
|
+# bincraft patch: ignore an ambient TBB_ROOT / TBB_LIB / TBB_INC. Our build
|
||||||
|
+# images exported these until build-env-images c51ed09 (a leftover from
|
||||||
|
+# RcppParallel 5.x, whose bundled Intel TBB would not build on musl or with
|
||||||
|
+# modern g++), and any of them switches the branches below to a system TBB.
|
||||||
|
+# The published binary then records NEEDED libtbb.so.12 (or libtbb.so.2 for
|
||||||
|
+# the classic Intel TBB) and gets a RcppParallel/lib full of absolute symlinks
|
||||||
|
+# into the image's library dir, so it cannot dyn.load on a consumer machine
|
||||||
|
+# without that exact TBB. 6.x bundles oneTBB 2022 and builds it with cmake on
|
||||||
|
+# every platform we ship, so the bundled copy is always the right choice here;
|
||||||
|
+# forcing it in the package rather than relying on the image environment keeps
|
||||||
|
+# the binary correct whichever image version CI happens to pull. Set
|
||||||
|
+# BINCRAFT_ALLOW_SYSTEM_TBB=TRUE to restore the upstream behaviour.
|
||||||
|
+if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") != "TRUE") {
|
||||||
|
+ tbbRoot <- NA
|
||||||
|
+ tbbLib <- NA
|
||||||
|
+ tbbInc <- NA
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
tbbName <- Sys.getenv("TBB_NAME", unset = "tbb")
|
||||||
|
tbbMallocName <- Sys.getenv("TBB_MALLOC_NAME", unset = "tbbmalloc")
|
||||||
|
|
||||||
|
@@ -146,6 +164,18 @@ define(
|
||||||
|
)
|
||||||
|
|
||||||
|
# set PKG_LIBS
|
||||||
|
+#
|
||||||
|
+# bincraft patch: the non-Windows library directories below are passed as
|
||||||
|
+# plain '-L', not '-Wl,-L'. gcc expands its own search dirs (/usr/lib64,
|
||||||
|
+# /usr/lib/<triplet>) into explicit '-L' options ahead of anything forwarded
|
||||||
|
+# verbatim with '-Wl,', so with '-Wl,-L' a system libtbb.so wins over the one
|
||||||
|
+# named here: on a build host with a distro TBB installed, '-ltbb' resolves to
|
||||||
|
+# that library and RcppParallel.so records its SONAME (libtbb.so.12, or
|
||||||
|
+# libtbb.so.2 for the classic Intel TBB) instead of the bundled 'libtbb.so'.
|
||||||
|
+# The binary then loads the system TBB rather than the copy shipped in
|
||||||
|
+# RcppParallel/lib, and fails outright on a machine that has no system TBB.
|
||||||
|
+# gcc places a plain '-L' before its built-in dirs, so the intended library is
|
||||||
|
+# found first.
|
||||||
|
pkgLibs <- if (.Platform$OS.type == "windows") {
|
||||||
|
|
||||||
|
if (!is.na(tbbLib) && file.exists(file.path(tbbInc, "oneapi"))) {
|
||||||
|
@@ -183,7 +213,7 @@ pkgLibs <- if (.Platform$OS.type == "windows") {
|
||||||
|
} else if (!is.na(tbbLib)) {
|
||||||
|
|
||||||
|
c(
|
||||||
|
- "-Wl,-L\"$(TBB_LIB)\"",
|
||||||
|
+ "-L\"$(TBB_LIB)\"",
|
||||||
|
sprintf("-Wl,-rpath,%s", shQuote(tbbLib)),
|
||||||
|
"-l$(TBB_NAME)",
|
||||||
|
"-l$(TBB_MALLOC_NAME)"
|
||||||
|
@@ -192,14 +222,14 @@ pkgLibs <- if (.Platform$OS.type == "windows") {
|
||||||
|
} else if (R.version$os == "emscripten") {
|
||||||
|
|
||||||
|
c(
|
||||||
|
- "-Wl,-Ltbb/build/lib_release",
|
||||||
|
+ "-Ltbb/build/lib_release",
|
||||||
|
"-l$(TBB_NAME)"
|
||||||
|
)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
c(
|
||||||
|
- "-Wl,-Ltbb/build/lib_release",
|
||||||
|
+ "-Ltbb/build/lib_release",
|
||||||
|
"-l$(TBB_NAME)",
|
||||||
|
"-l$(TBB_MALLOC_NAME)"
|
||||||
|
)
|
||||||
142
local/patches/RcppParallel/force-bundled-tbb-6.2.x.patch
Normal file
142
local/patches/RcppParallel/force-bundled-tbb-6.2.x.patch
Normal file
|
|
@ -0,0 +1,142 @@
|
||||||
|
diff --git a/R/aaa.R b/R/aaa.R
|
||||||
|
index 568a2aa..2744059 100644
|
||||||
|
--- a/R/aaa.R
|
||||||
|
+++ b/R/aaa.R
|
||||||
|
@@ -5,4 +5,21 @@ TBB_LIB <- ""
|
||||||
|
TBB_INC <- ""
|
||||||
|
|
||||||
|
TBB_NAME <- "tbb"
|
||||||
|
-TBB_MALLOC_NAME <- "tbbmalloc"
|
||||||
|
\ No newline at end of file
|
||||||
|
+TBB_MALLOC_NAME <- "tbbmalloc"
|
||||||
|
+
|
||||||
|
+# bincraft patch: build images (ours did until build-env-images c51ed09) and
|
||||||
|
+# plenty of user environments export TBB_ROOT / TBB_LIB / TBB_INC. A binary we
|
||||||
|
+# publish always carries its own oneTBB in RcppParallel/lib -- see the
|
||||||
|
+# companion changes in tools/config/configure.R and src/install.libs.R -- so
|
||||||
|
+# honouring those variables at run time is actively harmful: .onLoad() would
|
||||||
|
+# dyn.load() a second, unrelated TBB into the process next to the bundled one
|
||||||
|
+# (two copies of the same symbols in the global scope, which segfaults R on
|
||||||
|
+# load), and RcppParallelLibs() / CxxFlags() would hand that system TBB to
|
||||||
|
+# dependents such as rstan, putting NEEDED libtbb.so.12 back into their
|
||||||
|
+# binaries. Read the variables only when explicitly opted back in.
|
||||||
|
+bincraftGetenv <- function(name, unset = "") {
|
||||||
|
+ if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") == "TRUE")
|
||||||
|
+ Sys.getenv(name, unset = unset)
|
||||||
|
+ else
|
||||||
|
+ unset
|
||||||
|
+}
|
||||||
|
\ No newline at end of file
|
||||||
|
diff --git a/R/tbb.R b/R/tbb.R
|
||||||
|
index b071833..e3bf7a5 100644
|
||||||
|
--- a/R/tbb.R
|
||||||
|
+++ b/R/tbb.R
|
||||||
|
@@ -19,3 +19,3 @@ tbbLibraryPath <- function(name = NULL) {
|
||||||
|
# find root for TBB install
|
||||||
|
- tbbRoot <- Sys.getenv("TBB_LIB", unset = tbbRoot())
|
||||||
|
+ tbbRoot <- bincraftGetenv("TBB_LIB", unset = tbbRoot())
|
||||||
|
if (is.null(name))
|
||||||
|
@@ -63,3 +63,3 @@ tbbCxxFlags <- function() {
|
||||||
|
# if TBB_INC is set, apply those library paths
|
||||||
|
- tbbInc <- Sys.getenv("TBB_INC", unset = TBB_INC)
|
||||||
|
+ tbbInc <- bincraftGetenv("TBB_INC", unset = TBB_INC)
|
||||||
|
if (!file.exists(tbbInc)) {
|
||||||
|
@@ -122,3 +122,3 @@ tbbLdFlags <- function() {
|
||||||
|
# shortcut if TBB_LIB defined
|
||||||
|
- tbbLib <- Sys.getenv("TBB_LINK_LIB", Sys.getenv("TBB_LIB", unset = TBB_LIB))
|
||||||
|
+ tbbLib <- bincraftGetenv("TBB_LINK_LIB", bincraftGetenv("TBB_LIB", unset = TBB_LIB))
|
||||||
|
if (nzchar(tbbLib)) {
|
||||||
|
diff --git a/src/install.libs.R b/src/install.libs.R
|
||||||
|
index 3b3cfda..c0e6f3e 100644
|
||||||
|
--- a/src/install.libs.R
|
||||||
|
+++ b/src/install.libs.R
|
||||||
|
@@ -477,6 +477,18 @@ prependFlags <- function(prependFlags, toFlags) {
|
||||||
|
tbbLib <- Sys.getenv("TBB_LIB")
|
||||||
|
tbbInc <- Sys.getenv("TBB_INC")
|
||||||
|
|
||||||
|
+# bincraft patch: the companion change in tools/config/configure.R stops an
|
||||||
|
+# ambient TBB_LIB / TBB_INC from selecting a system TBB, but this script is
|
||||||
|
+# also run directly by `R CMD INSTALL` (not only through the `tbb` rule in
|
||||||
|
+# src/Makevars, which passes the configured values), so at install time it
|
||||||
|
+# still sees the image's environment and would symlink the system libraries
|
||||||
|
+# into RcppParallel/lib. Drop them here for the same reason, under the same
|
||||||
|
+# opt-out.
|
||||||
|
+if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") != "TRUE") {
|
||||||
|
+ tbbLib <- ""
|
||||||
|
+ tbbInc <- ""
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
args <- commandArgs(trailingOnly = TRUE)
|
||||||
|
if (identical(args, "build")) {
|
||||||
|
if (nzchar(tbbLib) && nzchar(tbbInc)) {
|
||||||
|
diff --git a/tools/config/configure.R b/tools/config/configure.R
|
||||||
|
index c203a1f..0050b5c 100644
|
||||||
|
--- a/tools/config/configure.R
|
||||||
|
+++ b/tools/config/configure.R
|
||||||
|
@@ -79,6 +79,24 @@ tbbRoot <- Sys.getenv("TBB_ROOT", unset = NA)
|
||||||
|
tbbLib <- Sys.getenv("TBB_LIB", unset = NA)
|
||||||
|
tbbInc <- Sys.getenv("TBB_INC", unset = NA)
|
||||||
|
|
||||||
|
+# bincraft patch: ignore an ambient TBB_ROOT / TBB_LIB / TBB_INC. Our build
|
||||||
|
+# images exported these until build-env-images c51ed09 (a leftover from
|
||||||
|
+# RcppParallel 5.x, whose bundled Intel TBB would not build on musl or with
|
||||||
|
+# modern g++), and any of them switches the branches below to a system TBB.
|
||||||
|
+# The published binary then records NEEDED libtbb.so.12 (or libtbb.so.2 for
|
||||||
|
+# the classic Intel TBB) and gets a RcppParallel/lib full of absolute symlinks
|
||||||
|
+# into the image's library dir, so it cannot dyn.load on a consumer machine
|
||||||
|
+# without that exact TBB. 6.x bundles oneTBB 2022 and builds it with cmake on
|
||||||
|
+# every platform we ship, so the bundled copy is always the right choice here;
|
||||||
|
+# forcing it in the package rather than relying on the image environment keeps
|
||||||
|
+# the binary correct whichever image version CI happens to pull. Set
|
||||||
|
+# BINCRAFT_ALLOW_SYSTEM_TBB=TRUE to restore the upstream behaviour.
|
||||||
|
+if (Sys.getenv("BINCRAFT_ALLOW_SYSTEM_TBB", unset = "FALSE") != "TRUE") {
|
||||||
|
+ tbbRoot <- NA
|
||||||
|
+ tbbLib <- NA
|
||||||
|
+ tbbInc <- NA
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
tbbName <- Sys.getenv("TBB_NAME", unset = "tbb")
|
||||||
|
tbbMallocName <- Sys.getenv("TBB_MALLOC_NAME", unset = "tbbmalloc")
|
||||||
|
|
||||||
|
@@ -225,12 +243,23 @@ define(
|
||||||
|
)
|
||||||
|
|
||||||
|
# set PKG_LIBS
|
||||||
|
+#
|
||||||
|
+# bincraft patch: the library directories below are passed as plain '-L', not
|
||||||
|
+# '-Wl,-L'. gcc expands its own search dirs (/usr/lib64, /usr/lib/<triplet>)
|
||||||
|
+# into explicit '-L' options ahead of anything forwarded verbatim with '-Wl,',
|
||||||
|
+# so with '-Wl,-L' a system libtbb.so wins over the one named here: on a build
|
||||||
|
+# host with a distro TBB installed, '-ltbb' resolves to that library and
|
||||||
|
+# RcppParallel.so records its SONAME (libtbb.so.12, or libtbb.so.2 for the
|
||||||
|
+# classic Intel TBB) instead of the bundled 'libtbb.so'. The binary then loads
|
||||||
|
+# the system TBB rather than the copy shipped in RcppParallel/lib, and fails
|
||||||
|
+# outright on a machine that has no system TBB. gcc places a plain '-L' before
|
||||||
|
+# its built-in dirs, so the intended library is found first.
|
||||||
|
pkgLibs <- if (!is.na(tbbLib)) {
|
||||||
|
|
||||||
|
# a TBB supplied via TBB_LIB / TBB_ROOT. an rpath is meaningless on Windows,
|
||||||
|
# where the loader has no equivalent -- see R/zzz.R for how we resolve there
|
||||||
|
c(
|
||||||
|
- "-Wl,-L\"$(TBB_LIB)\"",
|
||||||
|
+ "-L\"$(TBB_LIB)\"",
|
||||||
|
if (.Platform$OS.type != "windows")
|
||||||
|
sprintf("-Wl,-rpath,%s", shQuote(tbbLib)),
|
||||||
|
"-l$(TBB_NAME)",
|
||||||
|
@@ -240,14 +269,14 @@ pkgLibs <- if (!is.na(tbbLib)) {
|
||||||
|
} else if (R.version$os == "emscripten") {
|
||||||
|
|
||||||
|
c(
|
||||||
|
- "-Wl,-Ltbb/build/lib_release",
|
||||||
|
+ "-Ltbb/build/lib_release",
|
||||||
|
"-l$(TBB_NAME)"
|
||||||
|
)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
c(
|
||||||
|
- "-Wl,-Ltbb/build/lib_release",
|
||||||
|
+ "-Ltbb/build/lib_release",
|
||||||
|
"-l$(TBB_NAME)",
|
||||||
|
"-l$(TBB_MALLOC_NAME)"
|
||||||
|
)
|
||||||
|
|
@ -6,8 +6,48 @@
|
||||||
"env": {},
|
"env": {},
|
||||||
"configure_args": [],
|
"configure_args": [],
|
||||||
"makevars": {},
|
"makevars": {},
|
||||||
"patch": "RcppParallel/force-bundled-tbb.patch",
|
"patch": "RcppParallel/force-bundled-tbb-6.2.x.patch",
|
||||||
"reason": "RcppParallel 6.x bundles oneTBB 2022 and builds it with cmake on every platform we ship, so the system-TBB workaround needed for 5.x is gone, but two things still steer the build back to a system TBB. (1) Ambient TBB_ROOT/TBB_LIB/TBB_INC: several build images still export these (build-env-images dropped them, but the images are rebuilt only by cron/manual runs, so a stale image keeps them), and R reads ~/.Renviron *after* the process environment, so no pipeline-side env override can undo it. configure.R then takes the system-TBB branch, install.libs.R symlinks the image's libraries into RcppParallel/lib as absolute paths, and the binary records NEEDED libtbb.so.12 (libtbb.so.2 for the classic Intel TBB on el8/el9) -- it cannot dyn.load on a consumer machine without that exact TBB. Both files are patched to ignore those variables (opt out with BINCRAFT_ALLOW_SYSTEM_TBB=TRUE); install.libs.R needs it separately because R CMD INSTALL runs it outside the src/Makevars rule that passes the configured values. (2) Link order: the bundled branch passes its build dir as '-Wl,-Ltbb/build/lib_release', and gcc expands its own search dirs (/usr/lib64, /usr/lib/<triplet>) into '-L' options ahead of anything forwarded with '-Wl,', so '-ltbb' would still resolve to a distro TBB when one is installed; a plain '-L' puts the bundled dir first. Verified on the current build-env-ubuntu:jammy image (which still exports TBB_INC/TBB_LIB): NEEDED libtbb.so, RUNPATH $ORIGIN/../lib, real libtbb.so.2 in RcppParallel/lib, and the package loads with every system libtbb moved away."
|
"reason": "RcppParallel 6.x builds its bundled oneTBB 2022 with cmake, but tools/config/configure.R passes the library dir as '-Wl,-L...', and gcc places its own search dirs (/usr/lib64, /usr/lib/<triplet>) ahead of anything forwarded with '-Wl,'. Every build image installs a distro libtbb, so '-ltbb' resolves to it: the binary records NEEDED libtbb.so.12 (libtbb.so.2 on el8/el9) instead of the bundled libtbb.so and cannot load on a machine without that exact system TBB. The patch passes a plain '-L' so the bundled build dir wins. As a safeguard it also makes configure.R, src/install.libs.R and R/tbb.R ignore an ambient TBB_ROOT/TBB_LIB/TBB_INC (opt out with BINCRAFT_ALLOW_SYSTEM_TBB=TRUE): the build images stopped exporting them in build-env-images c51ed09, but a stale image or ~/.Renviron would otherwise switch the build back to the system TBB, and R reads ~/.Renviron after the process environment, so no pipeline env can override it. The read sites move between releases, so each entry pins a patch generated against that version. Upstream still uses '-Wl,-L' in 6.2.1; drop these entries once a release passes a plain '-L'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"package": "RcppParallel",
|
||||||
|
"versions": "6.2.0",
|
||||||
|
"platforms": ["*"],
|
||||||
|
"env": {},
|
||||||
|
"configure_args": [],
|
||||||
|
"makevars": {},
|
||||||
|
"patch": "RcppParallel/force-bundled-tbb-6.2.x.patch",
|
||||||
|
"reason": "RcppParallel 6.x builds its bundled oneTBB 2022 with cmake, but tools/config/configure.R passes the library dir as '-Wl,-L...', and gcc places its own search dirs (/usr/lib64, /usr/lib/<triplet>) ahead of anything forwarded with '-Wl,'. Every build image installs a distro libtbb, so '-ltbb' resolves to it: the binary records NEEDED libtbb.so.12 (libtbb.so.2 on el8/el9) instead of the bundled libtbb.so and cannot load on a machine without that exact system TBB. The patch passes a plain '-L' so the bundled build dir wins. As a safeguard it also makes configure.R, src/install.libs.R and R/tbb.R ignore an ambient TBB_ROOT/TBB_LIB/TBB_INC (opt out with BINCRAFT_ALLOW_SYSTEM_TBB=TRUE): the build images stopped exporting them in build-env-images c51ed09, but a stale image or ~/.Renviron would otherwise switch the build back to the system TBB, and R reads ~/.Renviron after the process environment, so no pipeline env can override it. The read sites move between releases, so each entry pins a patch generated against that version. Upstream still uses '-Wl,-L' in 6.2.1; drop these entries once a release passes a plain '-L'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"package": "RcppParallel",
|
||||||
|
"versions": "6.1.1",
|
||||||
|
"platforms": ["*"],
|
||||||
|
"env": {},
|
||||||
|
"configure_args": [],
|
||||||
|
"makevars": {},
|
||||||
|
"patch": "RcppParallel/force-bundled-tbb-6.1.x.patch",
|
||||||
|
"reason": "RcppParallel 6.x builds its bundled oneTBB 2022 with cmake, but tools/config/configure.R passes the library dir as '-Wl,-L...', and gcc places its own search dirs (/usr/lib64, /usr/lib/<triplet>) ahead of anything forwarded with '-Wl,'. Every build image installs a distro libtbb, so '-ltbb' resolves to it: the binary records NEEDED libtbb.so.12 (libtbb.so.2 on el8/el9) instead of the bundled libtbb.so and cannot load on a machine without that exact system TBB. The patch passes a plain '-L' so the bundled build dir wins. As a safeguard it also makes configure.R, src/install.libs.R and R/tbb.R ignore an ambient TBB_ROOT/TBB_LIB/TBB_INC (opt out with BINCRAFT_ALLOW_SYSTEM_TBB=TRUE): the build images stopped exporting them in build-env-images c51ed09, but a stale image or ~/.Renviron would otherwise switch the build back to the system TBB, and R reads ~/.Renviron after the process environment, so no pipeline env can override it. The read sites move between releases, so each entry pins a patch generated against that version. Upstream still uses '-Wl,-L' in 6.2.1; drop these entries once a release passes a plain '-L'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"package": "RcppParallel",
|
||||||
|
"versions": "6.1.0",
|
||||||
|
"platforms": ["*"],
|
||||||
|
"env": {},
|
||||||
|
"configure_args": [],
|
||||||
|
"makevars": {},
|
||||||
|
"patch": "RcppParallel/force-bundled-tbb-6.1.x.patch",
|
||||||
|
"reason": "RcppParallel 6.x builds its bundled oneTBB 2022 with cmake, but tools/config/configure.R passes the library dir as '-Wl,-L...', and gcc places its own search dirs (/usr/lib64, /usr/lib/<triplet>) ahead of anything forwarded with '-Wl,'. Every build image installs a distro libtbb, so '-ltbb' resolves to it: the binary records NEEDED libtbb.so.12 (libtbb.so.2 on el8/el9) instead of the bundled libtbb.so and cannot load on a machine without that exact system TBB. The patch passes a plain '-L' so the bundled build dir wins. As a safeguard it also makes configure.R, src/install.libs.R and R/tbb.R ignore an ambient TBB_ROOT/TBB_LIB/TBB_INC (opt out with BINCRAFT_ALLOW_SYSTEM_TBB=TRUE): the build images stopped exporting them in build-env-images c51ed09, but a stale image or ~/.Renviron would otherwise switch the build back to the system TBB, and R reads ~/.Renviron after the process environment, so no pipeline env can override it. The read sites move between releases, so each entry pins a patch generated against that version. Upstream still uses '-Wl,-L' in 6.2.1; drop these entries once a release passes a plain '-L'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"package": "RcppParallel",
|
||||||
|
"versions": "6.0.0",
|
||||||
|
"platforms": ["*"],
|
||||||
|
"env": {},
|
||||||
|
"configure_args": [],
|
||||||
|
"makevars": {},
|
||||||
|
"patch": "RcppParallel/force-bundled-tbb-6.0.0.patch",
|
||||||
|
"reason": "RcppParallel 6.x builds its bundled oneTBB 2022 with cmake, but tools/config/configure.R passes the library dir as '-Wl,-L...', and gcc places its own search dirs (/usr/lib64, /usr/lib/<triplet>) ahead of anything forwarded with '-Wl,'. Every build image installs a distro libtbb, so '-ltbb' resolves to it: the binary records NEEDED libtbb.so.12 (libtbb.so.2 on el8/el9) instead of the bundled libtbb.so and cannot load on a machine without that exact system TBB. The patch passes a plain '-L' so the bundled build dir wins. As a safeguard it also makes configure.R, src/install.libs.R and R/tbb.R ignore an ambient TBB_ROOT/TBB_LIB/TBB_INC (opt out with BINCRAFT_ALLOW_SYSTEM_TBB=TRUE): the build images stopped exporting them in build-env-images c51ed09, but a stale image or ~/.Renviron would otherwise switch the build back to the system TBB, and R reads ~/.Renviron after the process environment, so no pipeline env can override it. The read sites move between releases, so each entry pins a patch generated against that version. Upstream still uses '-Wl,-L' in 6.2.1; drop these entries once a release passes a plain '-L'."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"package": "fs",
|
"package": "fs",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue