diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 227c93174e25cfdeb2ab231d4479ceba695672fb..5de6fed7e45e8c7c13284cea388e08ad2ea50060 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -368,13 +368,16 @@ $(1)="$(if $($(1)),$(2):$$$(1),$(2))"
 endef
 
 # platform-specific environment variable to set shared library path
-define ld_library_path_var
-$(if $(filter $(PORTNAME),darwin),DYLD_LIBRARY_PATH,$(if $(filter $(PORTNAME),aix),LIBPATH,$(if $(filter $(PORTNAME),hpux),SHLIB_PATH,LD_LIBRARY_PATH)))
-endef
-
-define with_temp_install
-PATH="$(abs_top_builddir)/tmp_install$(bindir):$$PATH" $(call add_to_path,$(ld_library_path_var),$(abs_top_builddir)/tmp_install$(libdir))
-endef
+# individual ports can override this later, this is the default name
+ld_library_path_var = LD_LIBRARY_PATH
+
+# with_temp_install_extra is for individual ports to define if they
+# need something more here. If not defined then the expansion does
+# nothing.
+with_temp_install = \
+	PATH="$(abs_top_builddir)/tmp_install$(bindir):$$PATH" \
+	$(call add_to_path,$(strip $(ld_library_path_var)),$(abs_top_builddir)/tmp_install$(libdir)) \
+	$(with_temp_install_extra)
 
 ifeq ($(enable_tap_tests),yes)
 
diff --git a/src/makefiles/Makefile.aix b/src/makefiles/Makefile.aix
index e5ad89d147007d4f6811e2c7f86e1a61be7dae62..00b5ea115db043054cc9eb4f4232afd53159c03e 100644
--- a/src/makefiles/Makefile.aix
+++ b/src/makefiles/Makefile.aix
@@ -23,6 +23,9 @@ else
 	LDFLAGS_SL += -Wl,-bnoentry -Wl,-H512 -Wl,-bM:SRE
 endif
 
+# env var name to use in place of LD_LIBRARY_PATH
+ld_library_path_var = LIBPATH
+
 
 POSTGRES_IMP= postgres.imp
 
diff --git a/src/makefiles/Makefile.darwin b/src/makefiles/Makefile.darwin
index 7a8ba3e52748320c396972112d51fb3f8a965a09..892c2cb2d7a5cb563f47e7716e9ab6a104569dd1 100644
--- a/src/makefiles/Makefile.darwin
+++ b/src/makefiles/Makefile.darwin
@@ -2,6 +2,9 @@ AROPT = crs
 
 DLSUFFIX = .so
 
+# env var name to use in place of LD_LIBRARY_PATH
+ld_library_path_var = DYLD_LIBRARY_PATH
+
 ifdef PGXS
   BE_DLLLIBS = -bundle_loader $(bindir)/postgres
 else
diff --git a/src/makefiles/Makefile.freebsd b/src/makefiles/Makefile.freebsd
index 5a98e5a2b0bb0962f3bd38b07c22fa503d5fc9fc..5008c96b3f5a5e96465f6fb81e09606b1f9f7937 100644
--- a/src/makefiles/Makefile.freebsd
+++ b/src/makefiles/Makefile.freebsd
@@ -9,6 +9,14 @@ DLSUFFIX = .so
 
 CFLAGS_SL = -fPIC -DPIC
 
+# extra stuff for $(with_temp_install)
+# we need this to get LD_LIBRARY_PATH searched ahead of the compiled-in
+# rpath, if no DT_RUNPATH is present in the executable. The conditions
+# under which DT_RUNPATH are added seem unpredictable, so be safe.
+
+define with_temp_install_extra
+LD_LIBRARY_PATH_RPATH=1
+endef
 
 # Rule for building a shared library from a single .o file
 %.so: %.o
diff --git a/src/makefiles/Makefile.hpux b/src/makefiles/Makefile.hpux
index 97bd0ba6d9e27e2c9694a0d587bfbc36b8b4b052..84a1cc35425ed197a3ee44f7f167aa69575e0f06 100644
--- a/src/makefiles/Makefile.hpux
+++ b/src/makefiles/Makefile.hpux
@@ -36,6 +36,9 @@ else
    CFLAGS_SL = +Z
 endif
 
+# env var name to use in place of LD_LIBRARY_PATH
+ld_library_path_var = SHLIB_PATH
+
 # Rule for building a shared library from a single .o file
 %$(DLSUFFIX): %.o
 ifeq ($(GCC), yes)