[Rd] Sys.which() caching path to `which`
Harmen Stoppels
me @end|ng |rom h@rmen@toppe|@@n|
Tue Jan 16 20:02:48 CET 2024
On Friday, January 12th, 2024 at 16:11, Ivan Krylov <ikrylov using disroot.org> wrote:
> unlike `which`, `command -v` returns names of shell builtins if
> something is both an executable and a builtin. So for things like `[`,
> Sys.which would behave differently if changed to use command -v
Then can we revisit my simple fix, which refers to `which` through a
symlink instead of a hard-coded absolute in an R-source file:
>From 3f2b1b6c94460fd4d3e9f03c9f17a25db2d2b473 Mon Sep 17 00:00:00 2001
From: Harmen Stoppels <me using harmenstoppels.nl>
Date: Wed, 10 Jan 2024 12:40:40 +0100
Subject: [PATCH] base: use a symlink for which instead of hard-coded string
---
share/make/basepkg.mk | 8 ++++----
src/library/base/R/unix/system.unix.R | 6 +++---
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/share/make/basepkg.mk b/share/make/basepkg.mk
index c0a69c8a0af..4cf63878709 100644
--- a/share/make/basepkg.mk
+++ b/share/make/basepkg.mk
@@ -72,16 +72,16 @@ mkRbase:
else \
cat $(RSRC) > "$${f}"; \
fi; \
- f2=$${TMPDIR:-/tmp}/R2$$$$; \
- sed -e "s:@WHICH@:${WHICH}:" "$${f}" > "$${f2}"; \
- rm -f "$${f}"; \
- $(SHELL) $(top_srcdir)/tools/move-if-change "$${f2}" all.R)
+ $(SHELL) $(top_srcdir)/tools/move-if-change "$${f}" all.R)
@if ! test -f $(top_builddir)/library/$(pkg)/R/$(pkg); then \
$(INSTALL_DATA) all.R $(top_builddir)/library/$(pkg)/R/$(pkg); \
else if test all.R -nt $(top_builddir)/library/$(pkg)/R/$(pkg); then \
$(INSTALL_DATA) all.R $(top_builddir)/library/$(pkg)/R/$(pkg); \
fi \
fi
+ @if ! test -f $(top_builddir)/library/$(pkg)/R/which; then \
+ cd $(top_builddir)/library/$(pkg)/R/ && $(LN_S) $(WHICH) which; \
+ fi
mkdesc:
@if test -f DESCRIPTION; then \
diff --git a/src/library/base/R/unix/system.unix.R b/src/library/base/R/unix/system.unix.R
index 3bb7d0cb27c..78271c8c12c 100644
--- a/src/library/base/R/unix/system.unix.R
+++ b/src/library/base/R/unix/system.unix.R
@@ -114,9 +114,9 @@ system2 <- function(command, args = character(),
Sys.which <- function(names)
{
res <- character(length(names)); names(res) <- names
- ## hopefully configure found [/usr]/bin/which
- which <- "@WHICH@"
- if (!nzchar(which)) {
+ which <- file.path(R.home(), "library", "base", "R", "which")
+ ## which should be a symlink to the system's which
+ if (!file.exists(which)) {
warning("'which' was not found on this platform")
return(res)
}
More information about the R-devel
mailing list