Repository: spack/spack

Issue:
OpenMPI should not enable PMI by default
I'm building OpenMPI on my OS X laptop. This now fails with:

```
checking if user requested PMI support... yes
checking if PMI support can be built... no
configure: WARNING: PMI support requested (via --with-pmi) but neither pmi.h
configure: WARNING: nor pmi2.h were found under locations:
configure: WARNING:     /usr
configure: WARNING:     /usr/slurm
configure: WARNING: Specified path: yes
configure: WARNING: OR neither libpmi nor libpmi2 were found under:
configure: WARNING:     /usr/lib
configure: WARNING:     /usr/lib64
configure: WARNING: Specified path: 
configure: error: Aborting
```

Apparently PMI requires certain system libraries that are not present on OS X. Could you disable PMI by default?

Alternatively, you could autodetect whether PMI (or InfiniBand) are present, and enable them by default only if that's the case.



Discussion:

Resolving patch:
diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py
--- a/var/spack/repos/builtin/packages/openmpi/package.py
+++ b/var/spack/repos/builtin/packages/openmpi/package.py
@@ -1,6 +1,8 @@
-from spack import *
 import os
 
+from spack import *
+
+
 class Openmpi(Package):
     """Open MPI is a project combining technologies and resources from
        several other projects (FT-MPI, LA-MPI, LAM/MPI, and PACX-MPI)
@@ -26,17 +28,26 @@ 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('pmi', default=True, description='Build support for PMI-based launchers')
+    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=False, 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 other schedulers is missing
+    # 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('sqlite3', default=False, description='Build sqlite3 support')
+
+    # TODO : support for CUDA is missing
 
     provides('mpi@:2.2', when='@1.6.5')
     provides('mpi@:3.0', when='@1.7.5:')
 
     depends_on('hwloc')
-
+    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)
@@ -54,30 +65,35 @@ def setup_dependent_package(self, module, dep_spec):
         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
+        if self.spec.satisfies('@:1.6'):
+            return 'openib'
+        # In version 1.7, it was renamed to be --with-verbs
+        elif self.spec.satisfies('@1.7:'):
+            return 'verbs'
 
     def install(self, spec, prefix):
         config_args = ["--prefix=%s" % prefix,
                        "--with-hwloc=%s" % spec['hwloc'].prefix,
                        "--enable-shared",
                        "--enable-static"]
-
-        # Variants
-        if '+tm' in spec:
-            config_args.append("--with-tm")  # necessary for Torque support
-
-        if '+psm' in spec:
-            config_args.append("--with-psm")
-
-        if '+pmi' in spec:
-            config_args.append("--with-pmi") #TODO: let user specify directory when possible
-
-        if '+verbs' in spec:
-            # Up through version 1.6, this option was previously named --with-openib
-            if spec.satisfies('@:1.6'):
-                config_args.append("--with-openib")
-            # In version 1.7, it was renamed to be --with-verbs
-            elif spec.satisfies('@1.7:'):
-                config_args.append("--with-verbs")
+        # Variant based arguments
+        config_args.extend([
+            # 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-%s' % self.verbs) if '+verbs' in spec else ('--without-%s' % self.verbs),
+            '--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'
+        ])
 
         # TODO: use variants for this, e.g. +lanl, +llnl, etc.
         # use this for LANL builds, but for LLNL builds, we need:
@@ -85,9 +101,6 @@ def install(self, spec, prefix):
         if self.version == ver("1.6.5") and '+lanl' in spec:
             config_args.append("--with-platform=contrib/platform/lanl/tlcc2/optimized-nopanasas")
 
-        # TODO: Spack should make it so that you can't actually find
-        # these compilers if they're "disabled" for the current
-        # compiler configuration.
         if not self.compiler.f77 and not self.compiler.fc:
             config_args.append("--enable-mpi-fortran=no")
 


Test patch: