diff --git a/etc/bashrc b/etc/bashrc
index 02d084f0607adc627330158191e3724679ea7e74..2e157923b74d9ed6d5b3c421fcdb6abf7fb2dcbc 100644
--- a/etc/bashrc
+++ b/etc/bashrc
@@ -6,7 +6,7 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2022 OpenCFD Ltd.
+#     Copyright (C) 2016-2023 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
@@ -87,6 +87,7 @@ export WM_COMPILE_OPTION=Opt
 #   +lld    : with  lld linker (with clang)
 #   +mold   : with mold linker (with clang)
 #   ~libz   : without libz compression
+#   ~rpath  : without rpath handling [MacOS]
 #   +openmp : with openmp
 #   ~openmp : without openmp
 #   +ccache : use ccache
diff --git a/etc/cshrc b/etc/cshrc
index 7f19beec7b9b8d8d592acd48f2dff4f04c2c7d7c..5a42602f5052620da9742c5c81dc511d1df88b97 100644
--- a/etc/cshrc
+++ b/etc/cshrc
@@ -6,7 +6,7 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2022 OpenCFD Ltd.
+#     Copyright (C) 2016-2023 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
@@ -87,6 +87,7 @@ setenv WM_COMPILE_OPTION Opt
 #   +lld    : with  lld linker (with clang)
 #   +mold   : with mold linker (with clang)
 #   ~libz   : without libz compression
+#   ~rpath  : without rpath handling [MacOS]
 #   +openmp : with openmp
 #   ~openmp : without openmp
 #   +ccache : use ccache
diff --git a/wmake/rules/darwin64Clang/c++ b/wmake/rules/darwin64Clang/c++
index 7547b28d53756438fbdafac8d287e705a6ac69ba..a9e092144ade06a31759f2ce7b96226fccb681a3 100644
--- a/wmake/rules/darwin64Clang/c++
+++ b/wmake/rules/darwin64Clang/c++
@@ -16,10 +16,16 @@ cctoo       = $(Ctoo)
 cpptoo      = $(Ctoo)
 cxxtoo      = $(Ctoo)
 
-LINK_LIBS   = $(c++DBUG)
 
-LINKLIBSO   = $(CC) $(c++FLAGS) -Wl,-dylib,-undefined,dynamic_lookup
+# Linking:
+# with or without rpath components on MacOS
+# - current default is with rpath unless explicitly disabled
 
-LINKEXE     = $(CC) $(c++FLAGS) -Wl,-execute,-undefined,dynamic_lookup
+ifneq (,$(findstring ~rpath,$(WM_COMPILE_CONTROL)))
+    include $(DEFAULT_RULES)/link-c++
+
+else
+    include $(DEFAULT_RULES)/link-rpath-c++
+endif
 
 #------------------------------------------------------------------------------
diff --git a/wmake/rules/darwin64Clang/link-c++ b/wmake/rules/darwin64Clang/link-c++
new file mode 100644
index 0000000000000000000000000000000000000000..d1c1f6e6a704a7a6a9c69580c7e018b810741e22
--- /dev/null
+++ b/wmake/rules/darwin64Clang/link-c++
@@ -0,0 +1,9 @@
+#------------------------------------------------------------------------------
+
+LINK_LIBS   = $(c++DBUG)
+
+LINKLIBSO   = $(CC) $(c++FLAGS) -Wl,-dylib,-undefined,dynamic_lookup
+
+LINKEXE     = $(CC) $(c++FLAGS) -Wl,-execute,-undefined,dynamic_lookup
+
+#------------------------------------------------------------------------------
diff --git a/wmake/rules/darwin64Clang/link-rpath-c++ b/wmake/rules/darwin64Clang/link-rpath-c++
new file mode 100644
index 0000000000000000000000000000000000000000..f7a7cd600186df380073ed44eeeb0d3aa2334b20
--- /dev/null
+++ b/wmake/rules/darwin64Clang/link-rpath-c++
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+include $(DEFAULT_RULES)/rpath
+
+LINK_LIBS   = $(c++DBUG)
+
+LINKLIBSO   = $(CC) $(c++FLAGS) \
+    $(PROJECT_RPATH) -dynamiclib \
+    -install_name @rpath/$(notdir $(LIB)$(EXT_SO)) \
+    -Wl,-dylib,-undefined,dynamic_lookup
+
+LINKEXE     = $(CC) $(c++FLAGS) \
+    $(subst @loader_path,@executable_path/../lib,$(PROJECT_RPATH)) \
+    -Wl,-execute,-undefined,dynamic_lookup
+
+#------------------------------------------------------------------------------
diff --git a/wmake/rules/darwin64Clang/rpath b/wmake/rules/darwin64Clang/rpath
new file mode 100644
index 0000000000000000000000000000000000000000..834b8f16934e1fb9f4173effe12ad76814a43937
--- /dev/null
+++ b/wmake/rules/darwin64Clang/rpath
@@ -0,0 +1,30 @@
+#------------------------------------------------------------------------------
+
+# Compile-time rpath information:
+
+FOAM_MPI ?= dummy
+ifeq (,$(strip $(FOAM_MPI)))
+    FOAM_MPI = dummy
+endif
+
+PROJECT_RPATH :=
+
+# ThirdParty libraries (FOAM_EXT_LIBBIN) : mpi-specific and serial
+ifneq (,$(strip $(FOAM_EXT_LIBBIN)))
+    ifneq (dummy,$(strip $(FOAM_MPI)))
+        PROJECT_RPATH += -rpath $(FOAM_EXT_LIBBIN)/$(FOAM_MPI)
+    endif
+    PROJECT_RPATH += -rpath $(FOAM_EXT_LIBBIN)
+endif
+
+# project libraries (FOAM_LIBBIN) : mpi-specific and serial
+# encode as @loader_path and recompose as @executable_path as needed
+ifneq (dummy,$(strip $(FOAM_MPI)))
+    PROJECT_RPATH += -rpath @loader_path/$(FOAM_MPI)
+endif
+PROJECT_RPATH += -rpath @loader_path
+
+# Fallback for stubs libraries (largely for missing MPI) - to be found last
+PROJECT_RPATH += -rpath @loader_path/dummy
+
+#------------------------------------------------------------------------------