Merge remote-tracking branch 'upstream/develop' into env-draco
This commit is contained in:
commit
aef7065e85
@ -149,26 +149,46 @@ customize an installation in :ref:`sec-specs`.
|
||||
``spack uninstall``
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To uninstall a package, type ``spack uninstall <package>``. This will
|
||||
completely remove the directory in which the package was installed.
|
||||
To uninstall a package, type ``spack uninstall <package>``. This will ask the user for
|
||||
confirmation, and in case will completely remove the directory in which the package was installed.
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
spack uninstall mpich
|
||||
|
||||
If there are still installed packages that depend on the package to be
|
||||
uninstalled, spack will refuse to uninstall it. You can override this
|
||||
behavior with ``spack uninstall -f <package>``, but you risk breaking
|
||||
other installed packages. In general, it is safer to remove dependent
|
||||
packages *before* removing their dependencies.
|
||||
uninstalled, spack will refuse to uninstall it.
|
||||
|
||||
A line like ``spack uninstall mpich`` may be ambiguous, if multiple
|
||||
``mpich`` configurations are installed. For example, if both
|
||||
To uninstall a package and every package that depends on it, you may give the
|
||||
`--dependents` option.
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
spack uninstall --dependents mpich
|
||||
|
||||
will display a list of all the packages that depends on `mpich` and, upon confirmation,
|
||||
will uninstall them in the right order.
|
||||
|
||||
A line like
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
spack uninstall mpich
|
||||
|
||||
may be ambiguous, if multiple ``mpich`` configurations are installed. For example, if both
|
||||
``mpich@3.0.2`` and ``mpich@3.1`` are installed, ``mpich`` could refer
|
||||
to either one. Because it cannot determine which one to uninstall,
|
||||
Spack will ask you to provide a version number to remove the
|
||||
ambiguity. As an example, ``spack uninstall mpich@3.1`` is
|
||||
unambiguous in this scenario.
|
||||
Spack will ask you either to provide a version number to remove the
|
||||
ambiguity or use the ``--all`` option to uninstall all of the matching packages.
|
||||
|
||||
You may force uninstall a package with the `--force` option
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
spack uninstall --force mpich
|
||||
|
||||
but you risk breaking other installed packages. In general, it is safer to remove dependent
|
||||
packages *before* removing their dependencies or use the `--dependents` option.
|
||||
|
||||
|
||||
Seeing installed packages
|
||||
@ -774,6 +794,34 @@ Environment modules
|
||||
Spack provides some limited integration with environment module
|
||||
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
|
||||
``/share/spack`` directory.
|
||||
|
||||
|
@ -213,7 +213,7 @@ def set_module_variables_for_package(pkg, module):
|
||||
# TODO: of build dependencies, as opposed to link dependencies.
|
||||
# TODO: Currently, everything is a link dependency, but tools like
|
||||
# TODO: this shouldn't be.
|
||||
m.cmake = which("cmake")
|
||||
m.cmake = Executable('cmake')
|
||||
|
||||
# standard CMake arguments
|
||||
m.std_cmake_args = ['-DCMAKE_INSTALL_PREFIX=%s' % pkg.prefix,
|
||||
@ -278,21 +278,6 @@ def parent_class_modules(cls):
|
||||
return result
|
||||
|
||||
|
||||
def setup_module_variables_for_dag(pkg):
|
||||
"""Set module-scope variables for all packages in the DAG."""
|
||||
for spec in pkg.spec.traverse(order='post'):
|
||||
# If a user makes their own package repo, e.g.
|
||||
# spack.repos.mystuff.libelf.Libelf, and they inherit from
|
||||
# an existing class like spack.repos.original.libelf.Libelf,
|
||||
# then set the module variables for both classes so the
|
||||
# parent class can still use them if it gets called.
|
||||
spkg = spec.package
|
||||
modules = parent_class_modules(spkg.__class__)
|
||||
for mod in modules:
|
||||
set_module_variables_for_package(spkg, mod)
|
||||
set_module_variables_for_package(spkg, spkg.module)
|
||||
|
||||
|
||||
def setup_package(pkg):
|
||||
"""Execute all environment setup routines."""
|
||||
spack_env = EnvironmentModifications()
|
||||
@ -316,20 +301,26 @@ def setup_package(pkg):
|
||||
|
||||
set_compiler_environment_variables(pkg, spack_env)
|
||||
set_build_environment_variables(pkg, spack_env)
|
||||
setup_module_variables_for_dag(pkg)
|
||||
|
||||
# traverse in postorder so package can use vars from its dependencies
|
||||
spec = pkg.spec
|
||||
for dspec in pkg.spec.traverse(order='post'):
|
||||
# If a user makes their own package repo, e.g.
|
||||
# spack.repos.mystuff.libelf.Libelf, and they inherit from
|
||||
# an existing class like spack.repos.original.libelf.Libelf,
|
||||
# then set the module variables for both classes so the
|
||||
# parent class can still use them if it gets called.
|
||||
spkg = dspec.package
|
||||
modules = parent_class_modules(spkg.__class__)
|
||||
for mod in modules:
|
||||
set_module_variables_for_package(spkg, mod)
|
||||
set_module_variables_for_package(spkg, spkg.module)
|
||||
|
||||
# Allow dependencies to modify the module
|
||||
spec = pkg.spec
|
||||
for dependency_spec in spec.traverse(root=False):
|
||||
dpkg = dependency_spec.package
|
||||
dpkg = dspec.package
|
||||
dpkg.setup_dependent_package(pkg.module, spec)
|
||||
|
||||
# Allow dependencies to set up environment as well
|
||||
for dependency_spec in spec.traverse(root=False):
|
||||
dpkg = dependency_spec.package
|
||||
dpkg.setup_dependent_environment(spack_env, run_env, spec)
|
||||
|
||||
# Allow the package to apply some settings.
|
||||
pkg.setup_environment(spack_env, run_env)
|
||||
|
||||
# Make sure nothing's strange about the Spack environment.
|
||||
|
@ -23,19 +23,33 @@
|
||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
##############################################################################
|
||||
from __future__ import print_function
|
||||
import sys
|
||||
|
||||
import argparse
|
||||
|
||||
import llnl.util.tty as tty
|
||||
from llnl.util.tty.colify import colify
|
||||
|
||||
import spack
|
||||
import spack.cmd
|
||||
import spack.repository
|
||||
from spack.cmd.find import display_specs
|
||||
from spack.package import PackageStillNeededError
|
||||
|
||||
description="Remove an installed package"
|
||||
description = "Remove an installed package"
|
||||
|
||||
error_message = """You can either:
|
||||
a) Use a more specific spec, or
|
||||
b) use spack uninstall -a to uninstall ALL matching specs.
|
||||
"""
|
||||
|
||||
|
||||
def ask_for_confirmation(message):
|
||||
while True:
|
||||
tty.msg(message + '[y/n]')
|
||||
choice = raw_input().lower()
|
||||
if choice == 'y':
|
||||
break
|
||||
elif choice == 'n':
|
||||
raise SystemExit('Operation aborted')
|
||||
tty.warn('Please reply either "y" or "n"')
|
||||
|
||||
|
||||
def setup_parser(subparser):
|
||||
subparser.add_argument(
|
||||
@ -47,7 +61,98 @@ def setup_parser(subparser):
|
||||
"supplied spec. i.e., if you say uninstall libelf, ALL versions of " +
|
||||
"libelf are uninstalled. This is both useful and dangerous, like rm -r.")
|
||||
subparser.add_argument(
|
||||
'packages', nargs=argparse.REMAINDER, help="specs of packages to uninstall")
|
||||
'-d', '--dependents', action='store_true', dest='dependents',
|
||||
help='Also uninstall any packages that depend on the ones given via command line.'
|
||||
)
|
||||
subparser.add_argument(
|
||||
'-y', '--yes-to-all', action='store_true', dest='yes_to_all',
|
||||
help='Assume "yes" is the answer to every confirmation asked to the user.'
|
||||
|
||||
)
|
||||
subparser.add_argument('packages', nargs=argparse.REMAINDER, help="specs of packages to uninstall")
|
||||
|
||||
|
||||
def concretize_specs(specs, allow_multiple_matches=False, force=False):
|
||||
"""
|
||||
Returns a list of specs matching the non necessarily concretized specs given from cli
|
||||
|
||||
Args:
|
||||
specs: list of specs to be matched against installed packages
|
||||
allow_multiple_matches : boolean (if True multiple matches for each item in specs are admitted)
|
||||
|
||||
Return:
|
||||
list of specs
|
||||
"""
|
||||
specs_from_cli = [] # List of specs that match expressions given via command line
|
||||
has_errors = False
|
||||
for spec in specs:
|
||||
matching = spack.installed_db.query(spec)
|
||||
# For each spec provided, make sure it refers to only one package.
|
||||
# Fail and ask user to be unambiguous if it doesn't
|
||||
if not allow_multiple_matches and len(matching) > 1:
|
||||
tty.error("%s matches multiple packages:" % spec)
|
||||
print()
|
||||
display_specs(matching, long=True)
|
||||
print()
|
||||
has_errors = True
|
||||
|
||||
# No installed package matches the query
|
||||
if len(matching) == 0 and not force:
|
||||
tty.error("%s does not match any installed packages." % spec)
|
||||
has_errors = True
|
||||
|
||||
specs_from_cli.extend(matching)
|
||||
if has_errors:
|
||||
tty.die(error_message)
|
||||
|
||||
return specs_from_cli
|
||||
|
||||
|
||||
def installed_dependents(specs):
|
||||
"""
|
||||
Returns a dictionary that maps a spec with a list of its installed dependents
|
||||
|
||||
Args:
|
||||
specs: list of specs to be checked for dependents
|
||||
|
||||
Returns:
|
||||
dictionary of installed dependents
|
||||
"""
|
||||
dependents = {}
|
||||
for item in specs:
|
||||
lst = [x for x in item.package.installed_dependents if x not in specs]
|
||||
if lst:
|
||||
lst = list(set(lst))
|
||||
dependents[item] = lst
|
||||
return dependents
|
||||
|
||||
|
||||
def do_uninstall(specs, force):
|
||||
"""
|
||||
Uninstalls all the specs in a list.
|
||||
|
||||
Args:
|
||||
specs: list of specs to be uninstalled
|
||||
force: force uninstallation (boolean)
|
||||
"""
|
||||
packages = []
|
||||
for item in specs:
|
||||
try:
|
||||
# should work if package is known to spack
|
||||
packages.append(item.package)
|
||||
except spack.repository.UnknownPackageError as e:
|
||||
# The package.py file has gone away -- but still
|
||||
# want to uninstall.
|
||||
spack.Package(item).do_uninstall(force=True)
|
||||
|
||||
# Sort packages to be uninstalled by the number of installed dependents
|
||||
# This ensures we do things in the right order
|
||||
def num_installed_deps(pkg):
|
||||
return len(pkg.installed_dependents)
|
||||
|
||||
packages.sort(key=num_installed_deps)
|
||||
for item in packages:
|
||||
item.do_uninstall(force=force)
|
||||
|
||||
|
||||
def uninstall(parser, args):
|
||||
@ -56,50 +161,34 @@ def uninstall(parser, args):
|
||||
|
||||
with spack.installed_db.write_transaction():
|
||||
specs = spack.cmd.parse_specs(args.packages)
|
||||
# Gets the list of installed specs that match the ones give via cli
|
||||
uninstall_list = concretize_specs(specs, args.all, args.force) # takes care of '-a' is given in the cli
|
||||
dependent_list = installed_dependents(uninstall_list) # takes care of '-d'
|
||||
|
||||
# For each spec provided, make sure it refers to only one package.
|
||||
# Fail and ask user to be unambiguous if it doesn't
|
||||
pkgs = []
|
||||
for spec in specs:
|
||||
matching_specs = spack.installed_db.query(spec)
|
||||
if not args.all and len(matching_specs) > 1:
|
||||
tty.error("%s matches multiple packages:" % spec)
|
||||
print()
|
||||
display_specs(matching_specs, long=True)
|
||||
print()
|
||||
print("You can either:")
|
||||
print(" a) Use a more specific spec, or")
|
||||
print(" b) use spack uninstall -a to uninstall ALL matching specs.")
|
||||
sys.exit(1)
|
||||
|
||||
if len(matching_specs) == 0:
|
||||
if args.force: continue
|
||||
tty.die("%s does not match any installed packages." % spec)
|
||||
|
||||
for s in matching_specs:
|
||||
try:
|
||||
# should work if package is known to spack
|
||||
pkgs.append(s.package)
|
||||
except spack.repository.UnknownPackageError as e:
|
||||
# The package.py file has gone away -- but still
|
||||
# want to uninstall.
|
||||
spack.Package(s).do_uninstall(force=True)
|
||||
|
||||
# Sort packages to be uninstalled by the number of installed dependents
|
||||
# This ensures we do things in the right order
|
||||
def num_installed_deps(pkg):
|
||||
return len(pkg.installed_dependents)
|
||||
pkgs.sort(key=num_installed_deps)
|
||||
|
||||
# Uninstall packages in order now.
|
||||
for pkg in pkgs:
|
||||
try:
|
||||
pkg.do_uninstall(force=args.force)
|
||||
except PackageStillNeededError as e:
|
||||
tty.error("Will not uninstall %s" % e.spec.format("$_$@$%@$#", color=True))
|
||||
# Process dependent_list and update uninstall_list
|
||||
has_error = False
|
||||
if dependent_list and not args.dependents and not args.force:
|
||||
for spec, lst in dependent_list.items():
|
||||
tty.error("Will not uninstall %s" % spec.format("$_$@$%@$#", color=True))
|
||||
print('')
|
||||
print("The following packages depend on it:")
|
||||
display_specs(e.dependents, long=True)
|
||||
display_specs(lst, long=True)
|
||||
print('')
|
||||
print("You can use spack uninstall -f to force this action.")
|
||||
sys.exit(1)
|
||||
has_error = True
|
||||
elif args.dependents:
|
||||
for key, lst in dependent_list.items():
|
||||
uninstall_list.extend(lst)
|
||||
uninstall_list = list(set(uninstall_list))
|
||||
|
||||
if has_error:
|
||||
tty.die('You can use spack uninstall --dependents to uninstall these dependencies as well')
|
||||
|
||||
if not args.yes_to_all:
|
||||
tty.msg("The following packages will be uninstalled : ")
|
||||
print('')
|
||||
display_specs(uninstall_list, long=True)
|
||||
print('')
|
||||
ask_for_confirmation('Do you want to proceed ? ')
|
||||
|
||||
# Uninstall everything on the list
|
||||
do_uninstall(uninstall_list, args.force)
|
||||
|
@ -163,9 +163,14 @@ def write(self):
|
||||
# package-specific modifications
|
||||
spack_env = EnvironmentModifications()
|
||||
for item in self.pkg.extendees:
|
||||
try:
|
||||
package = self.spec[item].package
|
||||
package.setup_dependent_package(self.pkg.module, self.spec)
|
||||
package.setup_dependent_environment(spack_env, env, self.spec)
|
||||
except:
|
||||
# The extends was conditional, so it doesn't count here
|
||||
# eg: extends('python', when='+python')
|
||||
pass
|
||||
|
||||
# Package-specific environment modifications
|
||||
self.spec.package.setup_environment(spack_env, env)
|
||||
|
@ -67,7 +67,8 @@
|
||||
'namespace_trie',
|
||||
'yaml',
|
||||
'sbang',
|
||||
'environment']
|
||||
'environment',
|
||||
'cmd.uninstall']
|
||||
|
||||
|
||||
def list_tests():
|
||||
|
0
lib/spack/spack/test/cmd/__init__.py
Normal file
0
lib/spack/spack/test/cmd/__init__.py
Normal file
37
lib/spack/spack/test/cmd/uninstall.py
Normal file
37
lib/spack/spack/test/cmd/uninstall.py
Normal file
@ -0,0 +1,37 @@
|
||||
import spack.test.mock_database
|
||||
|
||||
from spack.cmd.uninstall import uninstall
|
||||
|
||||
|
||||
class MockArgs(object):
|
||||
def __init__(self, packages, all=False, force=False, dependents=False):
|
||||
self.packages = packages
|
||||
self.all = all
|
||||
self.force = force
|
||||
self.dependents = dependents
|
||||
self.yes_to_all = True
|
||||
|
||||
|
||||
class TestUninstall(spack.test.mock_database.MockDatabase):
|
||||
def test_uninstall(self):
|
||||
parser = None
|
||||
# Multiple matches
|
||||
args = MockArgs(['mpileaks'])
|
||||
self.assertRaises(SystemExit, uninstall, parser, args)
|
||||
# Installed dependents
|
||||
args = MockArgs(['libelf'])
|
||||
self.assertRaises(SystemExit, uninstall, parser, args)
|
||||
# Recursive uninstall
|
||||
args = MockArgs(['callpath'], all=True, dependents=True)
|
||||
uninstall(parser, args)
|
||||
|
||||
all_specs = spack.install_layout.all_specs()
|
||||
self.assertEqual(len(all_specs), 7)
|
||||
# query specs with multiple configurations
|
||||
mpileaks_specs = [s for s in all_specs if s.satisfies('mpileaks')]
|
||||
callpath_specs = [s for s in all_specs if s.satisfies('callpath')]
|
||||
mpi_specs = [s for s in all_specs if s.satisfies('mpi')]
|
||||
|
||||
self.assertEqual(len(mpileaks_specs), 0)
|
||||
self.assertEqual(len(callpath_specs), 0)
|
||||
self.assertEqual(len(mpi_specs), 3)
|
@ -28,16 +28,12 @@
|
||||
"""
|
||||
import os.path
|
||||
import multiprocessing
|
||||
import shutil
|
||||
import tempfile
|
||||
|
||||
import spack
|
||||
from llnl.util.filesystem import join_path
|
||||
from llnl.util.lock import *
|
||||
from llnl.util.tty.colify import colify
|
||||
from spack.database import Database
|
||||
from spack.directory_layout import YamlDirectoryLayout
|
||||
from spack.test.mock_packages_test import *
|
||||
from spack.test.mock_database import MockDatabase
|
||||
|
||||
|
||||
def _print_ref_counts():
|
||||
@ -75,80 +71,7 @@ def add_rec(spec):
|
||||
colify(recs, cols=3)
|
||||
|
||||
|
||||
class DatabaseTest(MockPackagesTest):
|
||||
|
||||
def _mock_install(self, spec):
|
||||
s = Spec(spec)
|
||||
s.concretize()
|
||||
pkg = spack.repo.get(s)
|
||||
pkg.do_install(fake=True)
|
||||
|
||||
|
||||
def _mock_remove(self, spec):
|
||||
specs = spack.installed_db.query(spec)
|
||||
assert(len(specs) == 1)
|
||||
spec = specs[0]
|
||||
spec.package.do_uninstall(spec)
|
||||
|
||||
|
||||
def setUp(self):
|
||||
super(DatabaseTest, self).setUp()
|
||||
#
|
||||
# TODO: make the mockup below easier.
|
||||
#
|
||||
|
||||
# Make a fake install directory
|
||||
self.install_path = tempfile.mkdtemp()
|
||||
self.spack_install_path = spack.install_path
|
||||
spack.install_path = self.install_path
|
||||
|
||||
self.install_layout = YamlDirectoryLayout(self.install_path)
|
||||
self.spack_install_layout = spack.install_layout
|
||||
spack.install_layout = self.install_layout
|
||||
|
||||
# Make fake database and fake install directory.
|
||||
self.installed_db = Database(self.install_path)
|
||||
self.spack_installed_db = spack.installed_db
|
||||
spack.installed_db = self.installed_db
|
||||
|
||||
# make a mock database with some packages installed note that
|
||||
# the ref count for dyninst here will be 3, as it's recycled
|
||||
# across each install.
|
||||
#
|
||||
# Here is what the mock DB looks like:
|
||||
#
|
||||
# o mpileaks o mpileaks' o mpileaks''
|
||||
# |\ |\ |\
|
||||
# | o callpath | o callpath' | o callpath''
|
||||
# |/| |/| |/|
|
||||
# o | mpich o | mpich2 o | zmpi
|
||||
# | | o | fake
|
||||
# | | |
|
||||
# | |______________/
|
||||
# | .____________/
|
||||
# |/
|
||||
# o dyninst
|
||||
# |\
|
||||
# | o libdwarf
|
||||
# |/
|
||||
# o libelf
|
||||
#
|
||||
|
||||
# Transaction used to avoid repeated writes.
|
||||
with spack.installed_db.write_transaction():
|
||||
self._mock_install('mpileaks ^mpich')
|
||||
self._mock_install('mpileaks ^mpich2')
|
||||
self._mock_install('mpileaks ^zmpi')
|
||||
|
||||
|
||||
def tearDown(self):
|
||||
super(DatabaseTest, self).tearDown()
|
||||
shutil.rmtree(self.install_path)
|
||||
spack.install_path = self.spack_install_path
|
||||
spack.install_layout = self.spack_install_layout
|
||||
spack.installed_db = self.spack_installed_db
|
||||
|
||||
|
||||
class DatabaseTest(MockDatabase):
|
||||
def test_005_db_exists(self):
|
||||
"""Make sure db cache file exists after creating."""
|
||||
index_file = join_path(self.install_path, '.spack-db', 'index.yaml')
|
||||
@ -157,7 +80,6 @@ def test_005_db_exists(self):
|
||||
self.assertTrue(os.path.exists(index_file))
|
||||
self.assertTrue(os.path.exists(lock_file))
|
||||
|
||||
|
||||
def test_010_all_install_sanity(self):
|
||||
"""Ensure that the install layout reflects what we think it does."""
|
||||
all_specs = spack.install_layout.all_specs()
|
||||
|
@ -64,7 +64,14 @@ def tearDown(self):
|
||||
shutil.rmtree(self.tmpdir, ignore_errors=True)
|
||||
|
||||
|
||||
def test_install_and_uninstall(self):
|
||||
def fake_fetchify(self, pkg):
|
||||
"""Fake the URL for a package so it downloads from a file."""
|
||||
fetcher = FetchStrategyComposite()
|
||||
fetcher.append(URLFetchStrategy(self.repo.url))
|
||||
pkg.fetcher = fetcher
|
||||
|
||||
|
||||
def ztest_install_and_uninstall(self):
|
||||
# Get a basic concrete spec for the trivial install package.
|
||||
spec = Spec('trivial_install_test_package')
|
||||
spec.concretize()
|
||||
@ -73,11 +80,7 @@ def test_install_and_uninstall(self):
|
||||
# Get the package
|
||||
pkg = spack.repo.get(spec)
|
||||
|
||||
# Fake the URL for the package so it downloads from a file.
|
||||
|
||||
fetcher = FetchStrategyComposite()
|
||||
fetcher.append(URLFetchStrategy(self.repo.url))
|
||||
pkg.fetcher = fetcher
|
||||
self.fake_fetchify(pkg)
|
||||
|
||||
try:
|
||||
pkg.do_install()
|
||||
@ -85,3 +88,17 @@ def test_install_and_uninstall(self):
|
||||
except Exception, e:
|
||||
pkg.remove_prefix()
|
||||
raise
|
||||
|
||||
|
||||
def test_install_environment(self):
|
||||
spec = Spec('cmake-client').concretized()
|
||||
|
||||
for s in spec.traverse():
|
||||
self.fake_fetchify(s.package)
|
||||
|
||||
pkg = spec.package
|
||||
try:
|
||||
pkg.do_install()
|
||||
except Exception, e:
|
||||
pkg.remove_prefix()
|
||||
raise
|
||||
|
78
lib/spack/spack/test/mock_database.py
Normal file
78
lib/spack/spack/test/mock_database.py
Normal file
@ -0,0 +1,78 @@
|
||||
import shutil
|
||||
import tempfile
|
||||
|
||||
import spack
|
||||
from spack.spec import Spec
|
||||
from spack.database import Database
|
||||
from spack.directory_layout import YamlDirectoryLayout
|
||||
from spack.test.mock_packages_test import MockPackagesTest
|
||||
|
||||
|
||||
class MockDatabase(MockPackagesTest):
|
||||
def _mock_install(self, spec):
|
||||
s = Spec(spec)
|
||||
s.concretize()
|
||||
pkg = spack.repo.get(s)
|
||||
pkg.do_install(fake=True)
|
||||
|
||||
def _mock_remove(self, spec):
|
||||
specs = spack.installed_db.query(spec)
|
||||
assert(len(specs) == 1)
|
||||
spec = specs[0]
|
||||
spec.package.do_uninstall(spec)
|
||||
|
||||
def setUp(self):
|
||||
super(MockDatabase, self).setUp()
|
||||
#
|
||||
# TODO: make the mockup below easier.
|
||||
#
|
||||
|
||||
# Make a fake install directory
|
||||
self.install_path = tempfile.mkdtemp()
|
||||
self.spack_install_path = spack.install_path
|
||||
spack.install_path = self.install_path
|
||||
|
||||
self.install_layout = YamlDirectoryLayout(self.install_path)
|
||||
self.spack_install_layout = spack.install_layout
|
||||
spack.install_layout = self.install_layout
|
||||
|
||||
# Make fake database and fake install directory.
|
||||
self.installed_db = Database(self.install_path)
|
||||
self.spack_installed_db = spack.installed_db
|
||||
spack.installed_db = self.installed_db
|
||||
|
||||
# make a mock database with some packages installed note that
|
||||
# the ref count for dyninst here will be 3, as it's recycled
|
||||
# across each install.
|
||||
#
|
||||
# Here is what the mock DB looks like:
|
||||
#
|
||||
# o mpileaks o mpileaks' o mpileaks''
|
||||
# |\ |\ |\
|
||||
# | o callpath | o callpath' | o callpath''
|
||||
# |/| |/| |/|
|
||||
# o | mpich o | mpich2 o | zmpi
|
||||
# | | o | fake
|
||||
# | | |
|
||||
# | |______________/
|
||||
# | .____________/
|
||||
# |/
|
||||
# o dyninst
|
||||
# |\
|
||||
# | o libdwarf
|
||||
# |/
|
||||
# o libelf
|
||||
#
|
||||
|
||||
# Transaction used to avoid repeated writes.
|
||||
with spack.installed_db.write_transaction():
|
||||
self._mock_install('mpileaks ^mpich')
|
||||
self._mock_install('mpileaks ^mpich2')
|
||||
self._mock_install('mpileaks ^zmpi')
|
||||
|
||||
def tearDown(self):
|
||||
super(MockDatabase, self).tearDown()
|
||||
shutil.rmtree(self.install_path)
|
||||
spack.install_path = self.spack_install_path
|
||||
spack.install_layout = self.spack_install_layout
|
||||
spack.installed_db = self.spack_installed_db
|
@ -0,0 +1,89 @@
|
||||
##############################################################################
|
||||
# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
|
||||
# Produced at the Lawrence Livermore National Laboratory.
|
||||
#
|
||||
# This file is part of Spack.
|
||||
# Written 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 General Public License (as published by
|
||||
# the Free Software Foundation) version 2.1 dated 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 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 *
|
||||
import os
|
||||
|
||||
def check(condition, msg):
|
||||
"""Raise an install error if condition is False."""
|
||||
if not condition:
|
||||
raise InstallError(msg)
|
||||
|
||||
|
||||
class CmakeClient(Package):
|
||||
"""A dumy package that uses cmake."""
|
||||
homepage = 'https://www.example.com'
|
||||
url = 'https://www.example.com/cmake-client-1.0.tar.gz'
|
||||
|
||||
version('1.0', '4cb3ff35b2472aae70f542116d616e63')
|
||||
|
||||
depends_on('cmake')
|
||||
|
||||
|
||||
def setup_environment(self, spack_env, run_env):
|
||||
spack_cc # Ensure spack module-scope variable is avaiabl
|
||||
check(from_cmake == "from_cmake",
|
||||
"setup_environment couldn't read global set by cmake.")
|
||||
|
||||
check(self.spec['cmake'].link_arg == "test link arg",
|
||||
"link arg on dependency spec not readable from setup_environment.")
|
||||
|
||||
|
||||
def setup_dependent_environment(self, spack_env, run_env, dspec):
|
||||
spack_cc # Ensure spack module-scope variable is avaiable
|
||||
check(from_cmake == "from_cmake",
|
||||
"setup_dependent_environment couldn't read global set by cmake.")
|
||||
|
||||
check(self.spec['cmake'].link_arg == "test link arg",
|
||||
"link arg on dependency spec not readable from setup_dependent_environment.")
|
||||
|
||||
|
||||
def setup_dependent_package(self, module, dspec):
|
||||
spack_cc # Ensure spack module-scope variable is avaiable
|
||||
check(from_cmake == "from_cmake",
|
||||
"setup_dependent_package couldn't read global set by cmake.")
|
||||
|
||||
check(self.spec['cmake'].link_arg == "test link arg",
|
||||
"link arg on dependency spec not readable from setup_dependent_package.")
|
||||
|
||||
|
||||
|
||||
def install(self, spec, prefix):
|
||||
# check that cmake is in the global scope.
|
||||
global cmake
|
||||
check(cmake is not None, "No cmake was in environment!")
|
||||
|
||||
# check that which('cmake') returns the right one.
|
||||
cmake = which('cmake')
|
||||
check(cmake.exe[0].startswith(spec['cmake'].prefix.bin),
|
||||
"Wrong cmake was in environment: %s" % cmake)
|
||||
|
||||
check(from_cmake == "from_cmake",
|
||||
"Couldn't read global set by cmake.")
|
||||
|
||||
check(os.environ['from_cmake'] == 'from_cmake',
|
||||
"Couldn't read env var set in envieonmnt by dependency")
|
||||
|
||||
mkdirp(prefix.bin)
|
||||
touch(join_path(prefix.bin, 'dummy'))
|
69
var/spack/repos/builtin.mock/packages/cmake/package.py
Normal file
69
var/spack/repos/builtin.mock/packages/cmake/package.py
Normal file
@ -0,0 +1,69 @@
|
||||
##############################################################################
|
||||
# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
|
||||
# Produced at the Lawrence Livermore National Laboratory.
|
||||
#
|
||||
# This file is part of Spack.
|
||||
# Written 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 General Public License (as published by
|
||||
# the Free Software Foundation) version 2.1 dated 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 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 *
|
||||
import os
|
||||
|
||||
def check(condition, msg):
|
||||
"""Raise an install error if condition is False."""
|
||||
if not condition:
|
||||
raise InstallError(msg)
|
||||
|
||||
|
||||
class Cmake(Package):
|
||||
"""A dumy package for the cmake build system."""
|
||||
homepage = 'https://www.cmake.org'
|
||||
url = 'https://cmake.org/files/v3.4/cmake-3.4.3.tar.gz'
|
||||
|
||||
version('3.4.3', '4cb3ff35b2472aae70f542116d616e63',
|
||||
url='https://cmake.org/files/v3.4/cmake-3.4.3.tar.gz')
|
||||
|
||||
|
||||
def setup_environment(self, spack_env, run_env):
|
||||
spack_cc # Ensure spack module-scope variable is avaiable
|
||||
spack_env.set('for_install', 'for_install')
|
||||
|
||||
def setup_dependent_environment(self, spack_env, run_env, dspec):
|
||||
spack_cc # Ensure spack module-scope variable is avaiable
|
||||
spack_env.set('from_cmake', 'from_cmake')
|
||||
|
||||
|
||||
def setup_dependent_package(self, module, dspec):
|
||||
spack_cc # Ensure spack module-scope variable is avaiable
|
||||
|
||||
self.spec.from_cmake = "from_cmake"
|
||||
module.from_cmake = "from_cmake"
|
||||
|
||||
self.spec.link_arg = "test link arg"
|
||||
|
||||
|
||||
def install(self, spec, prefix):
|
||||
mkdirp(prefix.bin)
|
||||
|
||||
check(os.environ['for_install'] == 'for_install',
|
||||
"Couldn't read env var set in compile envieonmnt")
|
||||
|
||||
cmake_exe = join_path(prefix.bin, 'cmake')
|
||||
touch(cmake_exe)
|
||||
set_executable(cmake_exe)
|
@ -20,6 +20,8 @@ class Dbus(Package):
|
||||
version('1.8.4', '4717cb8ab5b80978fcadf2b4f2f72e1b')
|
||||
version('1.8.2', 'd6f709bbec0a022a1847c7caec9d6068')
|
||||
|
||||
depends_on('expat')
|
||||
|
||||
def install(self, spec, prefix):
|
||||
configure(
|
||||
"--prefix=%s" % prefix,
|
||||
|
@ -23,8 +23,10 @@ class Dealii(Package):
|
||||
|
||||
# required dependencies, light version
|
||||
depends_on ("blas")
|
||||
depends_on ("boost", when='~mpi')
|
||||
depends_on ("boost+mpi", when='+mpi')
|
||||
# Boost 1.58 is blacklisted, see https://github.com/dealii/dealii/issues/1591
|
||||
# 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 ("cmake")
|
||||
depends_on ("lapack")
|
||||
@ -174,6 +176,19 @@ def install(self, spec, prefix):
|
||||
make('release')
|
||||
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
|
||||
# FIXME: switch step-40 to MPI run
|
||||
with working_dir('examples/step-40'):
|
||||
|
@ -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')
|
@ -36,6 +36,8 @@ class Git(Package):
|
||||
depends_on("curl", when="+curl")
|
||||
depends_on("expat", when="+expat")
|
||||
|
||||
# Also depends_on gettext: apt-get install gettext (Ubuntu)
|
||||
|
||||
# Use system perl for now.
|
||||
# depends_on("perl")
|
||||
# depends_on("pcre")
|
||||
|
@ -14,6 +14,9 @@ class Libxcb(Package):
|
||||
depends_on("python")
|
||||
depends_on("xcb-proto")
|
||||
|
||||
# depends_on('pthread') # Ubuntu: apt-get install libpthread-stubs0-dev
|
||||
# depends_on('xau') # Ubuntu: apt-get install libxau-dev
|
||||
|
||||
def patch(self):
|
||||
filter_file('typedef struct xcb_auth_info_t {', 'typedef struct {', 'src/xcb.h')
|
||||
|
||||
|
@ -79,10 +79,28 @@ def install(self, spec, prefix):
|
||||
if '+double' in spec:
|
||||
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):
|
||||
cmake(source_directory, *options)
|
||||
make()
|
||||
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
|
||||
GKlib_dist = join_path(prefix.include,'GKlib')
|
||||
|
@ -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")
|
@ -1,7 +1,11 @@
|
||||
from spack import *
|
||||
|
||||
class NetcdfCxx(Package):
|
||||
"""C++ compatibility bindings for NetCDF"""
|
||||
"""Deprecated C++ compatibility bindings for NetCDF.
|
||||
These do NOT read or write NetCDF-4 files, and are no longer
|
||||
maintained by Unidata. Developers should migrate to current
|
||||
NetCDF C++ bindings, in Spack package netcdf-cxx4."""
|
||||
|
||||
homepage = "http://www.unidata.ucar.edu/software/netcdf"
|
||||
url = "http://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-cxx-4.2.tar.gz"
|
||||
|
||||
|
13
var/spack/repos/builtin/packages/py-mpmath/package.py
Normal file
13
var/spack/repos/builtin/packages/py-mpmath/package.py
Normal file
@ -0,0 +1,13 @@
|
||||
from spack import *
|
||||
|
||||
class PyMpmath(Package):
|
||||
"""A Python library for arbitrary-precision floating-point arithmetic."""
|
||||
homepage = "http://mpmath.org"
|
||||
url = "https://pypi.python.org/packages/source/m/mpmath/mpmath-all-0.19.tar.gz"
|
||||
|
||||
version('0.19', 'd1b7e19dd6830d0d7b5e1bc93d46c02c')
|
||||
|
||||
extends('python')
|
||||
|
||||
def install(self, spec, prefix):
|
||||
python('setup.py', 'install', '--prefix=%s' % prefix)
|
@ -1,4 +1,5 @@
|
||||
from spack import *
|
||||
import os
|
||||
|
||||
class PyPillow(Package):
|
||||
"""Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. The Python Imaging Library (PIL) adds image processing capabilities to your Python interpreter. This library supports many file formats, and provides powerful image processing and graphics capabilities."""
|
||||
@ -7,8 +8,68 @@ class PyPillow(Package):
|
||||
url = "https://pypi.python.org/packages/source/P/Pillow/Pillow-3.0.0.tar.gz"
|
||||
|
||||
version('3.0.0', 'fc8ac44e93da09678eac7e30c9b7377d')
|
||||
provides('PIL')
|
||||
|
||||
# These defaults correspond to Pillow defaults
|
||||
variant('jpeg', default=True, description='Provide JPEG functionality')
|
||||
variant('zlib', default=True, description='Access to compressed PNGs')
|
||||
variant('tiff', default=False, description='Access to TIFF files')
|
||||
variant('freetype', default=False, description='Font related services')
|
||||
variant('tk', default=False, description='Support for tkinter bitmap and photo images')
|
||||
variant('lcms', default=False, description='Color management')
|
||||
|
||||
# Spack does not (yet) support these modes of building
|
||||
# variant('webp', default=False, description='')
|
||||
# variant('webpmux', default=False, description='')
|
||||
# variant('jpeg2000', default=False, description='')
|
||||
|
||||
extends('python')
|
||||
depends_on('binutils')
|
||||
depends_on('py-setuptools')
|
||||
|
||||
depends_on('jpeg', when='+jpeg') # BUG: It will use the system libjpeg anyway
|
||||
depends_on('zlib', when='+zlib')
|
||||
depends_on('tiff', when='+tiff')
|
||||
depends_on('freetype', when='+freetype')
|
||||
depends_on('lcms', when='+lcms')
|
||||
depends_on('tcl', when='+tk')
|
||||
depends_on('tk', when='+tk')
|
||||
|
||||
def install(self, spec, prefix):
|
||||
python('setup.py', 'install', '--prefix=%s' % prefix)
|
||||
libpath=[]
|
||||
|
||||
if '+jpeg' in spec:
|
||||
libpath.append(join_path(spec['jpeg'].prefix, 'lib'))
|
||||
if '+zlib' in spec:
|
||||
libpath.append(join_path(spec['zlib'].prefix, 'lib'))
|
||||
if '+tiff' in spec:
|
||||
libpath.append(join_path(spec['tiff'].prefix, 'lib'))
|
||||
if '+freetype' in spec:
|
||||
libpath.append(join_path(spec['freetype'].prefix, 'lib'))
|
||||
if '+lcms' in spec:
|
||||
libpath.append(join_path(spec['lcms'].prefix, 'lib'))
|
||||
|
||||
# This has not been tested, and likely needs some other treatment.
|
||||
#if '+tk' in spec:
|
||||
# libpath.append(join_path(spec['tcl'].prefix, 'lib'))
|
||||
# libpath.append(join_path(spec['tk'].prefix, 'lib'))
|
||||
|
||||
# -------- Building
|
||||
cmd = ['build_ext',
|
||||
'--%s-jpeg' % ('enable' if '+jpeg' in spec else 'disable'),
|
||||
'--%s-zlib' % ('enable' if '+zlib' in spec else 'disable'),
|
||||
'--%s-tiff' % ('enable' if '+tiff' in spec else 'disable'),
|
||||
'--%s-freetype' % ('enable' if '+freetype' in spec else 'disable'),
|
||||
'--%s-lcms' % ('enable' if '+lcms' in spec else 'disable'),
|
||||
'-L'+':'.join(libpath) # NOTE: This does not make it find libjpeg
|
||||
]
|
||||
|
||||
#if '+tk' in spec:
|
||||
# cmd.extend(['--enable-tcl', '--enable-tk'])
|
||||
#else:
|
||||
# cmd.extend(['--disable-tcl', '--disable-tk'])
|
||||
|
||||
# --------- Installation
|
||||
cmd.extend(['install', '--prefix=%s' % prefix])
|
||||
|
||||
python('setup.py', *cmd)
|
||||
|
@ -6,8 +6,10 @@ class PySympy(Package):
|
||||
url = "https://pypi.python.org/packages/source/s/sympy/sympy-0.7.6.tar.gz"
|
||||
|
||||
version('0.7.6', '3d04753974306d8a13830008e17babca')
|
||||
version('1.0', '43e797de799f00f9e8fd2307dba9fab1')
|
||||
|
||||
extends('python')
|
||||
depends_on('py-mpmath', when='@1.0:')
|
||||
|
||||
def install(self, spec, prefix):
|
||||
python('setup.py', 'install', '--prefix=%s' % prefix)
|
||||
|
@ -10,10 +10,18 @@ class SuiteSparse(Package):
|
||||
|
||||
version('4.5.1', 'f0ea9aad8d2d1ffec66a5b6bfeff5319')
|
||||
|
||||
# FIXME: (see below)
|
||||
# variant('tbb', default=True, description='Build with Intel TBB')
|
||||
|
||||
depends_on('blas')
|
||||
depends_on('lapack')
|
||||
|
||||
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):
|
||||
# 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.
|
||||
# Any kind of customization will need to go through filtering of that file
|
||||
|
||||
# FIXME : this actually uses the current workaround
|
||||
# FIXME : (blas / lapack always provide libblas and liblapack as aliases)
|
||||
make('install', 'INSTALL=%s' % prefix,
|
||||
make_args = ['INSTALL=%s' % prefix]
|
||||
|
||||
# inject Spack compiler wrappers
|
||||
make_args.extend([
|
||||
'AUTOCC=no',
|
||||
'CC=cc',
|
||||
'CXX=c++',
|
||||
'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
|
||||
# FIXME : (blas / lapack always provide libblas and liblapack as aliases)
|
||||
make_args.extend([
|
||||
'BLAS=-lblas',
|
||||
'LAPACK=-llapack')
|
||||
'LAPACK=-llapack'
|
||||
])
|
||||
|
||||
make('install', *make_args)
|
||||
|
@ -10,8 +10,13 @@ class Tcl(Package):
|
||||
extensible."""
|
||||
homepage = "http://www.tcl.tk"
|
||||
|
||||
version('8.6.3', 'db382feca91754b7f93da16dc4cdad1f',
|
||||
url="http://prdownloads.sourceforge.net/tcl/tcl8.6.3-src.tar.gz")
|
||||
def url_for_version(self, version):
|
||||
return 'http://prdownloads.sourceforge.net/tcl/tcl%s-src.tar.gz' % version
|
||||
|
||||
version('8.6.5', '0e6426a4ca9401825fbc6ecf3d89a326')
|
||||
version('8.6.4', 'd7cbb91f1ded1919370a30edd1534304')
|
||||
version('8.6.3', 'db382feca91754b7f93da16dc4cdad1f')
|
||||
version('8.5.19', '0e6426a4ca9401825fbc6ecf3d89a326')
|
||||
|
||||
depends_on('zlib')
|
||||
|
||||
|
@ -8,9 +8,11 @@ class Tk(Package):
|
||||
applications that run unchanged across Windows, Mac OS X, Linux
|
||||
and more."""
|
||||
homepage = "http://www.tcl.tk"
|
||||
url = "http://prdownloads.sourceforge.net/tcl/tk8.6.3-src.tar.gz"
|
||||
|
||||
version('src', '85ca4dbf4dcc19777fd456f6ee5d0221')
|
||||
def url_for_version(self, version):
|
||||
return "http://prdownloads.sourceforge.net/tcl/tk%s-src.tar.gz" % version
|
||||
|
||||
version('8.6.3', '85ca4dbf4dcc19777fd456f6ee5d0221')
|
||||
|
||||
depends_on("tcl")
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user