[education/rkward] rkward/rbackend: Next attempt at fixing environment inside AppImage.

Thomas Friedrichsmeier null at kde.org
Sun Jul 17 12:43:21 BST 2022


Git commit 3f8fd13e75fece2bc294fb71dced6ee3b36e1a51 by Thomas Friedrichsmeier.
Committed on 17/07/2022 at 11:42.
Pushed by tfry into branch 'master'.

Next attempt at fixing environment inside AppImage.

M  +18   -0    rkward/rbackend/rkrinterface.cpp

https://invent.kde.org/education/rkward/commit/3f8fd13e75fece2bc294fb71dced6ee3b36e1a51

diff --git a/rkward/rbackend/rkrinterface.cpp b/rkward/rbackend/rkrinterface.cpp
index 7f63ca5b..11c0d3f6 100644
--- a/rkward/rbackend/rkrinterface.cpp
+++ b/rkward/rbackend/rkrinterface.cpp
@@ -380,6 +380,24 @@ void RInterface::handleRequest (RBackendRequest* request) {
 			RK_ASSERT (command->getDataLength () == 1);
 			RKSessionVars::setRVersion (command->stringVector ().value (0));
 		});
+
+		if (!qgetenv("APPDIR").isEmpty()) {
+			// Running inside an AppImage. As soon as R has started, it should behave as if running in the main (system) environment (esp. when calling helper binaries such as wget or gcc).
+			// Unset any paths starting with APPDIR, _except_ those inside R_HOME. 
+			runStartupCommand(new RCommand("local({\n"
+			"	appdir <- Sys.getenv(\"APPDIR\")\n"
+			"	fix <- function(key) {\n"
+			"		paths <- strsplit(Sys.getenv(key), \":\", fixed=TRUE)[[1]]\n"
+			"		paths <- paths[!(startsWith(paths, appdir) & !startsWith(paths, R.home()))]\n"
+			"		patharg <- list(paste(paths, collapse=\":\"))\n"
+			"		names(patharg) <- key\n"
+			"		do.call(Sys.setenv, patharg)\n"
+			"	}\n"
+			"	fix(\"LD_LIBRARY_PATH\")\n"
+			"	fix(\"PATH\")\n"
+			"})\n", RCommand::App | RCommand::Sync), chain, [](RCommand*) {});
+		}
+
 		// find out about standard library locations
 		runStartupCommand(new RCommand("c(path.expand(Sys.getenv(\"R_LIBS_USER\")), .libPaths())\n", RCommand::GetStringVector | RCommand::App | RCommand::Sync), chain,
 		[this](RCommand *command) {


More information about the rkward-tracker mailing list