Merge pull request #1059 from epfl-scitas/packages/mpi_wrappers_with_rpath

MPI : have wrappers set RPATH instead of RUNPATH
This commit is contained in:
Todd Gamblin 2016-06-20 10:47:24 -07:00 committed by GitHub
commit cec283f608
3 changed files with 85 additions and 92 deletions

View File

@ -23,15 +23,14 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
from spack import * from spack import *
import os
class Mpich(Package): class Mpich(Package):
"""MPICH is a high performance and widely portable implementation of """MPICH is a high performance and widely portable implementation of
the Message Passing Interface (MPI) standard.""" the Message Passing Interface (MPI) standard."""
homepage = "http://www.mpich.org" homepage = "http://www.mpich.org"
url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz" 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_url = "http://www.mpich.org/static/downloads/"
list_depth = 2 list_depth = 2
version('3.2', 'f414cfa77099cd1fa1a5ae4e22db508a') version('3.2', 'f414cfa77099cd1fa1a5ae4e22db508a')
@ -42,7 +41,8 @@ class Mpich(Package):
version('3.1', '5643dd176499bfb7d25079aaff25f2ec') version('3.1', '5643dd176499bfb7d25079aaff25f2ec')
version('3.0.4', '9c5d5d4fe1e17dd12153f40bc5b6dbc0') 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('pmi', default=True, description='Build with PMI support')
variant('hydra', default=True, description='Build the hydra process manager') variant('hydra', default=True, description='Build the hydra process manager')
@ -57,9 +57,9 @@ def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
spack_env.set('MPICH_FC', spack_fc) spack_env.set('MPICH_FC', spack_fc)
def setup_dependent_package(self, module, dep_spec): 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.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') self.spec.mpif77 = join_path(self.prefix.bin, 'mpif77')
def install(self, spec, prefix): def install(self, spec, prefix):
@ -92,7 +92,6 @@ def install(self, spec, prefix):
self.filter_compilers() self.filter_compilers()
def filter_compilers(self): def filter_compilers(self):
"""Run after install to make the MPI compilers use the """Run after install to make the MPI compilers use the
compilers that Spack built the package with. compilers that Spack built the package with.
@ -102,18 +101,20 @@ def filter_compilers(self):
be bound to whatever compiler they were built with. be bound to whatever compiler they were built with.
""" """
bin = self.prefix.bin bin = self.prefix.bin
mpicc = os.path.join(bin, 'mpicc') mpicc = join_path(bin, 'mpicc')
mpicxx = os.path.join(bin, 'mpicxx') mpicxx = join_path(bin, 'mpicxx')
mpif77 = os.path.join(bin, 'mpif77') mpif77 = join_path(bin, 'mpif77')
mpif90 = os.path.join(bin, 'mpif90') mpif90 = join_path(bin, 'mpif90')
spack_cc = os.environ['CC'] # Substitute Spack compile wrappers for the real
spack_cxx = os.environ['CXX'] # underlying compiler
spack_f77 = os.environ['F77'] kwargs = {'ignore_absent': True, 'backup': False, 'string': True}
spack_fc = os.environ['FC'] 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)
kwargs = { 'ignore_absent' : True, 'backup' : False, 'string' : True } # Remove this linking flag if present
filter_file('CC="%s"' % spack_cc , 'CC="%s"' % self.compiler.cc, mpicc, **kwargs) # (it turns RPATH into RUNPATH)
filter_file('CXX="%s"'% spack_cxx, 'CXX="%s"' % self.compiler.cxx, mpicxx, **kwargs) for wrapper in (mpicc, mpicxx, mpif77, mpif90):
filter_file('F77="%s"'% spack_f77, 'F77="%s"' % self.compiler.f77, mpif77, **kwargs) filter_file('-Wl,--enable-new-dtags', '', wrapper, **kwargs)
filter_file('FC="%s"' % spack_fc , 'FC="%s"' % self.compiler.fc, mpif90, **kwargs)

View File

@ -23,7 +23,6 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
from spack import * from spack import *
import os
class Mvapich2(Package): class Mvapich2(Package):
@ -245,27 +244,20 @@ def filter_compilers(self):
be bound to whatever compiler they were built with. be bound to whatever compiler they were built with.
""" """
bin = self.prefix.bin bin = self.prefix.bin
mpicc = os.path.join(bin, 'mpicc') mpicc = join_path(bin, 'mpicc')
mpicxx = os.path.join(bin, 'mpicxx') mpicxx = join_path(bin, 'mpicxx')
mpif77 = os.path.join(bin, 'mpif77') mpif77 = join_path(bin, 'mpif77')
mpif90 = os.path.join(bin, 'mpif90') mpif90 = join_path(bin, 'mpif90')
spack_cc = os.environ['CC'] # Substitute Spack compile wrappers for the real
spack_cxx = os.environ['CXX'] # underlying compiler
spack_f77 = os.environ['F77'] kwargs = {'ignore_absent': True, 'backup': False, 'string': True}
spack_fc = os.environ['FC'] 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)
kwargs = { # Remove this linking flag if present
'ignore_absent': True, # (it turns RPATH into RUNPATH)
'backup': False, for wrapper in (mpicc, mpicxx, mpif77, mpif90):
'string': True filter_file('-Wl,--enable-new-dtags', '', wrapper, **kwargs)
}
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)

