summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2016-06-20 10:47:24 -0700
committerGitHub <noreply@github.com>2016-06-20 10:47:24 -0700
commitcec283f6087f08ec3991edb1ccc41fd30965296f (patch)
tree20279acc48beb056dc7f8c86c2a81e7cfa82653e
parentc2d087092469ca685c237e060ba43e17550d6739 (diff)
parentdaa46105a71f99946b26e1fa9836f0bb27897ceb (diff)
downloadspack-cec283f6087f08ec3991edb1ccc41fd30965296f.tar.gz
spack-cec283f6087f08ec3991edb1ccc41fd30965296f.tar.bz2
spack-cec283f6087f08ec3991edb1ccc41fd30965296f.tar.xz
spack-cec283f6087f08ec3991edb1ccc41fd30965296f.zip
Merge pull request #1059 from epfl-scitas/packages/mpi_wrappers_with_rpath
MPI : have wrappers set RPATH instead of RUNPATH
-rw-r--r--var/spack/repos/builtin/packages/mpich/package.py45
-rw-r--r--var/spack/repos/builtin/packages/mvapich2/package.py42
-rw-r--r--var/spack/repos/builtin/packages/openmpi/package.py102
3 files changed, 91 insertions, 98 deletions
diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py
index 164d9db541..ea1844aea0 100644
--- a/var/spack/repos/builtin/packages/mpich/package.py
+++ b/var/spack/repos/builtin/packages/mpich/package.py
@@ -23,15 +23,14 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
-import os
class Mpich(Package):
"""MPICH is a high performance and widely portable implementation of
the Message Passing Interface (MPI) standard."""
homepage = "http://www.mpich.org"
- url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz"
- list_url = "http://www.mpich.org/static/downloads/"
+ url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz"
+ list_url = "http://www.mpich.org/static/downloads/"
list_depth = 2
version('3.2', 'f414cfa77099cd1fa1a5ae4e22db508a')
@@ -42,7 +41,8 @@ class Mpich(Package):
version('3.1', '5643dd176499bfb7d25079aaff25f2ec')
version('3.0.4', '9c5d5d4fe1e17dd12153f40bc5b6dbc0')
- variant('verbs', default=False, description='Build support for OpenFabrics verbs.')
+ variant('verbs', default=False,
+ description='Build support for OpenFabrics verbs.')
variant('pmi', default=True, description='Build with PMI support')
variant('hydra', default=True, description='Build the hydra process manager')
@@ -57,9 +57,9 @@ class Mpich(Package):
spack_env.set('MPICH_FC', spack_fc)
def setup_dependent_package(self, module, dep_spec):
- self.spec.mpicc = join_path(self.prefix.bin, 'mpicc')
+ self.spec.mpicc = join_path(self.prefix.bin, 'mpicc')
self.spec.mpicxx = join_path(self.prefix.bin, 'mpic++')
- self.spec.mpifc = join_path(self.prefix.bin, 'mpif90')
+ self.spec.mpifc = join_path(self.prefix.bin, 'mpif90')
self.spec.mpif77 = join_path(self.prefix.bin, 'mpif77')
def install(self, spec, prefix):
@@ -92,7 +92,6 @@ class Mpich(Package):
self.filter_compilers()
-
def filter_compilers(self):
"""Run after install to make the MPI compilers use the
compilers that Spack built the package with.
@@ -102,18 +101,20 @@ class Mpich(Package):
be bound to whatever compiler they were built with.
"""
bin = self.prefix.bin
- mpicc = os.path.join(bin, 'mpicc')
- mpicxx = os.path.join(bin, 'mpicxx')
- mpif77 = os.path.join(bin, 'mpif77')
- mpif90 = os.path.join(bin, 'mpif90')
-
- spack_cc = os.environ['CC']
- spack_cxx = os.environ['CXX']
- spack_f77 = os.environ['F77']
- spack_fc = os.environ['FC']
-
- kwargs = { 'ignore_absent' : True, 'backup' : False, 'string' : True }
- filter_file('CC="%s"' % spack_cc , 'CC="%s"' % self.compiler.cc, mpicc, **kwargs)
- filter_file('CXX="%s"'% spack_cxx, 'CXX="%s"' % self.compiler.cxx, mpicxx, **kwargs)
- filter_file('F77="%s"'% spack_f77, 'F77="%s"' % self.compiler.f77, mpif77, **kwargs)
- filter_file('FC="%s"' % spack_fc , 'FC="%s"' % self.compiler.fc, mpif90, **kwargs)
+ mpicc = join_path(bin, 'mpicc')
+ mpicxx = join_path(bin, 'mpicxx')
+ mpif77 = join_path(bin, 'mpif77')
+ mpif90 = join_path(bin, 'mpif90')
+
+ # Substitute Spack compile wrappers for the real
+ # underlying compiler
+ kwargs = {'ignore_absent': True, 'backup': False, 'string': True}
+ filter_file(env['CC'], self.compiler.cc, mpicc, **kwargs)
+ filter_file(env['CXX'], self.compiler.cxx, mpicxx, **kwargs)
+ filter_file(env['F77'], self.compiler.f77, mpif77, **kwargs)
+ filter_file(env['FC'], self.compiler.fc, mpif90, **kwargs)
+
+ # Remove this linking flag if present
+ # (it turns RPATH into RUNPATH)
+ for wrapper in (mpicc, mpicxx, mpif77, mpif90):
+ filter_file('-Wl,--enable-new-dtags', '', wrapper, **kwargs)
diff --git a/var/spack/repos/builtin/packages/mvapich2/package.py b/var/spack/repos/builtin/packages/mvapich2/package.py
index d1944023d1..34bace10d6 100644
--- a/var/spack/repos/builtin/packages/mvapich2/package.py
+++ b/var/spack/repos/builtin/packages/mvapich2/package.py
@@ -23,7 +23,6 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
-import os
class Mvapich2(Package):
@@ -245,27 +244,20 @@ class Mvapich2(Package):
be bound to whatever compiler they were built with.
"""
bin = self.prefix.bin
- mpicc = os.path.join(bin, 'mpicc')
- mpicxx = os.path.join(bin, 'mpicxx')
- mpif77 = os.path.join(bin, 'mpif77')
- mpif90 = os.path.join(bin, 'mpif90')
-
- spack_cc = os.environ['CC']
- spack_cxx = os.environ['CXX']
- spack_f77 = os.environ['F77']
- spack_fc = os.environ['FC']
-
- kwargs = {
- 'ignore_absent': True,
- 'backup': False,
- 'string': True
- }
-
- filter_file('CC="%s"' % spack_cc,
- 'CC="%s"' % self.compiler.cc, mpicc, **kwargs)
- filter_file('CXX="%s"' % spack_cxx,
- 'CXX="%s"' % self.compiler.cxx, mpicxx, **kwargs)
- filter_file('F77="%s"' % spack_f77,
- 'F77="%s"' % self.compiler.f77, mpif77, **kwargs)
- filter_file('FC="%s"' % spack_fc,
- 'FC="%s"' % self.compiler.fc, mpif90, **kwargs)
+ mpicc = join_path(bin, 'mpicc')
+ mpicxx = join_path(bin, 'mpicxx')
+ mpif77 = join_path(bin, 'mpif77')
+ mpif90 = join_path(bin, 'mpif90')
+
+ # Substitute Spack compile wrappers for the real
+ # underlying compiler
+ kwargs = {'ignore_absent': True, 'backup': False, 'string': True}
+ filter_file(env['CC'], self.compiler.cc, mpicc, **kwargs)
+ filter_file(env['CXX'], self.compiler.cxx, mpicxx, **kwargs)
+ filter_file(env['F77'], self.compiler.f77, mpif77, **kwargs)
+ filter_file(env['FC'], self.compiler.fc, mpif90, **kwargs)
+
+ # Remove this linking flag if present
+ # (it turns RPATH into RUNPATH)
+ for wrapper in (mpicc, mpicxx, mpif77, mpif90):
+ filter_file('-Wl,--enable-new-dtags', '', wrapper, **kwargs)
diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py
index 648910d08f..695fb82f62 100644
--- a/var/spack/repos/builtin/packages/openmpi/package.py
+++ b/var/spack/repos/builtin/packages/openmpi/package.py
@@ -73,20 +73,27 @@ class Openmpi(Package):
patch('configure.patch', when="@1.10.0:1.10.1")
variant('psm', default=False, description='Build support for the PSM library.')
- variant('psm2', default=False, description='Build support for the Intel PSM2 library.')
- variant('pmi', default=False, description='Build support for PMI-based launchers')
- variant('verbs', default=_verbs_dir() is not None, description='Build support for OpenFabrics verbs.')
+ variant('psm2', default=False,
+ description='Build support for the Intel PSM2 library.')
+ variant('pmi', default=False,
+ description='Build support for PMI-based launchers')
+ variant('verbs', default=_verbs_dir() is not None,
+ description='Build support for OpenFabrics verbs.')
variant('mxm', default=False, description='Build Mellanox Messaging support')
- variant('thread_multiple', default=False, description='Enable MPI_THREAD_MULTIPLE support')
+ variant('thread_multiple', default=False,
+ description='Enable MPI_THREAD_MULTIPLE support')
# TODO : variant support for alps, loadleveler is missing
- variant('tm', default=False, description='Build TM (Torque, PBSPro, and compatible) support')
- variant('slurm', default=False, description='Build SLURM scheduler component')
+ variant('tm', default=False,
+ description='Build TM (Torque, PBSPro, and compatible) support')
+ variant('slurm', default=False,
+ description='Build SLURM scheduler component')
variant('sqlite3', default=False, description='Build sqlite3 support')
- variant('vt', default=True, description='Build support for contributed package vt')
+ variant('vt', default=True,
+ description='Build support for contributed package vt')
# TODO : support for CUDA is missing
@@ -97,8 +104,7 @@ class Openmpi(Package):
depends_on('sqlite', when='+sqlite3')
def url_for_version(self, version):
- return "http://www.open-mpi.org/software/ompi/v%s/downloads/openmpi-%s.tar.bz2" % (version.up_to(2), version)
-
+ return "http://www.open-mpi.org/software/ompi/v%s/downloads/openmpi-%s.tar.bz2" % (version.up_to(2), version) # NOQA: ignore=E501
def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
spack_env.set('OMPI_CC', spack_cc)
@@ -107,14 +113,15 @@ class Openmpi(Package):
spack_env.set('OMPI_F77', spack_f77)
def setup_dependent_package(self, module, dep_spec):
- self.spec.mpicc = join_path(self.prefix.bin, 'mpicc')
+ self.spec.mpicc = join_path(self.prefix.bin, 'mpicc')
self.spec.mpicxx = join_path(self.prefix.bin, 'mpic++')
- self.spec.mpifc = join_path(self.prefix.bin, 'mpif90')
+ self.spec.mpifc = join_path(self.prefix.bin, 'mpif90')
self.spec.mpif77 = join_path(self.prefix.bin, 'mpif77')
@property
def verbs(self):
- # Up through version 1.6, this option was previously named --with-openib
+ # Up through version 1.6, this option was previously named
+ # --with-openib
if self.spec.satisfies('@:1.6'):
return 'openib'
# In version 1.7, it was renamed to be --with-verbs
@@ -143,7 +150,7 @@ class Openmpi(Package):
'--with-psm2' if '+psm2' in spec else '--without-psm2',
'--with-mxm' if '+mxm' in spec else '--without-mxm',
# Other options
- '--enable-mpi-thread-multiple' if '+thread_multiple' in spec else '--disable-mpi-thread-multiple',
+ '--enable-mpi-thread-multiple' if '+thread_multiple' in spec else '--disable-mpi-thread-multiple', # NOQA: ignore=E501
'--with-pmi' if '+pmi' in spec else '--without-pmi',
'--with-sqlite3' if '+sqlite3' in spec else '--without-sqlite3',
'--enable-vt' if '+vt' in spec else '--disable-vt'
@@ -161,7 +168,7 @@ class Openmpi(Package):
# use this for LANL builds, but for LLNL builds, we need:
# "--with-platform=contrib/platform/llnl/optimized"
if self.version == ver("1.6.5") and '+lanl' in spec:
- config_args.append("--with-platform=contrib/platform/lanl/tlcc2/optimized-nopanasas")
+ config_args.append("--with-platform=contrib/platform/lanl/tlcc2/optimized-nopanasas") # NOQA: ignore=E501
if not self.compiler.f77 and not self.compiler.fc:
config_args.append("--enable-mpi-fortran=no")
@@ -181,40 +188,33 @@ class Openmpi(Package):
be bound to whatever compiler they were built with.
"""
kwargs = {'ignore_absent': True, 'backup': False, 'string': False}
- dir = os.path.join(self.prefix, 'share/openmpi/')
-
- cc_wrappers = ['mpicc-vt-wrapper-data.txt', 'mpicc-wrapper-data.txt',
- 'ortecc-wrapper-data.txt', 'shmemcc-wrapper-data.txt']
-
- cxx_wrappers = ['mpic++-vt-wrapper-data.txt', 'mpic++-wrapper-data.txt',
- 'ortec++-wrapper-data.txt']
-
- fc_wrappers = ['mpifort-vt-wrapper-data.txt',
- 'mpifort-wrapper-data.txt', 'shmemfort-wrapper-data.txt']
-
- for wrapper in cc_wrappers:
- filter_file('compiler=.*', 'compiler=%s' % self.compiler.cc,
- os.path.join(dir, wrapper), **kwargs)
-
- for wrapper in cxx_wrappers:
- filter_file('compiler=.*', 'compiler=%s' % self.compiler.cxx,
- os.path.join(dir, wrapper), **kwargs)
-
- for wrapper in fc_wrappers:
- filter_file('compiler=.*', 'compiler=%s' % self.compiler.fc,
- os.path.join(dir, wrapper), **kwargs)
-
- # These are symlinks in newer versions, so check that here
- f77_wrappers = ['mpif77-vt-wrapper-data.txt', 'mpif77-wrapper-data.txt']
- f90_wrappers = ['mpif90-vt-wrapper-data.txt', 'mpif90-wrapper-data.txt']
-
- for wrapper in f77_wrappers:
- path = os.path.join(dir, wrapper)
- if not os.path.islink(path):
- filter_file('compiler=.*', 'compiler=%s' % self.compiler.f77,
- path, **kwargs)
- for wrapper in f90_wrappers:
- path = os.path.join(dir, wrapper)
- if not os.path.islink(path):
- filter_file('compiler=.*', 'compiler=%s' % self.compiler.fc,
- path, **kwargs)
+ wrapper_basepath = join_path(self.prefix, 'share', 'openmpi')
+
+ wrappers = [
+ ('mpicc-vt-wrapper-data.txt', self.compiler.cc),
+ ('mpicc-wrapper-data.txt', self.compiler.cc),
+ ('ortecc-wrapper-data.txt', self.compiler.cc),
+ ('shmemcc-wrapper-data.txt', self.compiler.cc),
+ ('mpic++-vt-wrapper-data.txt', self.compiler.cxx),
+ ('mpic++-wrapper-data.txt', self.compiler.cxx),
+ ('ortec++-wrapper-data.txt', self.compiler.cxx),
+ ('mpifort-vt-wrapper-data.txt', self.compiler.fc),
+ ('mpifort-wrapper-data.txt', self.compiler.fc),
+ ('shmemfort-wrapper-data.txt', self.compiler.fc),
+ ('mpif90-vt-wrapper-data.txt', self.compiler.fc),
+ ('mpif90-wrapper-data.txt', self.compiler.fc),
+ ('mpif77-vt-wrapper-data.txt', self.compiler.f77),
+ ('mpif77-wrapper-data.txt', self.compiler.f77)
+ ]
+
+ for wrapper_name, compiler in wrappers:
+ wrapper = join_path(wrapper_basepath, wrapper_name)
+ if not os.path.islink(wrapper):
+ # Substitute Spack compile wrappers for the real
+ # underlying compiler
+ match = 'compiler=.*'
+ substitute = 'compiler={compiler}'.format(compiler=compiler)
+ filter_file(match, substitute, wrapper, **kwargs)
+ # Remove this linking flag if present
+ # (it turns RPATH into RUNPATH)
+ filter_file('-Wl,--enable-new-dtags', '', wrapper, **kwargs)