Merge remote-tracking branch 'upstream/develop' into develop

This commit is contained in:
Jim Galarowicz 2016-04-04 17:07:53 -07:00
commit 9d2ef9f453
9 changed files with 193 additions and 37 deletions

View File

@ -794,6 +794,34 @@ Environment modules
Spack provides some limited integration with environment module Spack provides some limited integration with environment module
systems to make it easier to use the packages it provides. systems to make it easier to use the packages it provides.
Installing Environment Modules
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In order to use Spack's generated environment modules, you must have
installed the *Environment Modules* package. On many Linux
distributions, this can be installed from the vendor's repository.
For example: ```yum install environment-modules``
(Fedora/RHEL/CentOS). If your Linux distribution does not have
Environment Modules, you can get it with Spack:
1. Install with::
spack install environment-modules
2. Activate with::
MODULES_HOME=`spack location -i environment-modules`
MODULES_VERSION=`ls -1 $MODULES_HOME/Modules | head -1`
${MODULES_HOME}/Modules/${MODULES_VERSION}/bin/add.modules
This adds to your ``.bashrc`` (or similar) files, enabling Environment
Modules when you log in. It will ask your permission before changing
any files.
Spack and Environment Modules
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can enable shell support by sourcing some files in the You can enable shell support by sourcing some files in the
``/share/spack`` directory. ``/share/spack`` directory.

View File

@ -304,7 +304,7 @@ def setup_package(pkg):
# traverse in postorder so package can use vars from its dependencies # traverse in postorder so package can use vars from its dependencies
spec = pkg.spec spec = pkg.spec
for dspec in pkg.spec.traverse(order='post'): for dspec in pkg.spec.traverse(order='post', root=False):
# If a user makes their own package repo, e.g. # If a user makes their own package repo, e.g.
# spack.repos.mystuff.libelf.Libelf, and they inherit from # spack.repos.mystuff.libelf.Libelf, and they inherit from
# an existing class like spack.repos.original.libelf.Libelf, # an existing class like spack.repos.original.libelf.Libelf,
@ -321,6 +321,7 @@ def setup_package(pkg):
dpkg.setup_dependent_package(pkg.module, spec) dpkg.setup_dependent_package(pkg.module, spec)
dpkg.setup_dependent_environment(spack_env, run_env, spec) dpkg.setup_dependent_environment(spack_env, run_env, spec)
set_module_variables_for_package(pkg, pkg.module)
pkg.setup_environment(spack_env, run_env) pkg.setup_environment(spack_env, run_env)
# Make sure nothing's strange about the Spack environment. # Make sure nothing's strange about the Spack environment.

View File

@ -23,8 +23,10 @@ class Dealii(Package):
# required dependencies, light version # required dependencies, light version
depends_on ("blas") depends_on ("blas")
depends_on ("boost", when='~mpi') # Boost 1.58 is blacklisted, see https://github.com/dealii/dealii/issues/1591
depends_on ("boost+mpi", when='+mpi') # require at least 1.59
depends_on ("boost@1.59.0:", when='~mpi')
depends_on ("boost@1.59.0:+mpi", when='+mpi')
depends_on ("bzip2") depends_on ("bzip2")
depends_on ("cmake") depends_on ("cmake")
depends_on ("lapack") depends_on ("lapack")
@ -174,6 +176,19 @@ def install(self, spec, prefix):
make('release') make('release')
make('run',parallel=False) make('run',parallel=False)
# An example which uses Metis + PETSc
# FIXME: switch step-18 to MPI
with working_dir('examples/step-18'):
print('=====================================')
print('============= Step-18 ===============')
print('=====================================')
# list the number of cycles to speed up
filter_file(r'(end_time = 10;)', ('end_time = 3;'), 'step-18.cc')
if '^petsc' in spec and '^metis' in spec:
cmake('.')
make('release')
make('run',parallel=False)
# take step-40 which can use both PETSc and Trilinos # take step-40 which can use both PETSc and Trilinos
# FIXME: switch step-40 to MPI run # FIXME: switch step-40 to MPI run
with working_dir('examples/step-40'): with working_dir('examples/step-40'):

View File

@ -0,0 +1,38 @@
from spack import *
class EnvironmentModules(Package):
"""The Environment Modules package provides for the dynamic
modification of a user's environment via modulefiles."""
homepage = "https://sourceforge.net/p/modules/wiki/Home/"
url = "http://prdownloads.sourceforge.net/modules/modules-3.2.10.tar.gz"
version('3.2.10', '8b097fdcb90c514d7540bb55a3cb90fb')
# Dependencies:
depends_on('tcl')
def install(self, spec, prefix):
tcl_spec = spec['tcl']
# See: https://sourceforge.net/p/modules/bugs/62/
CPPFLAGS = ['-DUSE_INTERP_ERRORLINE']
config_args = [
"--without-tclx",
"--with-tclx-ver=0.0",
"--prefix=%s" % prefix,
"--with-tcl=%s" % join_path(tcl_spec.prefix, 'lib'), # It looks for tclConfig.sh
"--with-tcl-ver=%d.%d" % (tcl_spec.version.version[0], tcl_spec.version.version[1]),
'--disable-debug',
'--disable-dependency-tracking',
'--disable-silent-rules',
'--disable-versioning',
'--datarootdir=%s' % prefix.share,
'CPPFLAGS=%s' % ' '.join(CPPFLAGS)
]
configure(*config_args)
make()
make('install')

View File

@ -0,0 +1,51 @@
from spack import *
class Ipopt(Package):
"""Ipopt (Interior Point OPTimizer, pronounced eye-pea-Opt) is a
software package for large-scale nonlinear optimization."""
homepage = "https://projects.coin-or.org/Ipopt"
url = "http://www.coin-or.org/download/source/Ipopt/Ipopt-3.12.4.tgz"
version('3.12.4', '12a8ecaff8dd90025ddea6c65b49cb03')
version('3.12.3', 'c560cbfa9cbf62acf8b485823c255a1b')
version('3.12.2', 'ec1e855257d7de09e122c446506fb00d')
version('3.12.1', 'ceaf895ce80c77778f2cab68ba9f17f3')
version('3.12.0', 'f7dfc3aa106a6711a85214de7595e827')
depends_on("blas")
depends_on("lapack")
depends_on("pkg-config")
depends_on("mumps+double~mpi")
def install(self, spec, prefix):
# Dependency directories
blas_dir = spec['blas'].prefix
lapack_dir = spec['lapack'].prefix
mumps_dir = spec['mumps'].prefix
# Add directory with fake MPI headers in sequential MUMPS
# install to header search path
mumps_flags = "-ldmumps -lmumps_common -lpord -lmpiseq"
mumps_libcmd = "-L%s " % mumps_dir.lib + mumps_flags
# By convention, spack links blas & lapack libs to libblas & liblapack
blas_lib = "-L%s" % blas_dir.lib + " -lblas"
lapack_lib = "-L%s" % lapack_dir.lib + " -llapack"
configure_args = [
"--prefix=%s" % prefix,
"--with-mumps-incdir=%s" % mumps_dir.include,
"--with-mumps-lib=%s" % mumps_libcmd,
"--enable-shared",
"--with-blas-incdir=%s" % blas_dir.include,
"--with-blas-lib=%s" % blas_lib,
"--with-lapack-incdir=%s" % lapack_dir.include,
"--with-lapack-lib=%s" % lapack_lib
]
configure(*configure_args)
# IPOPT does not build correctly in parallel on OS X
make(parallel=False)
make("test", parallel=False)
make("install", parallel=False)

View File

@ -79,10 +79,28 @@ def install(self, spec, prefix):
if '+double' in spec: if '+double' in spec:
filter_file('REALTYPEWIDTH 32', 'REALTYPEWIDTH 64', metis_header) filter_file('REALTYPEWIDTH 32', 'REALTYPEWIDTH 64', metis_header)
# Make clang 7.3 happy.
# Prevents "ld: section __DATA/__thread_bss extends beyond end of file"
# See upstream LLVM issue https://llvm.org/bugs/show_bug.cgi?id=27059
# Adopted from https://github.com/Homebrew/homebrew-science/blob/master/metis.rb
if spec.satisfies('%clang@7.3.0'):
filter_file('#define MAX_JBUFS 128', '#define MAX_JBUFS 24', join_path(source_directory, 'GKlib', 'error.c'))
with working_dir(build_directory, create=True): with working_dir(build_directory, create=True):
cmake(source_directory, *options) cmake(source_directory, *options)
make() make()
make("install") make("install")
# now run some tests:
for f in ["4elt", "copter2", "mdual"]:
graph = join_path(source_directory,'graphs','%s.graph' % f)
Executable(join_path(prefix.bin,'graphchk'))(graph)
Executable(join_path(prefix.bin,'gpmetis'))(graph,'2')
Executable(join_path(prefix.bin,'ndmetis'))(graph)
graph = join_path(source_directory,'graphs','test.mgraph')
Executable(join_path(prefix.bin,'gpmetis'))(graph,'2')
graph = join_path(source_directory,'graphs','metis.mesh')
Executable(join_path(prefix.bin,'mpmetis'))(graph,'2')
# install GKlib headers, which will be needed for ParMETIS # install GKlib headers, which will be needed for ParMETIS
GKlib_dist = join_path(prefix.include,'GKlib') GKlib_dist = join_path(prefix.include,'GKlib')

View File

@ -1,25 +0,0 @@
from spack import *
class Modules(Package):
""" The Environment Modules package provides for the dynamic modification of a user's environment via modulefiles. """
homepage = "http://modules.sf.net"
url = "http://downloads.sourceforge.net/project/modules/Modules/modules-3.2.10/modules-3.2.10.tar.gz"
version('3.2.10', '8b097fdcb90c514d7540bb55a3cb90fb')
depends_on("tcl")
def install(self, spec, prefix):
options = ['--prefix=%s' % prefix,
'--disable-debug',
'--disable-dependency-tracking',
'--disable-silent-rules',
'--disable-versioning',
'--datarootdir=%s' % prefix.share,
'CPPFLAGS=-DUSE_INTERP_ERRORLINE']
configure(*options)
make()
make("install")

View File

@ -1,5 +1,5 @@
from spack import * from spack import *
import os, sys import os, sys, glob
class Mumps(Package): class Mumps(Package):
"""MUMPS: a MUltifrontal Massively Parallel sparse direct Solver""" """MUMPS: a MUltifrontal Massively Parallel sparse direct Solver"""
@ -164,10 +164,13 @@ def install(self, spec, prefix):
install_tree('lib', prefix.lib) install_tree('lib', prefix.lib)
install_tree('include', prefix.include) install_tree('include', prefix.include)
if '~mpi' in spec: if '~mpi' in spec:
lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so' lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so'
lib_suffix = lib_dsuffix if '+shared' in spec else '.a' lib_suffix = lib_dsuffix if '+shared' in spec else '.a'
install('libseq/libmpiseq%s' % lib_suffix, prefix.lib) install('libseq/libmpiseq%s' % lib_suffix, prefix.lib)
for f in glob.glob(join_path('libseq','*.h')):
install(f, prefix.include)
# FIXME: extend the tests to mpirun -np 2 (or alike) when build with MPI # FIXME: extend the tests to mpirun -np 2 (or alike) when build with MPI
# FIXME: use something like numdiff to compare blessed output with the current # FIXME: use something like numdiff to compare blessed output with the current

View File

@ -10,10 +10,18 @@ class SuiteSparse(Package):
version('4.5.1', 'f0ea9aad8d2d1ffec66a5b6bfeff5319') version('4.5.1', 'f0ea9aad8d2d1ffec66a5b6bfeff5319')
# FIXME: (see below)
# variant('tbb', default=True, description='Build with Intel TBB')
depends_on('blas') depends_on('blas')
depends_on('lapack') depends_on('lapack')
depends_on('metis@5.1.0', when='@4.5.1') depends_on('metis@5.1.0', when='@4.5.1')
# FIXME:
# in @4.5.1. TBB support in SPQR seems to be broken as TBB-related linkng flags
# does not seem to be used, which leads to linking errors on Linux.
# Try re-enabling in future versions.
# depends_on('tbb', when='+tbb')
def install(self, spec, prefix): def install(self, spec, prefix):
# The build system of SuiteSparse is quite old-fashioned # The build system of SuiteSparse is quite old-fashioned
@ -21,16 +29,35 @@ def install(self, spec, prefix):
# with a lot of convoluted logic in it. # with a lot of convoluted logic in it.
# Any kind of customization will need to go through filtering of that file # Any kind of customization will need to go through filtering of that file
# FIXME : this actually uses the current workaround make_args = ['INSTALL=%s' % prefix]
# FIXME : (blas / lapack always provide libblas and liblapack as aliases)
make('install', 'INSTALL=%s' % prefix,
# inject Spack compiler wrappers # inject Spack compiler wrappers
make_args.extend([
'AUTOCC=no', 'AUTOCC=no',
'CC=cc', 'CC=cc',
'CXX=c++', 'CXX=c++',
'F77=f77', 'F77=f77',
])
# use Spack's metis in CHOLMOD/Partition module,
# otherwise internal Metis will be compiled
make_args.extend([
'MY_METIS_LIB=-L%s -lmetis' % spec['metis'].prefix.lib,
'MY_METIS_INC=%s' % spec['metis'].prefix.include,
])
# Intel TBB in SuiteSparseQR
if '+tbb' in spec:
make_args.extend([
'SPQR_CONFIG=-DHAVE_TBB',
'TBB=-L%s -ltbb' % spec['tbb'].prefix.lib,
])
# BLAS arguments require path to libraries # BLAS arguments require path to libraries
# FIXME : (blas / lapack always provide libblas and liblapack as aliases)
make_args.extend([
'BLAS=-lblas', 'BLAS=-lblas',
'LAPACK=-llapack') 'LAPACK=-llapack'
])
make('install', *make_args)