@@ -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,36 @@ 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+ fresh <- quickr_flang_available_at_path(flang )
56+ if (! isTRUE(fresh $ available )) {
57+ rm(list = cache_key , envir = cache )
58+ }
59+ return (fresh )
60+ }
61+
62+ cached <- quickr_flang_available_at_path(flang )
63+ if (isTRUE(cached $ available )) {
64+ assign(cache_key , cached , envir = cache )
65+ }
66+
67+ cached
68+ }
69+
3170quickr_flang_state <- local({
3271 state <- new.env(parent = emptyenv())
3372 state $ auto_disabled <- FALSE
@@ -164,15 +203,15 @@ quickr_prefer_flang <- function(
164203
165204 # Best-effort: on macOS, prefer flang if it is available.
166205 if (sysname == " Darwin" ) {
167- info <- quickr_flang_available (which = which , system2 = system2 )
206+ info <- quickr_cached_flang_available (which = which , system2 = system2 )
168207 return (isTRUE(info $ available ))
169208 }
170209
171210 FALSE
172211}
173212
174213quickr_default_fortran_makevars_lines <- function (
175- config_value = quickr_r_cmd_config_value
214+ config_value = quickr_cached_r_cmd_config_value
176215) {
177216 fc <- trimws(config_value(" FC" ))
178217 if (! nzchar(fc )) {
@@ -200,7 +239,7 @@ quickr_fcompiler_env <- function(
200239 sysname = Sys.info()[[" sysname" ]],
201240 use_openmp = FALSE ,
202241 link_flags = character (),
203- config_value = quickr_r_cmd_config_value
242+ config_value = quickr_cached_r_cmd_config_value
204243) {
205244 stopifnot(is.character(build_dir ), length(build_dir ) == 1L , nzchar(build_dir ))
206245
@@ -217,7 +256,10 @@ quickr_fcompiler_env <- function(
217256 system2 = system2
218257 ))
219258 if (use_flang ) {
220- flang_info <- quickr_flang_available(which = which , system2 = system2 )
259+ flang_info <- quickr_cached_flang_available(
260+ which = which ,
261+ system2 = system2
262+ )
221263 flang <- flang_info $ path
222264 if (! isTRUE(flang_info $ available )) {
223265 if (isTRUE(explicit_request )) {
0 commit comments