summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/spack/spack/modules.py6
-rw-r--r--lib/spack/spack/test/mock_packages_test.py7
-rw-r--r--lib/spack/spack/test/modules.py2
-rw-r--r--var/spack/repos/builtin/packages/foam-extend/package.py235
-rw-r--r--var/spack/repos/builtin/packages/hdf5/package.py29
-rw-r--r--var/spack/repos/builtin/packages/parmgridgen/package.py71
-rw-r--r--var/spack/repos/builtin/packages/scotch/package.py12
7 files changed, 339 insertions, 23 deletions
diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py
index fb58be6ce0..ce46047fa3 100644
--- a/lib/spack/spack/modules.py
+++ b/lib/spack/spack/modules.py
@@ -454,7 +454,6 @@ class EnvModule(object):
class Dotkit(EnvModule):
name = 'dotkit'
- path = join_path(spack.share_path, "dotkit")
environment_modifications_formats = {
PrependPath: 'dk_alter {name} {value}\n',
@@ -467,7 +466,7 @@ class Dotkit(EnvModule):
@property
def file_name(self):
- return join_path(Dotkit.path, self.spec.architecture,
+ return join_path(spack.share_path, "dotkit", self.spec.architecture,
'%s.dk' % self.use_name)
@property
@@ -495,7 +494,6 @@ class Dotkit(EnvModule):
class TclModule(EnvModule):
name = 'tcl'
- path = join_path(spack.share_path, "modules")
environment_modifications_formats = {
PrependPath: 'prepend-path --delim "{delim}" {name} \"{value}\"\n',
@@ -516,7 +514,7 @@ class TclModule(EnvModule):
@property
def file_name(self):
- return join_path(TclModule.path, self.spec.architecture, self.use_name)
+ return join_path(spack.share_path, "modules", self.spec.architecture, self.use_name)
@property
def header(self):
diff --git a/lib/spack/spack/test/mock_packages_test.py b/lib/spack/spack/test/mock_packages_test.py
index e7cbbc37ae..e1acc32cb7 100644
--- a/lib/spack/spack/test/mock_packages_test.py
+++ b/lib/spack/spack/test/mock_packages_test.py
@@ -201,6 +201,10 @@ class MockPackagesTest(unittest.TestCase):
spack.config.ConfigScope('site', self.mock_site_config)
spack.config.ConfigScope('user', self.mock_user_config)
+ # Keep tests from interfering with the actual module path.
+ self.real_share_path = spack.share_path
+ spack.share_path = tempfile.mkdtemp()
+
# Store changes to the package's dependencies so we can
# restore later.
self.saved_deps = {}
@@ -235,6 +239,9 @@ class MockPackagesTest(unittest.TestCase):
pkg.dependencies.clear()
pkg.dependencies.update(deps)
+ shutil.rmtree(spack.share_path, ignore_errors=True)
+ spack.share_path = self.real_share_path
+
def setUp(self):
self.initmock()
diff --git a/lib/spack/spack/test/modules.py b/lib/spack/spack/test/modules.py
index 443e4d13a6..6d2e3705bd 100644
--- a/lib/spack/spack/test/modules.py
+++ b/lib/spack/spack/test/modules.py
@@ -148,7 +148,7 @@ configuration_suffix = {
}
-class HelperFunctionsTests(unittest.TestCase):
+class HelperFunctionsTests(MockPackagesTest):
def test_update_dictionary_extending_list(self):
target = {
diff --git a/var/spack/repos/builtin/packages/foam-extend/package.py b/var/spack/repos/builtin/packages/foam-extend/package.py
new file mode 100644
index 0000000000..4479fc9bee
--- /dev/null
+++ b/var/spack/repos/builtin/packages/foam-extend/package.py
@@ -0,0 +1,235 @@
+from spack import *
+from spack.environment import *
+
+import multiprocessing
+import os
+
+
+class FoamExtend(Package):
+ """The foam-extend project is a fork of the OpenFOAM open source library
+ for Computational Fluid Dynamics (CFD)."""
+
+ homepage = "http://www.extend-project.de/"
+
+ version('3.2', git='http://git.code.sf.net/p/foam-extend/foam-extend-3.2')
+ version('3.1', git='http://git.code.sf.net/p/foam-extend/foam-extend-3.1')
+ version('3.0', git='http://git.code.sf.net/p/foam-extend/foam-extend-3.0')
+
+ variant('paraview', default=False, description='Enable ParaFOAM')
+ variant('scotch', default=True, description='Activate Scotch as a possible decomposition library')
+ variant('ptscotch', default=True, description='Activate PT-Scotch as a possible decomposition library')
+ variant('metis', default=True, description='Activate Metis as a possible decomposition library')
+ variant('parmetis', default=True, description='Activate Parmetis as a possible decomposition library')
+ variant('parmgridgen', default=True, description='Activate Parmgridgen support')
+ variant('source', default=True, description='Installs also the source folder')
+
+ supported_compilers = {'clang': 'Clang', 'gcc': 'Gcc', 'intel': 'Icc'}
+
+ depends_on('mpi')
+ depends_on('python')
+ depends_on('flex@:2.5.99')
+ depends_on('zlib')
+
+ depends_on('scotch ~ metis', when='~ptscotch+scotch')
+ depends_on('scotch ~ metis + mpi', when='+ptscotch')
+ depends_on('metis@5:', when='+metis')
+ depends_on('parmetis', when='+parmetis')
+ depends_on('parmgridgen', when='+parmgridgen')
+
+ depends_on('paraview', when='+paraview')
+
+ def set_arch(self):
+ (sysname, nodename, release, version, machine) = os.uname()
+
+ if self.compiler.name not in self.supported_compilers:
+ raise RuntimeError('{0} is not a supported compiler \
+ to compile OpenFOAM'.format(self.compiler.name))
+
+ foam_compiler = self.supported_compilers[self.compiler.name]
+ if sysname == 'Linux':
+ arch = 'linux'
+ if foam_compiler == 'Clang':
+ raise RuntimeError('OS, compiler combination not\
+ supported ({0} {1})'.format(sysname, foam_compiler))
+ elif sysname == 'Darwin':
+ if machine == 'x86_64':
+ arch = 'darwinIntel'
+ if foam_compiler == 'Icc':
+ raise RuntimeError('OS, compiler combination not\
+ supported ({0} {1})'.format(sysname, foam_compiler))
+ else:
+ raise RuntimeError('{0} {1} is not a \
+ supported architecture'.format(sysname, machine))
+
+ return (arch, foam_compiler)
+
+ def get_openfoam_environment(self):
+ return EnvironmentModifications.from_sourcing_files(
+ join_path(self.stage.source_path,
+ 'etc/bashrc'))
+
+ def patch(self):
+ # change names to match the package and not the one patch in
+ # the Third-Party of foam-extend
+ if '+parmgridgen' in self.spec:
+ filter_file(r'-lMGridGen',
+ r'-lmgrid',
+ 'src/dbns/Make/options')
+
+ filter_file(
+ r'-lMGridGen',
+ r'-lmgrid',
+ 'src/fvAgglomerationMethods/MGridGenGamgAgglomeration/Make/options') # NOQA: ignore=501
+
+ # Get the wmake arch and compiler
+ (arch, foam_compiler) = self.set_arch()
+
+ prefs_dict = {
+ 'compilerInstall': 'System',
+ 'WM_COMPILER': foam_compiler,
+ 'WM_ARCH_OPTION': '64',
+ 'WM_PRECISION_OPTION': 'DP',
+ 'WM_COMPILE_OPTION': 'SPACKOpt',
+ 'WM_MPLIB': 'SPACK',
+
+ 'CMAKE_DIR': self.spec['cmake'].prefix,
+ 'CMAKE_BIN_DIR': self.spec['cmake'].prefix.bin,
+ 'PYTHON_DIR': self.spec['python'].prefix,
+ 'PYTHON_BIN_DIR': self.spec['python'].prefix.bin,
+
+ 'FLEX_SYSTEM': 1,
+ 'FLEX_DIR': self.spec['flex'].prefix,
+
+ 'BISON_SYSTEM': 1,
+ 'BISON_DIR': self.spec['flex'].prefix,
+
+ 'ZLIB_SYSTEM': 1,
+ 'ZLIB_DIR': self.spec['zlib'].prefix,
+ }
+
+ if '+scotch' in self.spec or '+ptscotch' in self.spec:
+ prefs_dict['SCOTCH_SYSTEM'] = 1
+ prefs_dict['SCOTCH_DIR'] = self.spec['scotch'].prefix
+ prefs_dict['SCOTCH_BIN_DIR'] = self.spec['scotch'].prefix.bin
+ prefs_dict['SCOTCH_LIB_DIR'] = self.spec['scotch'].prefix.lib
+ prefs_dict['SCOTCH_INCLUDE_DIR'] = \
+ self.spec['scotch'].prefix.include
+
+ if '+metis' in self.spec:
+ prefs_dict['METIS_SYSTEM'] = 1
+ prefs_dict['METIS_DIR'] = self.spec['metis'].prefix
+ prefs_dict['METIS_BIN_DIR'] = self.spec['metis'].prefix.bin
+ prefs_dict['METIS_LIB_DIR'] = self.spec['metis'].prefix.lib
+ prefs_dict['METIS_INCLUDE_DIR'] = self.spec['metis'].prefix.include
+
+ if '+parmetis' in self.spec:
+ prefs_dict['PARMETIS_SYSTEM'] = 1
+ prefs_dict['PARMETIS_DIR'] = self.spec['parmetis'].prefix
+ prefs_dict['PARMETIS_BIN_DIR'] = self.spec['parmetis'].prefix.bin
+ prefs_dict['PARMETIS_LIB_DIR'] = self.spec['parmetis'].prefix.lib
+ prefs_dict['PARMETIS_INCLUDE_DIR'] = \
+ self.spec['parmetis'].prefix.include
+
+ if '+parmgridgen' in self.spec:
+ prefs_dict['PARMGRIDGEN_SYSTEM'] = 1
+ prefs_dict['PARMGRIDGEN_DIR'] = self.spec['parmgridgen'].prefix
+ prefs_dict['PARMGRIDGEN_BIN_DIR'] = \
+ self.spec['parmgridgen'].prefix.bin
+ prefs_dict['PARMGRIDGEN_LIB_DIR'] = \
+ self.spec['parmgridgen'].prefix.lib
+ prefs_dict['PARMGRIDGEN_INCLUDE_DIR'] = \
+ self.spec['parmgridgen'].prefix.include
+
+ if '+paraview' in self.spec:
+ prefs_dict['PARAVIEW_SYSTEM'] = 1
+ prefs_dict['PARAVIEW_DIR'] = self.spec['paraview'].prefix,
+ prefs_dict['PARAVIEW_BIN_DIR'] = self.spec['paraview'].prefix.bin,
+ prefs_dict['QT_SYSTEM'] = 1
+ prefs_dict['QT_DIR'] = self.spec['qt'].prefix,
+ prefs_dict['QT_BIN_DIR'] = self.spec['qt'].prefix.bin,
+
+ # write the prefs files to define the configuration needed,
+ # only the prefs.sh is used by this script but both are
+ # installed for end users
+ with working_dir('.'):
+ with open("etc/prefs.sh", "w") as fh:
+ for key in sorted(prefs_dict):
+ fh.write('export {0}={1}\n'.format(key, prefs_dict[key]))
+
+ with open("etc/prefs.csh", "w") as fh:
+ for key in sorted(prefs_dict):
+ fh.write('setenv {0}={1}\n'.format(key, prefs_dict[key]))
+
+ # Defining a different mpi and optimisation file to be able to
+ # make wmake get spack info with minimum modifications on
+ # configurations scripts
+ mpi_info = [
+ 'PFLAGS = -DOMPI_SKIP_MPICXX -DMPICH_IGNORE_CXX_SEEK',
+ 'PINC = -I{0}'.format(self.spec['mpi'].prefix.include),
+ 'PLIBS = -L{0} -lmpi'.format(self.spec['mpi'].prefix.lib)
+ ]
+
+ arch_path = ''.join([arch, prefs_dict['WM_ARCH_OPTION'],
+ foam_compiler])
+ option_path = ''.join([arch_path,
+ prefs_dict['WM_PRECISION_OPTION'],
+ prefs_dict['WM_COMPILE_OPTION']])
+ rule_path = join_path("wmake", "rules", arch_path)
+ build_path = join_path(self.stage.source_path, 'lib', option_path)
+ install_path = \
+ join_path(self.prefix,
+ 'foam-extend-{0}'.format(self.version.up_to(2)),
+ option_path)
+
+ rpaths_foam = ' '.join([
+ '{0}{1}'.format(self.compiler.cxx_rpath_arg,
+ install_path),
+ '{0}{1}'.format(self.compiler.cxx_rpath_arg,
+ build_path)
+ ])
+
+ compiler_flags = {
+ 'DBUG': rpaths_foam,
+ 'OPT': '-O3',
+ }
+
+ with working_dir(rule_path):
+ with open('mplibSPACK', "w") as fh:
+ fh.write('\n'.join(mpi_info))
+
+ for comp in ['c', 'c++']:
+ with open('{0}SPACKOpt'.format(comp), "w") as fh:
+ for key, val in compiler_flags.iteritems():
+ fh.write('{0}{1} = {2}\n'.format(comp, key, val))
+
+ def setup_environment(self, spack_env, run_env):
+ with working_dir(self.stage.path):
+ spack_env.set('FOAM_INST_DIR', os.path.abspath('.'))
+
+ (arch, foam_compiler) = self.set_arch()
+
+ run_env.set('FOAM_INST_DIR', self.prefix)
+
+ def install(self, spec, prefix):
+ env_openfoam = self.get_openfoam_environment()
+ env_openfoam.apply_modifications()
+
+ if self.parallel:
+ os.environ['WM_NCOMPPROCS'] = str(self.make_jobs) \
+ if self.make_jobs else str(multiprocessing.cpu_count())
+
+ allwmake = Executable('./Allwmake')
+ allwmake()
+
+ install_path = \
+ join_path(self.prefix,
+ 'foam-extend-{0}'.format(self.version.up_to(2)))
+
+ if '+source' in spec:
+ install_tree('src', join_path(install_path, 'src'))
+
+ install_tree('lib', join_path(install_path, 'lib'))
+ install_tree('bin', join_path(install_path, 'bin'))
+ install_tree('applications', join_path(install_path, 'applications'))
+ install_tree('etc', join_path(install_path, 'etc'))
+ install_tree('wmake', join_path(install_path, 'wmake'))
diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py
index e46f432be5..51a5823aa5 100644
--- a/var/spack/repos/builtin/packages/hdf5/package.py
+++ b/var/spack/repos/builtin/packages/hdf5/package.py
@@ -70,7 +70,8 @@ class Hdf5(Package):
raise RuntimeError(msg)
if '+threadsafe' in spec and ('+cxx' in spec or '+fortran' in spec):
- raise RuntimeError("cannot use variant +threadsafe with either +cxx or +fortran")
+ msg = 'cannot use variant +threadsafe with either +cxx or +fortran'
+ raise RuntimeError(msg)
def install(self, spec, prefix):
self.validate(spec)
@@ -164,7 +165,7 @@ int main(int argc, char **argv) {
"""
expected = """\
HDF5 version {version} {version}
-""".format(version=str(spec.version))
+""".format(version=str(spec.version.up_to(3)))
with open("check.c", 'w') as f:
f.write(source)
if '+mpi' in spec:
@@ -185,24 +186,30 @@ HDF5 version {version} {version}
if not success:
print "Produced output does not match expected output."
print "Expected output:"
- print '-'*80
+ print '-' * 80
print expected
- print '-'*80
+ print '-' * 80
print "Produced output:"
- print '-'*80
+ print '-' * 80
print output
- print '-'*80
+ print '-' * 80
raise RuntimeError("HDF5 install check failed")
shutil.rmtree(checkdir)
def url_for_version(self, version):
- v = str(version)
+ base_url = "http://www.hdfgroup.org/ftp/HDF5/releases"
if version == Version("1.2.2"):
- return "http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-" + v + ".tar.gz"
+ return "{0}/hdf5-{1}.tar.gz".format(base_url, version)
+ elif version < Version("1.6.6"):
+ return "{0}/hdf5-{1}/hdf5-{2}.tar.gz".format(
+ base_url, version.up_to(2), version)
elif version < Version("1.7"):
- return "http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-" + version.up_to(2) + "/hdf5-" + v + ".tar.gz"
+ return "{0}/hdf5-{1}/hdf5-{2}/src/hdf5-{2}.tar.gz".format(
+ base_url, version.up_to(2), version)
elif version < Version("1.10"):
- return "http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-" + v + "/src/hdf5-" + v + ".tar.gz"
+ return "{0}/hdf5-{1}/src/hdf5-{1}.tar.gz".format(
+ base_url, version)
else:
- return "http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-" + version.up_to(2) + "/hdf5-" + v + "/src/hdf5-" + v + ".tar.gz"
+ return "{0}/hdf5-{1}/hdf5-{2}/src/hdf5-{2}.tar.gz".format(
+ base_url, version.up_to(2), version)
diff --git a/var/spack/repos/builtin/packages/parmgridgen/package.py b/var/spack/repos/builtin/packages/parmgridgen/package.py
new file mode 100644
index 0000000000..02be777c36
--- /dev/null
+++ b/var/spack/repos/builtin/packages/parmgridgen/package.py
@@ -0,0 +1,71 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+
+from spack import *
+
+
+class Parmgridgen(Package):
+ """MGRIDGEN is a serial library written entirely in ANSI C that implements
+ (serial) algorithms for obtaining a sequence of successive coarse grids
+ that are well-suited for geometric multigrid methods.
+ ParMGridGen is the parallel version of MGridGen
+ """
+
+ homepage = "http://www-users.cs.umn.edu/~moulitsa/software.html"
+ url = "http://www-users.cs.umn.edu/~moulitsa/download/ParMGridGen-1.0.tar.gz"
+
+ version('1.0', '2872fa95b7fb91d6bd525490eed62038')
+
+ depends_on('mpi')
+
+ def install(self, spec, prefix):
+ make_opts = [
+ 'make=make',
+ 'COPTIONS=-fPIC',
+ 'LDOPTIONS=-fPIC',
+ 'CC={0}'.format(self.compiler.cc),
+ 'PARCC={0}'.format(spec['mpi'].mpicc),
+ 'LD={0}'.format(self.compiler.cc),
+ 'PARLD={0}'.format(spec['mpi'].mpicc),
+ 'LIBDIR=-L../..',
+ 'PARLIBS=-L../../ -lparmgrid -lmgrid -lm',
+ 'LIBS=-L../../ -lmgrid -lm',
+ 'parallel'
+ ]
+
+ make(*make_opts, parallel=False)
+
+ mkdirp(prefix.include, prefix.lib, prefix.bin)
+
+ install("mgridgen.h", prefix.include)
+ install("parmgridgen.h", prefix.include)
+
+ install("MGridGen/IMlib/libIMlib.a",
+ join_path(prefix.lib, 'libIMlib.a'))
+ install("libmgrid.a", prefix.lib)
+ install("libparmgrid.a", prefix.lib)
+
+ install("mgridgen", prefix.bin)
+ install("parmgridgen", prefix.bin)
diff --git a/var/spack/repos/builtin/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py
index 3c2b4993ac..2f6e42c439 100644
--- a/var/spack/repos/builtin/packages/scotch/package.py
+++ b/var/spack/repos/builtin/packages/scotch/package.py
@@ -171,15 +171,13 @@ class Scotch(Package):
target == 'ptscotch'))
make(target, parallel=can_make_parallel)
- # todo change this to take into account darwin systems
- lib_ext = '.so' if '+shared' in self.spec else '.a'
+ lib_ext = dso_suffix if '+shared' in self.spec else 'a'
# It seams easier to remove metis wrappers from the folder that will be
# installed than to tweak the Makefiles
if '+metis' not in self.spec:
with working_dir('lib'):
- lib_ext = '.so' if '+shared' in self.spec else '.a'
- force_remove('libscotchmetis{0}'.format(lib_ext))
- force_remove('libptscotchparmetis{0}'.format(lib_ext))
+ force_remove('libscotchmetis.{0}'.format(lib_ext))
+ force_remove('libptscotchparmetis.{0}'.format(lib_ext))
with working_dir('include'):
force_remove('metis.h')
@@ -187,8 +185,8 @@ class Scotch(Package):
if '~esmumps' in self.spec and self.spec.version < Version('6.0.0'):
with working_dir('lib'):
- force_remove('libesmumps{0}'.format(lib_ext))
- force_remove('libptesmumps{0}'.format(lib_ext))
+ force_remove('libesmumps.{0}'.format(lib_ext))
+ force_remove('libptesmumps.{0}'.format(lib_ext))
with working_dir('include'):
force_remove('esmumps.h')