From 11009361d0672bb26bc5f7fa8987e119f5b202f7 Mon Sep 17 00:00:00 2001 From: Hiroaki Yutani Date: Wed, 13 Jan 2021 22:43:40 +0900 Subject: [PATCH] Override PATH variables --- DESCRIPTION | 3 ++- R/source.R | 41 ++++++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index bb9c259e..e6762372 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,7 +23,8 @@ Imports: dplyr, glue, tibble, - purrr + purrr, + withr Suggests: knitr, rmarkdown, diff --git a/R/source.R b/R/source.R index 13aff439..078cc3f1 100644 --- a/R/source.R +++ b/R/source.R @@ -126,20 +126,35 @@ rust_source <- function(file, code = NULL, dependencies = NULL, # Get target name, not null for Windows specific_target <- get_specific_target_name() - status <- system2( - command = "cargo", - args = c( - sprintf("+%s", toolchain), - "build", - "--lib", - if (!is.null(specific_target)) sprintf("--target %s", specific_target) else NULL, - sprintf("--manifest-path %s", file.path(dir, "Cargo.toml")), - sprintf("--target-dir %s", file.path(dir, "target")), - if (profile == "release") "--release" else NULL - ), - stdout = stdout, - stderr = stdout + envvars <- character(0) + + if (.Platform$OS.type == "windows") { + rtools_path <- normalizePath(file.path(Sys.getenv("RTOOLS40_HOME"), "usr", "bin")) + + cargo_home_default <- file.path(Sys.getenv("USERPROFILE"), ".cargo") + cargo_path <- normalizePath(file.path(Sys.getenv("CARGO_HOME", unset = cargo_home_default), "bin")) + + envvars <- c(PATH = paste(rtools_path, cargo_path, sep = ";")) + } + + withr::with_envvar( + envvars, + status <- system2( + command = "cargo", + args = c( + sprintf("+%s", toolchain), + "build", + "--lib", + if (!is.null(specific_target)) sprintf("--target %s", specific_target) else NULL, + sprintf("--manifest-path %s", file.path(dir, "Cargo.toml")), + sprintf("--target-dir %s", file.path(dir, "target")), + if (profile == "release") "--release" else NULL + ), + stdout = stdout, + stderr = stdout + ) ) + if (status != 0L) { stop("Rust code could not be compiled successfully. Aborting.", call. = FALSE) }