diff --git a/var/spack/repos/builtin/packages/fujitsu-mpi/package.py b/var/spack/repos/builtin/packages/fujitsu-mpi/package.py
index 62da3aab01ef32144f0d5f9d015b104cf3916b3d..c0a882ec4c7164b63a6f0fb6e82adc7664d11241 100644
--- a/var/spack/repos/builtin/packages/fujitsu-mpi/package.py
+++ b/var/spack/repos/builtin/packages/fujitsu-mpi/package.py
@@ -34,6 +34,11 @@ def setup_dependent_package(self, module, dependent_spec):
         self.spec.mpifc = self.prefix.bin.mpifrt
 
     def setup_dependent_build_environment(self, env, dependent_spec):
+        self.setup_run_environment(env)
+
+    def setup_run_environment(self, env):
+        # Because MPI are both compilers and runtimes, we set up the compilers
+        # as part of run environment
         env.set('MPICC', self.prefix.bin.mpifcc)
         env.set('MPICXX', self.prefix.bin.mpiFCC)
         env.set('MPIF77', self.prefix.bin.mpifrt)
diff --git a/var/spack/repos/builtin/packages/intel-mpi/package.py b/var/spack/repos/builtin/packages/intel-mpi/package.py
index 15cb84150ef5c6d86b6b9bd18d1257f74f810d6b..52e93e66728ec90b8d584dd1360518209fcbabb6 100644
--- a/var/spack/repos/builtin/packages/intel-mpi/package.py
+++ b/var/spack/repos/builtin/packages/intel-mpi/package.py
@@ -63,3 +63,9 @@ def setup_dependent_build_environment(self, *args):
             'F90':  spack_fc,
             'FC':   spack_fc,
         })
+
+    def setup_run_environment(self, env):
+        super(self, IntelMpi).setup_run_environment(env)
+
+        for name, value in self.mpi_compiler.wrappers.items():
+            env.set(name, value)
diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
index 410cd4045e4748cb5222ff148793ada7a42b4f24..f59aa2b7ea6e06c4796c65aaadf5d2eb0e289d31 100644
--- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
+++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py
@@ -225,3 +225,9 @@ def setup_dependent_build_environment(self, *args):
             'F90':  spack_fc,
             'FC':   spack_fc,
         })
+
+    def setup_run_environment(self, env):
+        super(self, IntelParallelStudio).setup_run_environment(env)
+
+        for name, value in self.mpi_compiler_wrappers.items():
+            env.set(name, value)
diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py
index 042c2c5b1241916fc395a0632821c878000c0c66..c9c7886a0885a8b0cdec07fcaffa2dabde84daa0 100644
--- a/var/spack/repos/builtin/packages/mpich/package.py
+++ b/var/spack/repos/builtin/packages/mpich/package.py
@@ -160,7 +160,9 @@ def setup_build_environment(self, env):
         if self.spec.satisfies('%gcc@10:'):
             env.set('FFLAGS', '-fallow-argument-mismatch')
 
-    def setup_dependent_build_environment(self, env, dependent_spec):
+    def setup_run_environment(self, env):
+        # Because MPI implementations provide compilers, they have to add to
+        # their run environments the code to make the compilers available.
         # For Cray MPIs, the regular compiler wrappers *are* the MPI wrappers.
         # Cray MPIs always have cray in the module name, e.g. "cray-mpich"
         if self.spec.external_module and 'cray' in self.spec.external_module:
@@ -174,6 +176,9 @@ def setup_dependent_build_environment(self, env, dependent_spec):
             env.set('MPIF77', join_path(self.prefix.bin, 'mpif77'))
             env.set('MPIF90', join_path(self.prefix.bin, 'mpif90'))
 
+    def setup_dependent_build_environment(self, env, dependent_spec):
+        self.setup_run_environment(env)
+
         env.set('MPICH_CC', spack_cc)
         env.set('MPICH_CXX', spack_cxx)
         env.set('MPICH_F77', spack_f77)
diff --git a/var/spack/repos/builtin/packages/mpt/package.py b/var/spack/repos/builtin/packages/mpt/package.py
index 12f7202ebc62e1b1788dee7e92fc404517673329..45dfce6ba5b5152eefd5de6fc089299dc6b6fd1c 100644
--- a/var/spack/repos/builtin/packages/mpt/package.py
+++ b/var/spack/repos/builtin/packages/mpt/package.py
@@ -39,13 +39,20 @@ def libs(self):
         )
 
     def setup_dependent_build_environment(self, env, dependent_spec):
+        self.setup_run_environment(env)
+
+        # use the Spack compiler wrappers under MPI
+        env.set('MPICC_CC', spack_cc)
+        env.set('MPICXX_CXX', spack_cxx)
+        env.set('MPIF90_F90', spack_fc)
+
+    def setup_run_environment(self, env):
+        # Because MPI is both runtime and compiler, we have to setup the mpi
+        # compilers as part of the run environment.
         env.set('MPICC',  self.prefix.bin.mpicc)
         env.set('MPICXX', self.prefix.bin.mpicxx)
         env.set('MPIF77', self.prefix.bin.mpif77)
         env.set('MPIF90', self.prefix.bin.mpif90)
-        env.set('MPICC_CC', spack_cc)
-        env.set('MPICXX_CXX', spack_cxx)
-        env.set('MPIF90_F90', spack_fc)
 
     def setup_dependent_package(self, module, dependent_spec):
         if 'platform=cray' in self.spec:
