diff options
Diffstat (limited to 'var')
-rw-r--r-- | var/spack/repos/builtin/packages/openmpi/package.py | 148 |
1 files changed, 93 insertions, 55 deletions
diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 72b9b8dbd2..754cc8d93e 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -22,15 +22,13 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import os from spack import * +import os def _verbs_dir(): - """ - Try to find the directory where the OpenFabrics verbs package is - installed. Return None if not found. - """ + """Try to find the directory where the OpenFabrics verbs package is + installed. Return None if not found.""" try: # Try to locate Verbs by looking for a utility in the path ibv_devices = which("ibv_devices") @@ -46,7 +44,7 @@ def _verbs_dir(): return None -class Openmpi(Package): +class Openmpi(AutotoolsPackage): """The Open MPI Project is an open source Message Passing Interface implementation that is developed and maintained by a consortium of academic, research, and industry partners. Open MPI is @@ -75,36 +73,38 @@ class Openmpi(Package): patch('llnl-platforms.patch', when="@1.6.5") patch('configure.patch', when="@1.10.0:1.10.1") - variant('psm', default=False, description='Build support for the PSM library.') + # Fabrics + variant('psm', default=False, description='Build support for the PSM library') variant('psm2', default=False, - description='Build support for the Intel PSM2 library.') + 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.') + 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') - - # TODO : variant support for alps, loadleveler is missing + # Schedulers + # TODO: support for alps and 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('sqlite3', default=False, description='Build sqlite3 support') - - variant('vt', default=True, - description='Build support for contributed package vt') + # Additional support options + variant('java', default=False, description='Build Java support') + variant('sqlite3', default=False, description='Build SQLite3 support') + variant('vt', default=True, description='Build VampirTrace support') + variant('thread_multiple', default=False, + description='Enable MPI_THREAD_MULTIPLE support') - # TODO : support for CUDA is missing + # TODO: support for CUDA is missing provides('mpi@:2.2', when='@1.6.5') provides('mpi@:3.0', when='@1.7.5:') provides('mpi@:3.1', when='@2.0.0:') depends_on('hwloc') + depends_on('jdk', when='+java') depends_on('sqlite', when='+sqlite3') def url_for_version(self, version): @@ -142,63 +142,101 @@ class Openmpi(Package): elif self.spec.satisfies('@1.7:'): return 'verbs' - def install(self, spec, prefix): + @AutotoolsPackage.precondition('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('OpenMPI requires both C and Fortran ', - 'compilers!') - - config_args = ["--prefix=%s" % prefix, - "--with-hwloc=%s" % spec['hwloc'].prefix, - "--enable-shared", - "--enable-static"] - - # for Open-MPI 2.0:, C++ bindings are disabled by default. - if self.spec.satisfies('@2.0:'): - config_args.extend(['--enable-mpi-cxx']) + raise InstallError( + 'OpenMPI requires both C and Fortran compilers!' + ) - if getattr(self, 'config_extra', None) is not None: - config_args.extend(self.config_extra) + def configure_args(self): + spec = self.spec - # Variant based arguments - config_args.extend([ + config_args = [ + '--enable-shared', + '--enable-static', + '--enable-mpi-cxx', # Schedulers '--with-tm' if '+tm' in spec else '--without-tm', '--with-slurm' if '+slurm' in spec else '--without-slurm', # Fabrics '--with-psm' if '+psm' in spec else '--without-psm', - '--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'), - '--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' - ]) + ] + + # Intel PSM2 support + if spec.satisfies('@1.10:'): + if '+psm2' in spec: + config_args.append('--with-psm2') + else: + config_args.append('--without-psm2') + + # PMI support + if spec.satisfies('@1.5.5:'): + if '+pmi' in spec: + config_args.append('--with-pmi') + else: + config_args.append('--without-pmi') + + # Mellanox Messaging support + if spec.satisfies('@1.5.4:'): + if '+mxm' in spec: + config_args.append('--with-mxm') + else: + config_args.append('--without-mxm') + + # OpenFabrics verbs support if '+verbs' in spec: path = _verbs_dir() if path is not None and path not in ('/usr', '/usr/local'): - config_args.append('--with-%s=%s' % (self.verbs, path)) + config_args.append('--with-{0}={1}'.format(self.verbs, path)) else: - config_args.append('--with-%s' % self.verbs) + config_args.append('--with-{0}'.format(self.verbs)) else: - config_args.append('--without-%s' % self.verbs) + config_args.append('--without-{0}'.format(self.verbs)) + + # Hwloc support + if spec.satisfies('@1.5.2:'): + config_args.append('--with-hwloc={0}'.format(spec['hwloc'].prefix)) + + # Java support + if spec.satisfies('@1.7.4:'): + if '+java' in spec: + config_args.extend([ + '--enable-java', + '--enable-mpi-java', + '--with-jdk-dir={0}'.format(spec['jdk'].prefix) + ]) + else: + config_args.extend([ + '--disable-java', + '--disable-mpi-java' + ]) + + # SQLite3 support + if spec.satisfies('@1.7.3:1.999'): + if '+sqlite3' in spec: + config_args.append('--with-sqlite3') + else: + config_args.append('--without-sqlite3') - # TODO: use variants for this, e.g. +lanl, +llnl, etc. - # 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") # NOQA: ignore=E501 + # VampirTrace support + if spec.satisfies('@1.3:1.999'): + if '+vt' not in spec: + config_args.append('--enable-contrib-no-build=vt') - configure(*config_args) - make() - make("install") + # Multithreading support + if spec.satisfies('@1.5.4:'): + if '+thread_multiple' in spec: + config_args.append('--enable-mpi-thread-multiple') + else: + config_args.append('--disable-mpi-thread-multiple') - self.filter_compilers() + return config_args + @AutotoolsPackage.sanity_check('install') def filter_compilers(self): """Run after install to make the MPI compilers use the compilers that Spack built the package with. |