1
1
2
2
# !diagnostics suppress=R_PACKAGE_DIR,SHLIB_EXT,R_ARCH
3
3
.install.libs <- function (tbbLib ) {
4
-
4
+
5
5
# copy default library
6
6
files <- Sys.glob(paste0(" *" , SHLIB_EXT ))
7
7
dest <- file.path(R_PACKAGE_DIR , paste0(" libs" , R_ARCH ))
8
8
dir.create(dest , recursive = TRUE , showWarnings = FALSE )
9
9
file.copy(files , dest , overwrite = TRUE )
10
-
10
+
11
11
# copy symbols if available
12
12
if (file.exists(" symbols.rds" ))
13
13
file.copy(" symbols.rds" , dest , overwrite = TRUE )
14
-
14
+
15
15
# also copy to package 'libs' folder, for devtools
16
16
libsDest <- paste0(" ../libs" , R_ARCH )
17
17
dir.create(libsDest , recursive = TRUE , showWarnings = FALSE )
18
18
file.copy(files , libsDest , overwrite = TRUE )
19
-
19
+
20
20
# copy tbb (NOTE: do not use inst/ folder as R will resolve symlinks,
21
21
# behavior which we do _not_ want here!)
22
22
tbbDest <- file.path(R_PACKAGE_DIR , paste0(" lib" , R_ARCH ))
23
23
dir.create(tbbDest , recursive = TRUE , showWarnings = FALSE )
24
-
24
+
25
25
# note: on Linux, TBB gets compiled with extensions like
26
26
# '.so.2', so be ready to handle those
27
27
shlibPattern <- switch (
34
34
if (R.version $ os == " emscripten" ) {
35
35
shlibPattern <- " ^libtbb.*\\ .a$"
36
36
}
37
-
37
+
38
38
if (! nzchar(tbbLib )) {
39
-
39
+
40
40
# using bundled TBB
41
41
tbbLibs <- list.files(
42
42
path = " tbb/build/lib_release" ,
43
43
pattern = shlibPattern ,
44
44
full.names = TRUE
45
45
)
46
-
46
+
47
47
for (tbbLib in tbbLibs ) {
48
48
system2(" cp" , c(" -P" , shQuote(tbbLib ), shQuote(tbbDest )))
49
49
}
50
-
50
+
51
51
} else {
52
-
52
+
53
53
# using system tbb
54
54
tbbLibs <- list.files(
55
55
path = tbbLib ,
56
56
pattern = shlibPattern ,
57
57
full.names = TRUE
58
58
)
59
-
59
+
60
60
# don't copy symlinks
61
61
tbbLibs <- tbbLibs [! nzchar(Sys.readlink(tbbLibs ))]
62
-
62
+
63
63
# copy / link the libraries
64
64
useSymlinks <- Sys.getenv(" TBB_USE_SYMLINKS" , unset = .Platform $ OS.type != " windows" )
65
65
if (useSymlinks ) {
69
69
system2(" cp" , c(" -P" , shQuote(tbbLib ), shQuote(tbbDest )))
70
70
}
71
71
}
72
-
72
+
73
73
}
74
-
74
+
75
75
# on Windows, we create a stub library that links to us so that
76
76
# older binaries (like rstan) can still load
77
77
if (.Platform $ OS.type == " windows" ) {
84
84
file.copy(" tbb-compat/tbb.dll" , file.path(tbbDest , " tbb.dll" ))
85
85
}
86
86
}
87
-
87
+
88
88
}
89
89
90
90
useTbbPreamble <- function (tbbInc ) {
@@ -102,22 +102,32 @@ useSystemTbb <- function(tbbLib, tbbInc) {
102
102
}
103
103
104
104
useBundledTbb <- function () {
105
-
105
+
106
106
useTbbPreamble(" tbb/include" )
107
107
dir.create(" tbb/build-tbb" , showWarnings = FALSE )
108
-
108
+
109
109
cmake <- Sys.getenv(" CMAKE" , unset = " cmake" )
110
110
buildType <- Sys.getenv(" CMAKE_BUILD_TYPE" , unset = " Release" )
111
111
verbose <- Sys.getenv(" VERBOSE" , unset = " 0" )
112
112
113
+ splitCompilerVar(" CC" , " CFLAGS" )
114
+ splitCompilerVar(" CXX" , " CXXFLAGS" )
115
+
116
+ prependFlags(" CPPFLAGS" , " CFLAGS" )
117
+ prependFlags(" CPPFLAGS" , " CXXFLAGS" )
118
+
113
119
cmakeFlags <- c(
114
- sprintf(" -DCMAKE_BUILD_TYPE=%s" , buildType ),
120
+ forwardEnvVar(" CC" , " CMAKE_C_COMPILER" ),
121
+ forwardEnvVar(" CXX" , " CMAKE_CXX_COMPILER" ),
122
+ forwardEnvVar(" CFLAGS" , " CMAKE_C_FLAGS" ),
123
+ forwardEnvVar(" CXXFLAGS" , " CMAKE_CXX_FLAGS" ),
124
+ forwardEnvVar(" CMAKE_BUILD_TYPE" , " CMAKE_BUILD_TYPE" ),
115
125
" -DTBB_TEST=0" ,
116
126
" -DTBB_EXAMPLES=0" ,
117
127
" -DTBB_STRICT=0" ,
118
128
" .."
119
129
)
120
-
130
+
121
131
if (R.version $ os == " emscripten" ) {
122
132
cmakeFlags <- c(
123
133
" -DEMSCRIPTEN=1" ,
@@ -126,7 +136,7 @@ useBundledTbb <- function() {
126
136
cmakeFlags
127
137
)
128
138
}
129
-
139
+
130
140
writeLines(" *** configuring tbb" )
131
141
owd <- setwd(" tbb/build-tbb" )
132
142
output <- system2(cmake , shQuote(cmakeFlags ), stdout = TRUE , stderr = TRUE )
@@ -138,7 +148,12 @@ useBundledTbb <- function() {
138
148
writeLines(output )
139
149
}
140
150
setwd(owd )
141
-
151
+
152
+ if (! identical(verbose , " 0" )) {
153
+ writeLines(" *** dumping CMakeCache.txt" )
154
+ writeLines(readLines(" tbb/build-tbb/CMakeCache.txt" ))
155
+ }
156
+
142
157
writeLines(" *** building tbb" )
143
158
owd <- setwd(" tbb/build-tbb" )
144
159
output <- system2(cmake , c(" --build" , " ." , " --config" , " release" ), stdout = TRUE , stderr = TRUE )
@@ -150,34 +165,94 @@ useBundledTbb <- function() {
150
165
writeLines(output )
151
166
}
152
167
setwd(owd )
153
-
168
+
154
169
shlibPattern <- switch (
155
170
Sys.info()[[" sysname" ]],
156
171
Windows = " ^tbb.*\\ .dll$" ,
157
172
Darwin = " ^libtbb.*\\ .dylib$" ,
158
173
" ^libtbb.*\\ .so.*$"
159
174
)
160
-
175
+
161
176
# WASM only supports static libraries
162
177
if (R.version $ os == " emscripten" ) {
163
178
shlibPattern <- " ^libtbb.*\\ .a$"
164
179
}
165
-
180
+
166
181
tbbFiles <- list.files(
167
182
file.path(getwd(), " tbb/build-tbb" ),
168
183
pattern = shlibPattern ,
169
184
recursive = TRUE ,
170
185
full.names = TRUE
171
186
)
172
-
187
+
173
188
dir.create(" tbb/build/lib_release" , recursive = TRUE , showWarnings = FALSE )
174
189
file.copy(tbbFiles , " tbb/build/lib_release" , overwrite = TRUE )
175
190
unlink(" tbb/build-tbb" , recursive = TRUE )
176
191
writeLines(" *** finished building tbb" )
177
-
192
+
193
+ }
194
+
195
+ getenv <- function (key , unset = " " ) {
196
+ Sys.getenv(key , unset = unset )
197
+ }
198
+
199
+
200
+ setenv <- function (key , value ) {
201
+ args <- list (paste(value , collapse = " " ))
202
+ names(args ) <- key
203
+ do.call(Sys.setenv , args )
178
204
}
179
205
180
206
207
+ # CMake doesn't support flags specified directly as part of the compiler
208
+ # definition, so manually split it here.
209
+ splitCompilerVar <- function (compilerVar , flagsVar ) {
210
+
211
+ compiler <- Sys.getenv(compilerVar , unset = NA )
212
+ if (is.na(compiler ))
213
+ return (FALSE )
214
+
215
+ tokens <- scan(text = compiler , what = character (), quiet = TRUE )
216
+ if (length(tokens ) < 2L )
217
+ return (FALSE )
218
+
219
+ setenv(compilerVar , tokens [[1L ]])
220
+
221
+ oldFlags <- Sys.getenv(flagsVar )
222
+ newFlags <- c(tokens [- 1L ], oldFlags )
223
+ setenv(flagsVar , newFlags [nzchar(newFlags )])
224
+
225
+ TRUE
226
+
227
+ }
228
+
229
+
230
+ # Given an environment variable like 'CC', forward that to CMake
231
+ # via the corresponding CMAKE_C_COMPILER flag.
232
+ forwardEnvVar <- function (envVar , cmakeVar ) {
233
+ envVal <- Sys.getenv(envVar , unset = NA )
234
+ if (! is.na(envVal )) {
235
+ sprintf(" -D%s=%s" , cmakeVar , shQuote(envVal ))
236
+ }
237
+ }
238
+
239
+ prependFlags <- function (prependFlags , toFlags ) {
240
+
241
+ prependVal <- Sys.getenv(prependFlags , unset = NA )
242
+ if (is.na(prependVal ))
243
+ return (FALSE )
244
+
245
+ oldVal <- Sys.getenv(toFlags , unset = NA )
246
+ if (is.na(oldVal )) {
247
+ setenv(toFlags , prependVal )
248
+ } else {
249
+ setenv(toFlags , paste(prependVal , oldVal ))
250
+ }
251
+
252
+ TRUE
253
+
254
+ }
255
+
181
256
# Main ----
182
257
183
258
tbbLib <- Sys.getenv(" TBB_LIB" )
0 commit comments