View File

@ -73,20 +73,27 @@ class Openmpi(Package):
patch('configure.patch', when="@1.10.0:1.10.1") patch('configure.patch', when="@1.10.0:1.10.1")
variant('psm', default=False, description='Build support for the PSM library.') variant('psm', default=False, description='Build support for the PSM library.')
variant('psm2', default=False, description='Build support for the Intel PSM2 library.') variant('psm2', default=False,
variant('pmi', default=False, description='Build support for PMI-based launchers') description='Build support for the Intel PSM2 library.')
variant('verbs', default=_verbs_dir() is not None, description='Build support for OpenFabrics verbs.') 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('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 # TODO : variant support for alps, loadleveler is missing
variant('tm', default=False, description='Build TM (Torque, PBSPro, and compatible) support') variant('tm', default=False,
variant('slurm', default=False, description='Build SLURM scheduler component') 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('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 # TODO : support for CUDA is missing
@ -97,8 +104,7 @@ class Openmpi(Package):
depends_on('sqlite', when='+sqlite3') depends_on('sqlite', when='+sqlite3')
def url_for_version(self, version): 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): def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
spack_env.set('OMPI_CC', spack_cc) spack_env.set('OMPI_CC', spack_cc)
@ -107,14 +113,15 @@ def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
spack_env.set('OMPI_F77', spack_f77) spack_env.set('OMPI_F77', spack_f77)
def setup_dependent_package(self, module, dep_spec): 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.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') self.spec.mpif77 = join_path(self.prefix.bin, 'mpif77')
@property @property
def verbs(self): 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'): if self.spec.satisfies('@:1.6'):
return 'openib' return 'openib'
# In version 1.7, it was renamed to be --with-verbs # In version 1.7, it was renamed to be --with-verbs
@ -143,7 +150,7 @@ def install(self, spec, prefix):
'--with-psm2' if '+psm2' in spec else '--without-psm2', '--with-psm2' if '+psm2' in spec else '--without-psm2',
'--with-mxm' if '+mxm' in spec else '--without-mxm', '--with-mxm' if '+mxm' in spec else '--without-mxm',
# Other options # 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-pmi' if '+pmi' in spec else '--without-pmi',
'--with-sqlite3' if '+sqlite3' in spec else '--without-sqlite3', '--with-sqlite3' if '+sqlite3' in spec else '--without-sqlite3',
'--enable-vt' if '+vt' in spec else '--disable-vt' '--enable-vt' if '+vt' in spec else '--disable-vt'
@ -161,7 +168,7 @@ def install(self, spec, prefix):
# use this for LANL builds, but for LLNL builds, we need: # use this for LANL builds, but for LLNL builds, we need:
# "--with-platform=contrib/platform/llnl/optimized" # "--with-platform=contrib/platform/llnl/optimized"
if self.version == ver("1.6.5") and '+lanl' in spec: 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: if not self.compiler.f77 and not self.compiler.fc:
config_args.append("--enable-mpi-fortran=no") config_args.append("--enable-mpi-fortran=no")
@ -181,40 +188,33 @@ def filter_compilers(self):
be bound to whatever compiler they were built with. be bound to whatever compiler they were built with.
""" """
kwargs = {'ignore_absent': True, 'backup': False, 'string': False} kwargs = {'ignore_absent': True, 'backup': False, 'string': False}
dir = os.path.join(self.prefix, 'share/openmpi/') wrapper_basepath = join_path(self.prefix, 'share', 'openmpi')
cc_wrappers = ['mpicc-vt-wrapper-data.txt', 'mpicc-wrapper-data.txt', wrappers = [
'ortecc-wrapper-data.txt', 'shmemcc-wrapper-data.txt'] ('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)
]
cxx_wrappers = ['mpic++-vt-wrapper-data.txt', 'mpic++-wrapper-data.txt', for wrapper_name, compiler in wrappers:
'ortec++-wrapper-data.txt'] wrapper = join_path(wrapper_basepath, wrapper_name)
if not os.path.islink(wrapper):
fc_wrappers = ['mpifort-vt-wrapper-data.txt', # Substitute Spack compile wrappers for the real
'mpifort-wrapper-data.txt', 'shmemfort-wrapper-data.txt'] # underlying compiler
match = 'compiler=.*'
for wrapper in cc_wrappers: substitute = 'compiler={compiler}'.format(compiler=compiler)
filter_file('compiler=.*', 'compiler=%s' % self.compiler.cc, filter_file(match, substitute, wrapper, **kwargs)
os.path.join(dir, wrapper), **kwargs) # Remove this linking flag if present
# (it turns RPATH into RUNPATH)
for wrapper in cxx_wrappers: filter_file('-Wl,--enable-new-dtags', '', wrapper, **kwargs)
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)