mvapich2: Adding external find support. (#18177)

* Adding external support for mvapich2.

This picks up all the options that are currently settable by
the spack package. It also detects the compiler and sets it
appropriately.

* Removing debugging printing.

* Adding changes suggested by @nithintsk
This commit is contained in:
Robert Blake 2020-08-24 18:53:42 -07:00 committed by GitHub
parent b885dbcd85
commit 5e1909c00a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -3,6 +3,7 @@
# #
# SPDX-License-Identifier: (Apache-2.0 OR MIT) # SPDX-License-Identifier: (Apache-2.0 OR MIT)
import re
import os.path import os.path
import sys import sys
@ -18,6 +19,8 @@ class Mvapich2(AutotoolsPackage):
maintainers = ['nithintsk', 'harisubramoni'] maintainers = ['nithintsk', 'harisubramoni']
executables = ['^mpiname$']
# Prefer the latest stable release # Prefer the latest stable release
version('2.3.4', sha256='7226a45c7c98333c8e5d2888119cce186199b430c13b7b1dca1769909e68ea7a') version('2.3.4', sha256='7226a45c7c98333c8e5d2888119cce186199b430c13b7b1dca1769909e68ea7a')
version('2.3.3', sha256='41d3261be57e5bc8aabf4e32981543c015c5443ff032a26f18205985e18c2b73') version('2.3.3', sha256='41d3261be57e5bc8aabf4e32981543c015c5443ff032a26f18205985e18c2b73')
@ -122,6 +125,107 @@ class Mvapich2(AutotoolsPackage):
'mpicc', 'mpicxx', 'mpif77', 'mpif90', 'mpifort', relative_root='bin' 'mpicc', 'mpicxx', 'mpif77', 'mpif90', 'mpifort', relative_root='bin'
) )
@classmethod
def determine_version(cls, exe):
output = Executable(exe)('-a', output=str, error=str)
match = re.search(r'^MVAPICH2 (\S+)', output)
return match.group(1) if match else None
@classmethod
def determine_variants(cls, exes, version):
def get_spack_compiler_spec(path):
spack_compilers = spack.compilers.find_compilers([path])
for spack_compiler in spack_compilers:
if os.path.dirname(spack_compiler.cc) == path:
return spack_compiler.spec
return None
results = []
for exe in exes:
variants = ''
output = Executable(exe)('-a', output=str, error=str)
if re.search(r'--enable-wrapper-rpath=yes', output):
variants += '+wrapperrpath'
else:
variants += '~wrapperrpath'
if (re.search(r'--disable-fast', output)
and re.search(r'--enable-error-checking=runtime', output)
and re.search(r'--enable-error-messages', output)
and re.search(r'--enable-g', output)
and re.search(r'--enable-debuginfo', output)):
variants += '+debug'
else:
variants += '~debug'
if re.search('--enable-cuda', output):
variants += '+cuda'
else:
variants += '~cuda'
if re.search('--enable-registration-cache', output):
variants += '+regcache'
else:
variants += '~regcache'
match = re.search(r'--enable-threads=(\S+)', output)
if match:
variants += " threads=" + match.group(1)
match = re.search(r'--with-ch3-rank-bits=(\S+)', output)
if match:
variants += " ch3_rank_bits=" + match.group(1)
pms = []
if re.search(r'--with-pm=slurm', output):
pms.append('slurm')
if re.search(r'--with-pm=[A-Za-z0-9:]*hydra', output):
pms.append('hydra')
if re.search(r'--with-pm=[A-Za-z0-9:]*gforker', output):
pms.append('gforker')
if re.search(r'--with-pm=[A-Za-z0-9:]*remshell', output):
pms.append('remshell')
if pms:
variants += " process_managers=" + ",".join(pms)
fabrics = {
'sock': 'ch3:sock',
'nemesistcpib': 'ch3:nemesis:tcp,ib',
'nemesisibtcp': 'ch3:nemesis:ib,tcp',
'nemesisib': 'ch3:nemesis:ib',
'nemesis': 'ch3:nemesis',
'mrail': 'ch3:mrail',
'nemesisofi': 'ch3:nemesis:ofi',
}
for fabric_name, conf_flag in fabrics.items():
if re.search(r'--with-device=' + conf_flag, output):
variants += ' fabrics=' + fabric_name
break
else:
if re.search(r'--with-device=psm', output):
if re.search(r'--with-psm=', output):
variants += ' fabrics=psm'
elif re.search(r'--with-psm2=', output):
variants += ' fabrics=psm2'
used_fs = []
for fs in ('lustre', 'gpfs', 'nfs', 'ufs'):
if re.search(
'--with-file-system=[a-zA-Z0-9+]*' + fs,
output):
used_fs.append(fs)
if used_fs:
variants += ' file_systems=' + ",".join(used_fs)
match = re.search(r'CC: (\S+)', output)
if match:
comp_spec = get_spack_compiler_spec(
os.path.dirname(match.group(1)))
if comp_spec:
variants += " %" + str(comp_spec)
results.append(variants)
return results
@property @property
def libs(self): def libs(self):
query_parameters = self.spec.last_query.extra_parameters query_parameters = self.spec.last_query.extra_parameters