Merge branch 'develop' into mplegendre-multi_pkgsrc_roots

Conflicts:
	lib/spack/spack/cmd/create.py
	lib/spack/spack/cmd/extensions.py
	lib/spack/spack/cmd/fetch.py
	lib/spack/spack/cmd/uninstall.py
	lib/spack/spack/config.py
	lib/spack/spack/database.py
	lib/spack/spack/directory_layout.py
	lib/spack/spack/packages.py
	lib/spack/spack/spec.py
This commit is contained in:
Todd Gamblin
2015-12-25 16:35:55 -08:00
303 changed files with 4025 additions and 809 deletions

View File

@@ -1,104 +1,184 @@
import os
from spack import *
import os
class Mvapich2(Package):
"""mvapich2 is an MPI implmenetation for infiniband networks."""
"""MVAPICH2 is an MPI implementation for Infiniband networks."""
homepage = "http://mvapich.cse.ohio-state.edu/"
version('2.2a', 'b8ceb4fc5f5a97add9b3ff1b9cbe39d2',
url='http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.2a.tar.gz')
version('2.0', '9fbb68a4111a8b6338e476dc657388b4',
url='http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.0.tar.gz')
version('1.9', '5dc58ed08fd3142c260b70fe297e127c',
url="http://mvapich.cse.ohio-state.edu/download/mvapich2/mv2/mvapich2-1.9.tgz")
patch('ad_lustre_rwcontig_open_source.patch', when='@1.9')
version('2.0', '9fbb68a4111a8b6338e476dc657388b4',
url='http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.0.tar.gz')
provides('mpi@:2.2', when='@1.9') # MVAPICH2-1.9 supports MPI 2.2
provides('mpi@:3.0', when='@2.0:') # MVAPICH2-2.0 supports MPI 3.0
provides('mpi@:2.2', when='@1.9') # MVAPICH2-1.9 supports MPI 2.2
provides('mpi@:3.0', when='@2.0') # MVAPICH2-2.0 supports MPI 3.0
variant('debug', default=False, description='Enables debug information and error messages at run-time')
##########
# TODO : Process managers should be grouped into the same variant, as soon as variant capabilities will be extended
# See https://groups.google.com/forum/#!topic/spack/F8-f8B4_0so
SLURM = 'slurm'
HYDRA = 'hydra'
GFORKER = 'gforker'
REMSHELL = 'remshell'
SLURM_INCOMPATIBLE_PMS = (HYDRA, GFORKER, REMSHELL)
variant(SLURM, default=False, description='Sets slurm as the only process manager')
variant(HYDRA, default=False, description='Sets hydra as one of the process managers')
variant(GFORKER, default=False, description='Sets gforker as one of the process managers')
variant(REMSHELL, default=False, description='Sets remshell as one of the process managers')
##########
##########
# TODO : Network types should be grouped into the same variant, as soon as variant capabilities will be extended
PSM = 'psm'
SOCK = 'sock'
NEMESISIBTCP = 'nemesisibtcp'
NEMESISIB = 'nemesisib'
NEMESIS = 'nemesis'
SUPPORTED_NETWORKS = (PSM, SOCK, NEMESIS, NEMESISIB, NEMESISIBTCP)
variant(PSM, default=False, description='Configures a build for QLogic PSM-CH3')
variant(SOCK, default=False, description='Configures a build for TCP/IP-CH3')
variant(NEMESISIBTCP, default=False, description='Configures a build for both OFA-IB-Nemesis and TCP/IP-Nemesis')
variant(NEMESISIB, default=False, description='Configures a build for OFA-IB-Nemesis')
variant(NEMESIS, default=False, description='Configures a build for TCP/IP-Nemesis')
##########
# FIXME : CUDA support is missing
@staticmethod
def enabled(x):
"""
Given a variant name returns the string that means the variant is enabled
:param x: variant name
:return:
"""
return '+' + x
def set_build_type(self, spec, configure_args):
"""
Appends to configure_args the flags that depends only on the build type (i.e. release or debug)
:param spec: spec
:param configure_args: list of current configure arguments
"""
if '+debug' in spec:
build_type_options = [
"--disable-fast",
"--enable-error-checking=runtime",
"--enable-error-messages=all",
"--enable-g=dbg", "--enable-debuginfo" # Permits debugging with TotalView
]
else:
build_type_options = ["--enable-fast=all"]
configure_args.extend(build_type_options)
def set_process_manager(self, spec, configure_args):
"""
Appends to configure_args the flags that will enable the appropriate process managers
:param spec: spec
:param configure_args: list of current configure arguments
"""
# Check that slurm variant is not activated together with other pm variants
has_slurm_incompatible_variants = any(self.enabled(x) in spec for x in Mvapich2.SLURM_INCOMPATIBLE_PMS)
if self.enabled(Mvapich2.SLURM) in spec and has_slurm_incompatible_variants:
raise RuntimeError(" %s : 'slurm' cannot be activated together with other process managers" % self.name)
process_manager_options = []
if self.enabled(Mvapich2.SLURM) in spec:
process_manager_options = [
"--with-pm=slurm"
]
elif has_slurm_incompatible_variants:
pms = []
# The variant name is equal to the process manager name in the configuration options
for x in Mvapich2.SLURM_INCOMPATIBLE_PMS:
if self.enabled(x) in spec:
pms.append(x)
process_manager_options = [
"--with-pm=%s" % ':'.join(pms)
]
configure_args.extend(process_manager_options)
def set_network_type(self, spec, configure_args):
# Check that at most one variant has been activated
count = 0
for x in Mvapich2.SUPPORTED_NETWORKS:
if self.enabled(x) in spec:
count += 1
if count > 1:
raise RuntimeError('network variants are mutually exclusive (only one can be selected at a time)')
# From here on I can suppose that ony one variant has been selected
if self.enabled(Mvapich2.PSM) in spec:
network_options = ["--with-device=ch3:psm"]
elif self.enabled(Mvapich2.SOCK) in spec:
network_options = ["--with-device=ch3:sock"]
elif self.enabled(Mvapich2.NEMESISIBTCP) in spec:
network_options = ["--with-device=ch3:nemesis:ib,tcp"]
elif self.enabled(Mvapich2.NEMESISIB) in spec:
network_options = ["--with-device=ch3:nemesis:ib"]
elif self.enabled(Mvapich2.NEMESIS) in spec:
network_options = ["--with-device=ch3:nemesis"]
else:
network_options = ["--with-device=ch3:mrail", "--with-rdma=gen2"]
configure_args.extend(network_options)
def install(self, spec, prefix):
# we'll set different configure flags depending on our environment
configure_args = []
# TODO: The MPICH*_FLAGS have a different name for 1.9
if '+debug' in spec:
# set configure flags for debug build
configure_args.append("--disable-fast")
configure_args.append("--enable-g=dbg")
configure_args.append("--enable-error-checking=runtime")
configure_args.append("--enable-error-messages=all")
configure_args.append("--enable-nmpi-as-mpi")
if "%gnu" in spec:
# set variables for GNU compilers
os.environ['MPICHLIB_CFLAGS'] = "-g -O0"
os.environ['MPICHLIB_CXXFLAGS'] = "-g -O0"
os.environ['MPICHLIB_FFLAGS'] = "-g -O0 -fno-second-underscore"
os.environ['MPICHLIB_F90FLAGS'] = "-g -O0 -fno-second-underscore"
elif "%intel" in spec:
# set variables for Inel compilers
os.environ['MPICHLIB_CFLAGS'] = "-g -O0"
os.environ['MPICHLIB_CXXFLAGS'] = "-g -O0"
os.environ['MPICHLIB_FFLAGS'] = "-g -O0"
os.environ['MPICHLIB_F90FLAGS'] = "-g -O0"
elif "%pgi" in spec:
# set variables for PGI compilers
os.environ['MPICHLIB_CFLAGS'] = "-g -O0 -fPIC"
os.environ['MPICHLIB_CXXFLAGS'] = "-g -O0 -fPIC"
os.environ['MPICHLIB_FFLAGS'] = "-g -O0 -fPIC"
os.environ['MPICHLIB_F90FLAGS'] = "-g -O0 -fPIC"
else:
# set configure flags for normal optimizations
configure_args.append("--enable-fast=all")
configure_args.append("--enable-g=dbg")
configure_args.append("--enable-nmpi-as-mpi")
if "%gnu" in spec:
# set variables for what compilers
os.environ['MPICHLIB_CFLAGS'] = "-g -O2"
os.environ['MPICHLIB_CXXFLAGS'] = "-g -O2"
os.environ['MPICHLIB_FFLAGS'] = "-g -O2 -fno-second-underscore"
os.environ['MPICHLIB_F90FLAGS'] = "-g -O2 -fno-second-underscore"
elif "%intel" in spec:
# set variables for Inel compilers
os.environ['MPICHLIB_CFLAGS'] = "-g -O2"
os.environ['MPICHLIB_CXXFLAGS'] = "-g -O2"
os.environ['MPICHLIB_FFLAGS'] = "-g -O2"
os.environ['MPICHLIB_F90FLAGS'] = "-g -O2"
elif "%pgi" in spec:
# set variables for PGI compilers
os.environ['MPICHLIB_CFLAGS'] = "-g -O2 -fPIC"
os.environ['MPICHLIB_CXXFLAGS'] = "-g -O2 -fPIC"
os.environ['MPICHLIB_FFLAGS'] = "-g -O2 -fPIC"
os.environ['MPICHLIB_F90FLAGS'] = "-g -O2 -fPIC"
# determine network type by variant
if "+psm" in spec:
# throw this flag on QLogic systems to use PSM
configure_args.append("--with-device=ch3:psm")
else:
# throw this flag on IB systems
configure_args.append("--with-device=ch3:mrail", "--with-rdma=gen2")
# TODO: shared-memory build
# TODO: CUDA
# TODO: other file systems like panasis
configure(
"--prefix=" + prefix,
"--enable-f77", "--enable-fc", "--enable-cxx",
"--enable-shared", "--enable-sharedlibs=gcc",
"--enable-debuginfo",
"--with-pm=no", "--with-pmi=slurm",
"--enable-romio", "--with-file-system=lustre+nfs+ufs",
"--disable-mpe", "--without-mpe",
configure_args = [
"--prefix=%s" % prefix,
"--enable-shared",
"--enable-romio",
"--disable-silent-rules",
*configure_args)
]
if not self.compiler.f77 and not self.compiler.fc:
configure_args.append("--enable-fortran=none")
# Set the type of the build (debug, release)
self.set_build_type(spec, configure_args)
# Set the process manager
self.set_process_manager(spec, configure_args)
# Determine network type by variant
self.set_network_type(spec, configure_args)
configure(*configure_args)
make()
make("install")
self.filter_compilers()
def filter_compilers(self):
"""Run after install to make the MPI compilers use the
compilers that Spack built the package with.
If this isn't done, they'll have CC, CXX, F77, and FC set
to Spack's generic cc, c++, f77, and f90. We want them to
be bound to whatever compiler they were built with.
"""
bin = self.prefix.bin
mpicc = os.path.join(bin, 'mpicc')
mpicxx = os.path.join(bin, 'mpicxx')
mpif77 = os.path.join(bin, 'mpif77')
mpif90 = os.path.join(bin, 'mpif90')
spack_cc = os.environ['CC']
spack_cxx = os.environ['CXX']
spack_f77 = os.environ['F77']
spack_fc = os.environ['FC']
kwargs = { 'ignore_absent' : True, 'backup' : False, 'string' : True }
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)