diff --git a/var/spack/repos/builtin/packages/mvapich2/package.py b/var/spack/repos/builtin/packages/mvapich2/package.py
index 0fb3c36b28971306fe07a5b606dd45d21ceac28d..dac9b69c49693495741ea6e8ae680928e547fcb5 100644
--- a/var/spack/repos/builtin/packages/mvapich2/package.py
+++ b/var/spack/repos/builtin/packages/mvapich2/package.py
@@ -208,7 +208,21 @@ def setup_run_environment(self, env):
         if 'process_managers=slurm' in self.spec:
             env.set('SLURM_MPI_TYPE', 'pmi2')
 
+        # Because MPI functions as a compiler, we need to treat it as one and
+        # add its compiler paths to the run environment.
+        self.setup_compiler_environment(env)
+
     def setup_dependent_build_environment(self, env, dependent_spec):
+        self.setup_compiler_environment(env)
+
+        # use the Spack compiler wrappers under MPI
+        env.set('MPICH_CC', spack_cc)
+        env.set('MPICH_CXX', spack_cxx)
+        env.set('MPICH_F77', spack_f77)
+        env.set('MPICH_F90', spack_fc)
+        env.set('MPICH_FC', spack_fc)
+
+    def setup_compiler_environment(self, env):
         # For Cray MPIs, the regular compiler wrappers *are* the MPI wrappers.
         # Cray MPIs always have cray in the module name, e.g. "cray-mvapich"
         if self.spec.external_module and 'cray' in self.spec.external_module:
@@ -222,12 +236,6 @@ def setup_dependent_build_environment(self, env, dependent_spec):
             env.set('MPIF77', join_path(self.prefix.bin, 'mpif77'))
             env.set('MPIF90', join_path(self.prefix.bin, 'mpif90'))
 
-        env.set('MPICH_CC', spack_cc)
-        env.set('MPICH_CXX', spack_cxx)
-        env.set('MPICH_F77', spack_f77)
-        env.set('MPICH_F90', spack_fc)
-        env.set('MPICH_FC', spack_fc)
-
     def setup_dependent_package(self, module, dependent_spec):
         # For Cray MPIs, the regular compiler wrappers *are* the MPI wrappers.
         # Cray MPIs always have cray in the module name, e.g. "cray-mvapich"
diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py
index abe7b1d3ee28ab2271da939d18123a6a58e7fe4c..b3dcac253e25dda3e2a06f514dafb8e7729cd5d6 100644
--- a/var/spack/repos/builtin/packages/openmpi/package.py
+++ b/var/spack/repos/builtin/packages/openmpi/package.py
@@ -297,12 +297,18 @@ def libs(self):
             libraries, root=self.prefix, shared=True, recursive=True
         )
 
-    def setup_dependent_build_environment(self, env, dependent_spec):
+    def setup_run_environment(self, env):
+        # Because MPI is both a runtime and a compiler, we have to setup the
+        # compiler components as part of the run environment.
         env.set('MPICC',  join_path(self.prefix.bin, 'mpicc'))
         env.set('MPICXX', join_path(self.prefix.bin, 'mpic++'))
         env.set('MPIF77', join_path(self.prefix.bin, 'mpif77'))
         env.set('MPIF90', join_path(self.prefix.bin, 'mpif90'))
 
+    def setup_dependent_build_environment(self, env, dependent_spec):
+        self.setup_run_environment(env)
+
+        # Use the spack compiler wrappers under MPI
         env.set('OMPI_CC', spack_cc)
         env.set('OMPI_CXX', spack_cxx)
         env.set('OMPI_FC', spack_fc)
diff --git a/var/spack/repos/builtin/packages/spectrum-mpi/package.py b/var/spack/repos/builtin/packages/spectrum-mpi/package.py
index 8cdd82e2ae1fccaf3249ec1ec046b79d26ccb94d..8ec206adae3e1db8297ea4b9f74430f318f45d27 100644
--- a/var/spack/repos/builtin/packages/spectrum-mpi/package.py
+++ b/var/spack/repos/builtin/packages/spectrum-mpi/package.py
@@ -56,3 +56,22 @@ def setup_dependent_build_environment(self, env, dependent_spec):
         env.set('OMPI_F77', spack_f77)
 
         env.prepend_path('LD_LIBRARY_PATH', self.prefix.lib)
+
+    def setup_run_environment(self, env):
+        # Because MPI functions as a compiler we need to setup the compilers
+        # in the run environment, like any compiler
+        if '%xl' in self.spec or '%xl_r' in self.spec:
+            env.set('MPICC', os.path.join(self.prefix.bin, 'mpixlc'))
+            env.set('MPICXX', os.path.join(self.prefix.bin, 'mpixlC'))
+            env.set('MPIF77', os.path.join(self.prefix.bin, 'mpixlf'))
+            env.set('MPIF90', os.path.join(self.prefix.bin, 'mpixlf'))
+        elif '%pgi' in self.spec:
+            env.set('MPICC', os.path.join(self.prefix.bin, 'mpipgicc'))
+            env.set('MPICXX', os.path.join(self.prefix.bin, 'mpipgic++'))
+            env.set('MPIF77', os.path.join(self.prefix.bin, 'mpipgifort'))
+            env.set('MPIF90', os.path.join(self.prefix.bin, 'mpipgifort'))
+        else:
+            env.set('MPICC', os.path.join(self.prefix.bin, 'mpicc'))
+            env.set('MPICXX', os.path.join(self.prefix.bin, 'mpic++'))
+            env.set('MPIF77', os.path.join(self.prefix.bin, 'mpif77'))
+            env.set('MPIF90', os.path.join(self.prefix.bin, 'mpif90'))