diff options
Diffstat (limited to 'var/spack/repos/tutorial/packages/mpich/package.py')
-rw-r--r-- | var/spack/repos/tutorial/packages/mpich/package.py | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/var/spack/repos/tutorial/packages/mpich/package.py b/var/spack/repos/tutorial/packages/mpich/package.py new file mode 100644 index 0000000000..c3e0b8a54b --- /dev/null +++ b/var/spack/repos/tutorial/packages/mpich/package.py @@ -0,0 +1,155 @@ +# Copyright 2013-2018 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack import * +import os + + +class Mpich(AutotoolsPackage): + """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" + git = "https://github.com/pmodels/mpich.git" + list_url = "http://www.mpich.org/static/downloads/" + list_depth = 1 + + version('develop', submodules=True) + version('3.2.1', 'e175452f4d61646a52c73031683fc375') + version('3.2', 'f414cfa77099cd1fa1a5ae4e22db508a') + version('3.1.4', '2ab544607986486562e076b83937bba2') + version('3.1.3', '93cb17f91ac758cbf9174ecb03563778') + version('3.1.2', '7fbf4b81dcb74b07ae85939d1ceee7f1') + version('3.1.1', '40dc408b1e03cc36d80209baaa2d32b7') + version('3.1', '5643dd176499bfb7d25079aaff25f2ec') + version('3.0.4', '9c5d5d4fe1e17dd12153f40bc5b6dbc0') + + variant('hydra', default=True, description='Build the hydra process manager') + variant('pmi', default=True, description='Build with PMI support') + variant('romio', default=True, description='Enable ROMIO MPI I/O implementation') + variant('verbs', default=False, description='Build support for OpenFabrics verbs.') + variant( + 'device', + default='ch3', + description='''Abstract Device Interface (ADI) +implementation. The ch4 device is currently in experimental state''', + values=('ch3', 'ch4'), + multi=False + ) + variant( + 'netmod', + default='tcp', + description='''Network module. Only single netmod builds are +supported. For ch3 device configurations, this presumes the +ch3:nemesis communication channel. ch3:sock is not supported by this +spack package at this time.''', + values=('tcp', 'mxm', 'ofi', 'ucx'), + multi=False + ) + + provides('mpi') + provides('mpi@:3.0', when='@3:') + provides('mpi@:1.3', when='@1:') + + filter_compiler_wrappers( + 'mpicc', 'mpicxx', 'mpif77', 'mpif90', 'mpifort', relative_root='bin' + ) + + # fix MPI_Barrier segmentation fault + # see https://lists.mpich.org/pipermail/discuss/2016-May/004764.html + # and https://lists.mpich.org/pipermail/discuss/2016-June/004768.html + patch('mpich32_clang.patch', when='@3.2:3.2.0%clang') + + depends_on('findutils', type='build') + + depends_on('libfabric', when='netmod=ofi') + + conflicts('device=ch4', when='@:3.2') + conflicts('netmod=ofi', when='@:3.1.4') + conflicts('netmod=ucx', when='device=ch3') + conflicts('netmod=mxm', when='device=ch4') + conflicts('netmod=mxm', when='@:3.1.3') + conflicts('netmod=tcp', when='device=ch4') + + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): + # TUTORIAL: set the following variables for dependents: + # + # MPICC=join_path(self.prefix.bin, 'mpicc') + # MPICXX=join_path(self.prefix.bin, 'mpic++') + # MPIF77=join_path(self.prefix.bin, 'mpif77') + # MPIF90=join_path(self.prefix.bin, 'mpif90') + # MPICH_CC=spack_cc + # MPICH_CXX=spack_cxx + # MPICH_F77=spack_f77 + # MPICH_F90=spack_fc + # MPICH_FC=spack_fc + pass + + def setup_dependent_package(self, module, dependent_spec): + if 'platform=cray' in self.spec: + self.spec.mpicc = spack_cc + self.spec.mpicxx = spack_cxx + self.spec.mpifc = spack_fc + self.spec.mpif77 = spack_f77 + else: + 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.mpif77 = join_path(self.prefix.bin, 'mpif77') + + self.spec.mpicxx_shared_libs = [ + join_path(self.prefix.lib, 'libmpicxx.{0}'.format(dso_suffix)), + join_path(self.prefix.lib, 'libmpi.{0}'.format(dso_suffix)) + ] + + def autoreconf(self, spec, prefix): + """Not needed usually, configure should be already there""" + # If configure exists nothing needs to be done + if os.path.exists(self.configure_abs_path): + return + # Else bootstrap with autotools + bash = which('bash') + bash('./autogen.sh') + + @run_before('autoreconf') + def die_without_fortran(self): + # Until we can pass variants such as +fortran through virtual + # dependencies depends_on('mpi'), require Fortran compiler to + # avoid delayed build errors in dependents. + if (self.compiler.f77 is None) or (self.compiler.fc is None): + raise InstallError( + 'Mpich requires both C and Fortran compilers!' + ) + + def configure_args(self): + spec = self.spec + config_args = [ + '--enable-shared', + '--with-pm={0}'.format('hydra' if '+hydra' in spec else 'no'), + '--with-pmi={0}'.format('yes' if '+pmi' in spec else 'no'), + '--{0}-romio'.format('enable' if '+romio' in spec else 'disable'), + '--{0}-ibverbs'.format('with' if '+verbs' in spec else 'without') + ] + + # setup device configuration + device_config = '' + if 'device=ch4' in spec: + device_config = '--with-device=ch4:' + elif 'device=ch3' in spec: + device_config = '--with-device=ch3:nemesis:' + + if 'netmod=ucx' in spec: + device_config += 'ucx' + elif 'netmod=ofi' in spec: + device_config += 'ofi' + elif 'netmod=mxm' in spec: + device_config += 'mxm' + elif 'netmod=tcp' in spec: + device_config += 'tcp' + + config_args.append(device_config) + + return config_args |