@@ -15,6 +15,15 @@ quickr_flang_available <- function(
1515 system2 = base :: system2
1616) {
1717 flang <- quickr_flang_path(which = which )
18+ quickr_flang_available_at_path(flang , system2 = system2 )
19+ }
20+
21+ quickr_flang_available_at_path <- function (
22+ flang ,
23+ system2 = base :: system2
24+ ) {
25+ stopifnot(is_string(flang ), is.function(system2 ))
26+
1827 if (! nzchar(flang )) {
1928 return (list (path = " " , available = FALSE ))
2029 }
@@ -28,6 +37,28 @@ quickr_flang_available <- function(
2837 list (path = flang , available = TRUE )
2938}
3039
40+ quickr_cached_flang_available <- function (
41+ which = Sys.which ,
42+ system2 = base :: system2 ,
43+ cache = quickr_compiler_probe_cache
44+ ) {
45+ stopifnot(is.function(which ), is.function(system2 ), is.environment(cache ))
46+
47+ flang <- quickr_flang_path(which = which )
48+ if (! identical(system2 , base :: system2 )) {
49+ return (quickr_flang_available_at_path(flang , system2 = system2 ))
50+ }
51+
52+ cache_key <- paste(" flang_available" , flang , sep = " \r " )
53+ cached <- get0(cache_key , envir = cache , inherits = FALSE , ifnotfound = NULL )
54+ if (is.null(cached )) {
55+ cached <- quickr_flang_available_at_path(flang )
56+ assign(cache_key , cached , envir = cache )
57+ }
58+
59+ cached
60+ }
61+
3162quickr_flang_state <- local({
3263 state <- new.env(parent = emptyenv())
3364 state $ auto_disabled <- FALSE
@@ -164,15 +195,15 @@ quickr_prefer_flang <- function(
164195
165196 # Best-effort: on macOS, prefer flang if it is available.
166197 if (sysname == " Darwin" ) {
167- info <- quickr_flang_available (which = which , system2 = system2 )
198+ info <- quickr_cached_flang_available (which = which , system2 = system2 )
168199 return (isTRUE(info $ available ))
169200 }
170201
171202 FALSE
172203}
173204
174205quickr_default_fortran_makevars_lines <- function (
175- config_value = quickr_r_cmd_config_value
206+ config_value = quickr_cached_r_cmd_config_value
176207) {
177208 fc <- trimws(config_value(" FC" ))
178209 if (! nzchar(fc )) {
@@ -200,7 +231,7 @@ quickr_fcompiler_env <- function(
200231 sysname = Sys.info()[[" sysname" ]],
201232 use_openmp = FALSE ,
202233 link_flags = character (),
203- config_value = quickr_r_cmd_config_value
234+ config_value = quickr_cached_r_cmd_config_value
204235) {
205236 stopifnot(is.character(build_dir ), length(build_dir ) == 1L , nzchar(build_dir ))
206237
@@ -217,7 +248,10 @@ quickr_fcompiler_env <- function(
217248 system2 = system2
218249 ))
219250 if (use_flang ) {
220- flang_info <- quickr_flang_available(which = which , system2 = system2 )
251+ flang_info <- quickr_cached_flang_available(
252+ which = which ,
253+ system2 = system2
254+ )
221255 flang <- flang_info $ path
222256 if (! isTRUE(flang_info $ available )) {
223257 if (isTRUE(explicit_request )) {
0 commit comments