From fb643c4c4dad33aa674eb09407c0caa6e41c2d42 Mon Sep 17 00:00:00 2001 From: Michael Steinbaugh Date: Fri, 25 Aug 2023 21:04:05 -0400 Subject: [PATCH] Add support for `ldpaths` detection on macOS via `DYLD_FALLBACK_LIBRARY_PATH` (#417) --- radian/app.py | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/radian/app.py b/radian/app.py index 0a87a9b..1da7937 100644 --- a/radian/app.py +++ b/radian/app.py @@ -75,35 +75,48 @@ def main(cleanup=None): if not r_home: raise RuntimeError("Cannot find R binary. Expose it via the `PATH` variable.") - if sys.platform.startswith("linux"): - # respect R_ARCH variable? + if not sys.platform.startswith("win"): libPath = os.path.join(r_home, "lib") ldpaths = os.path.join(r_home, "etc", "ldpaths") - if "R_LD_LIBRARY_PATH" not in os.environ or libPath not in os.environ["R_LD_LIBRARY_PATH"]: + if ( + "R_LD_LIBRARY_PATH" not in os.environ + or libPath not in os.environ["R_LD_LIBRARY_PATH"] + ): if os.path.exists(ldpaths): - R_LD_LIBRARY_PATH = subprocess.check_output( - ". \"{}\"; echo $R_LD_LIBRARY_PATH".format(ldpaths), - shell=True - ).decode("utf-8").strip() + R_LD_LIBRARY_PATH = ( + subprocess.check_output( + '. "{}"; echo $R_LD_LIBRARY_PATH'.format(ldpaths), + shell=True, + ) + .decode("utf-8") + .strip() + ) elif "R_LD_LIBRARY_PATH" in os.environ: R_LD_LIBRARY_PATH = os.environ["R_LD_LIBRARY_PATH"] else: R_LD_LIBRARY_PATH = libPath - if libPath not in R_LD_LIBRARY_PATH: R_LD_LIBRARY_PATH = "{}:{}".format(libPath, R_LD_LIBRARY_PATH) - - os.environ['R_LD_LIBRARY_PATH'] = R_LD_LIBRARY_PATH - - if "LD_LIBRARY_PATH" in os.environ: - LD_LIBRARY_PATH = "{}:{}".format(R_LD_LIBRARY_PATH, os.environ["LD_LIBRARY_PATH"]) + os.environ["R_LD_LIBRARY_PATH"] = R_LD_LIBRARY_PATH + # respect R_ARCH variable? + if sys.platform == "darwin": + ld_library_var = "DYLD_FALLBACK_LIBRARY_PATH" + else: + ld_library_var = "LD_LIBRARY_PATH" + if ld_library_var in os.environ: + LD_LIBRARY_PATH = "{}:{}".format( + R_LD_LIBRARY_PATH, os.environ[ld_library_var] + ) else: LD_LIBRARY_PATH = R_LD_LIBRARY_PATH - os.environ['LD_LIBRARY_PATH'] = LD_LIBRARY_PATH + os.environ[ld_library_var] = LD_LIBRARY_PATH if sys.argv[0].endswith("radian"): os.execv(sys.argv[0], sys.argv) else: - os.execv(sys.executable, [sys.executable, "-m", "radian"] + sys.argv[1:]) + os.execv( + sys.executable, + [sys.executable, "-m", "radian"] + sys.argv[1:], + ) RadianApplication(r_home, ver=__version__).run(options, cleanup=cleanup)