Allow per-version URLs instead of one single URL per package.

This commit is contained in:
Todd Gamblin 2014-07-30 23:30:07 -07:00
parent 5829b44648
commit 1ad474f1a9
48 changed files with 312 additions and 208 deletions

View File

@ -119,9 +119,8 @@ def caller_locals():
def get_calling_package_name(): def get_calling_package_name():
"""Make sure that the caller is a class definition, and return """Make sure that the caller is a class definition, and return the
the module's name. This is useful for getting the name of module's name.
spack packages from inside a relation function.
""" """
stack = inspect.stack() stack = inspect.stack()
try: try:
@ -144,7 +143,8 @@ def get_calling_package_name():
def attr_required(obj, attr_name): def attr_required(obj, attr_name):
"""Ensure that a class has a required attribute.""" """Ensure that a class has a required attribute."""
if not hasattr(obj, attr_name): if not hasattr(obj, attr_name):
tty.die("No required attribute '%s' in class '%s'" raise RequiredAttributeError(
"No required attribute '%s' in class '%s'"
% (attr_name, obj.__class__.__name__)) % (attr_name, obj.__class__.__name__))
@ -259,3 +259,8 @@ def in_function(function_name):
return False return False
finally: finally:
del stack del stack
class RequiredAttributeError(ValueError):
def __init__(self, message):
super(RequiredAttributeError, self).__init__(message)

View File

@ -32,7 +32,7 @@
# TODO: maybe this should be separated out and should go in build_environment.py? # TODO: maybe this should be separated out and should go in build_environment.py?
# TODO: it's not clear where all the stuff that needs to be included in packages # TODO: it's not clear where all the stuff that needs to be included in packages
# should live. This file is overloaded for spack core vs. for packages. # should live. This file is overloaded for spack core vs. for packages.
__all__ = ['Package', 'when', 'provides', 'depends_on', __all__ = ['Package', 'when', 'provides', 'depends_on', 'version',
'patch', 'Version', 'working_dir', 'which', 'Executable', 'patch', 'Version', 'working_dir', 'which', 'Executable',
'filter_file', 'change_sed_delimiter'] 'filter_file', 'change_sed_delimiter']
@ -146,6 +146,6 @@
# #
from llnl.util.filesystem import working_dir from llnl.util.filesystem import working_dir
from spack.package import Package from spack.package import Package
from spack.relations import depends_on, provides, patch from spack.relations import *
from spack.multimethod import when from spack.multimethod import when
from spack.version import Version from spack.version import Version

View File

@ -70,7 +70,7 @@ class ${class_name}(Package):
homepage = "http://www.example.com" homepage = "http://www.example.com"
url = "${url}" url = "${url}"
versions = ${versions} ${versions}
def install(self, spec, prefix): def install(self, spec, prefix):
# FIXME: Modify the configure line to suit your build system here. # FIXME: Modify the configure line to suit your build system here.
@ -114,13 +114,11 @@ def __call__(self, stage):
self.configure = '%s\n # %s' % (autotools, cmake) self.configure = '%s\n # %s' % (autotools, cmake)
def make_version_dict(ver_hash_tuples): def make_version_calls(ver_hash_tuples):
max_len = max(len(str(v)) for v,hfg in ver_hash_tuples) """Adds a version() call to the package for each version found."""
width = max_len + 2 max_len = max(len(str(v)) for v, h in ver_hash_tuples)
format = "%-" + str(width) + "s : '%s'," format = " version(%%-%ds, '%%s')" % (max_len + 2)
sep = '\n ' return '\n'.join(format % ("'%s'" % v, h) for v, h in ver_hash_tuples)
return '{ ' + sep.join(format % ("'%s'" % v, h)
for v, h in ver_hash_tuples) + ' }'
def get_name(): def get_name():
@ -195,7 +193,7 @@ def create(parser, args):
configure=guesser.configure, configure=guesser.configure,
class_name=mod_to_class(name), class_name=mod_to_class(name),
url=url, url=url,
versions=make_version_dict(ver_hash_tuples))) versions=make_version_calls(ver_hash_tuples)))
# If everything checks out, go ahead and edit. # If everything checks out, go ahead and edit.
spack.editor(pkg_path) spack.editor(pkg_path)

View File

@ -44,7 +44,7 @@ class ${class_name}(Package):
homepage = "http://www.example.com" homepage = "http://www.example.com"
url = "http://www.example.com/${name}-1.0.tar.gz" url = "http://www.example.com/${name}-1.0.tar.gz"
versions = { '1.0' : '0123456789abcdef0123456789abcdef' } version('1.0', '0123456789abcdef0123456789abcdef')
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=%s" % prefix) configure("--prefix=%s" % prefix)

View File

@ -72,7 +72,7 @@ def concretize_version(self, spec):
if valid_versions: if valid_versions:
spec.versions = ver([valid_versions[-1]]) spec.versions = ver([valid_versions[-1]])
else: else:
spec.versions = ver([pkg.default_version]) raise NoValidVerionError(spec)
def concretize_architecture(self, spec): def concretize_architecture(self, spec):
@ -158,3 +158,11 @@ def __init__(self, compiler_spec):
super(UnavailableCompilerVersionError, self).__init__( super(UnavailableCompilerVersionError, self).__init__(
"No available compiler version matches '%s'" % compiler_spec, "No available compiler version matches '%s'" % compiler_spec,
"Run 'spack compilers' to see available compiler Options.") "Run 'spack compilers' to see available compiler Options.")
class NoValidVerionError(spack.error.SpackError):
"""Raised when there is no available version for a package that
satisfies a spec."""
def __init__(self, spec):
super(NoValidVerionError, self).__init__(
"No available version of %s matches '%s'" % (spec.name, spec.versions))

View File

@ -296,9 +296,12 @@ class SomePackage(Package):
""" """
# #
# These variables are defaults for the various relations defined on # These variables are defaults for the various "relations".
# packages. Subclasses will have their own versions of these.
# #
"""Map of information about Versions of this package.
Map goes: Version -> VersionDescriptor"""
versions = {}
"""Specs of dependency packages, keyed by name.""" """Specs of dependency packages, keyed by name."""
dependencies = {} dependencies = {}
@ -317,16 +320,10 @@ class SomePackage(Package):
"""By default we build in parallel. Subclasses can override this.""" """By default we build in parallel. Subclasses can override this."""
parallel = True parallel = True
"""Dirty hack for forcing packages with uninterpretable URLs
TODO: get rid of this.
"""
force_url = False
def __init__(self, spec): def __init__(self, spec):
# These attributes are required for all packages. # These attributes are required for all packages.
attr_required(self.__class__, 'homepage') attr_required(self.__class__, 'homepage')
attr_required(self.__class__, 'url')
# this determines how the package should be built. # this determines how the package should be built.
self.spec = spec self.spec = spec
@ -337,24 +334,32 @@ def __init__(self, spec):
if '.' in self.name: if '.' in self.name:
self.name = self.name[self.name.rindex('.') + 1:] self.name = self.name[self.name.rindex('.') + 1:]
# Make sure URL is an allowed type
validate_package_url(self.url)
# patch up the URL with a new version if the spec version is concrete
if self.spec.versions.concrete:
self.url = self.url_for_version(self.spec.version)
# This is set by scraping a web page. # This is set by scraping a web page.
self._available_versions = None self._available_versions = None
# versions should be a dict from version to checksum, for safe versions # Sanity check some required variables that could be
# of this package. If it's not present, make it an empty dict. # overridden by package authors.
if not hasattr(self, 'versions'): def sanity_check_dict(attr_name):
self.versions = {} if not hasattr(self, attr_name):
raise PackageError("Package %s must define %s" % attr_name)
if not isinstance(self.versions, dict): attr = getattr(self, attr_name)
raise ValueError("versions attribute of package %s must be a dict!" if not isinstance(attr, dict):
% self.name) raise PackageError("Package %s has non-dict %s attribute!"
% (self.name, attr_name))
sanity_check_dict('versions')
sanity_check_dict('dependencies')
sanity_check_dict('conflicted')
sanity_check_dict('patches')
# Check versions in the versions dict.
for v in self.versions:
assert(isinstance(v, Version))
# Check version descriptors
for v in sorted(self.versions):
vdesc = self.versions[v]
assert(isinstance(vdesc, spack.relations.VersionDescriptor))
# Version-ize the keys in versions dict # Version-ize the keys in versions dict
try: try:
@ -366,6 +371,10 @@ def __init__(self, spec):
# stage used to build this package. # stage used to build this package.
self._stage = None self._stage = None
# patch up self.url based on the actual version
if self.spec.concrete:
self.url = self.url_for_version(self.version)
# Set a default list URL (place to find available versions) # Set a default list URL (place to find available versions)
if not hasattr(self, 'list_url'): if not hasattr(self, 'list_url'):
self.list_url = None self.list_url = None
@ -374,18 +383,6 @@ def __init__(self, spec):
self.list_depth = 1 self.list_depth = 1
@property
def default_version(self):
"""Get the version in the default URL for this package,
or fails."""
try:
return url.parse_version(self.__class__.url)
except UndetectableVersionError:
raise PackageError(
"Couldn't extract a default version from %s." % self.url,
" You must specify it explicitly in the package file.")
@property @property
def version(self): def version(self):
if not self.spec.concrete: if not self.spec.concrete:
@ -514,16 +511,50 @@ def url_version(self, version):
override this, e.g. for boost versions where you need to ensure that there override this, e.g. for boost versions where you need to ensure that there
are _'s in the download URL. are _'s in the download URL.
""" """
if self.force_url:
return self.default_version
return str(version) return str(version)
def url_for_version(self, version): def url_for_version(self, version):
"""Gives a URL that you can download a new version of this package from.""" """Returns a URL that you can download a new version of this package from."""
if self.force_url: if not isinstance(version, Version):
return self.url version = Version(version)
return url.substitute_version(self.__class__.url, self.url_version(version))
def nearest_url(version):
"""Finds the URL for the next lowest version with a URL.
If there is no lower version with a URL, uses the
package url property. If that isn't there, uses a
*higher* URL, and if that isn't there raises an error.
"""
url = getattr(self, 'url', None)
for v in sorted(self.versions):
if v > version and url:
break
if self.versions[v].url:
url = self.versions[v].url
if not url:
raise PackageVersionError(v)
return url
if version in self.versions:
vdesc = self.versions[version]
if not vdesc.url:
base_url = nearest_url(version)
vdesc.url = url.substitute_version(
base_url, self.url_version(version))
return vdesc.url
else:
return nearest_url(version)
@property
def default_url(self):
if self.concrete:
return self.url_for_version(self.version)
else:
url = getattr(self, 'url', None)
if url:
return url
def remove_prefix(self): def remove_prefix(self):
@ -548,7 +579,7 @@ def do_fetch(self):
self.stage.fetch() self.stage.fetch()
if spack.do_checksum and self.version in self.versions: if spack.do_checksum and self.version in self.versions:
digest = self.versions[self.version] digest = self.versions[self.version].checksum
self.stage.check(digest) self.stage.check(digest)
tty.msg("Checksum passed for %s@%s" % (self.name, self.version)) tty.msg("Checksum passed for %s@%s" % (self.name, self.version))
@ -779,6 +810,9 @@ def do_clean_dist(self):
def fetch_available_versions(self): def fetch_available_versions(self):
if not hasattr(self, 'url'):
raise VersionFetchError(self.__class__)
# If not, then try to fetch using list_url # If not, then try to fetch using list_url
if not self._available_versions: if not self._available_versions:
try: try:
@ -865,7 +899,6 @@ def print_pkg(message):
print message print message
class FetchError(spack.error.SpackError): class FetchError(spack.error.SpackError):
"""Raised when something goes wrong during fetch.""" """Raised when something goes wrong during fetch."""
def __init__(self, message, long_msg=None): def __init__(self, message, long_msg=None):
@ -889,3 +922,19 @@ class InvalidPackageDependencyError(PackageError):
its dependencies.""" its dependencies."""
def __init__(self, message): def __init__(self, message):
super(InvalidPackageDependencyError, self).__init__(message) super(InvalidPackageDependencyError, self).__init__(message)
class PackageVersionError(PackageError):
"""Raised when a version URL cannot automatically be determined."""
def __init__(self, version):
super(PackageVersionError, self).__init__(
"Cannot determine a URL automatically for version %s." % version,
"Please provide a url for this version in the package.py file.")
class VersionFetchError(PackageError):
"""Raised when a version URL cannot automatically be determined."""
def __init__(self, cls):
super(VersionFetchError, self).__init__(
"Cannot fetch version for package %s " % cls.__name__ +
"because it does not define a default url.")

View File

@ -68,6 +68,8 @@ class Mpileaks(Package):
spack install mpileaks ^mvapich spack install mpileaks ^mvapich
spack install mpileaks ^mpich spack install mpileaks ^mpich
""" """
__all__ = [ 'depends_on', 'provides', 'patch', 'version' ]
import re import re
import inspect import inspect
import importlib import importlib
@ -77,14 +79,38 @@ class Mpileaks(Package):
import spack import spack
import spack.spec import spack.spec
import spack.error import spack.error
import spack.url
from spack.version import Version
from spack.patch import Patch from spack.patch import Patch
from spack.spec import Spec, parse_anonymous_spec from spack.spec import Spec, parse_anonymous_spec
"""Adds a dependencies local variable in the locals of class VersionDescriptor(object):
the calling class, based on args. """ """A VersionDescriptor contains information to describe a
particular version of a package. That currently includes a URL
for the version along with a checksum."""
def __init__(self, checksum, url):
self.checksum = checksum
self.url = url
def version(ver, checksum, **kwargs):
"""Adds a version and associated metadata to the package."""
pkg = caller_locals()
versions = pkg.setdefault('versions', {})
patches = pkg.setdefault('patches', {})
ver = Version(ver)
url = kwargs.get('url', None)
versions[ver] = VersionDescriptor(checksum, url)
def depends_on(*specs): def depends_on(*specs):
"""Adds a dependencies local variable in the locals of
the calling class, based on args. """
pkg = get_calling_package_name() pkg = get_calling_package_name()
dependencies = caller_locals().setdefault('dependencies', {}) dependencies = caller_locals().setdefault('dependencies', {})

View File

@ -29,19 +29,35 @@
import spack import spack
import spack.url as url import spack.url as url
from spack.packages import PackageDB
class PackageSanityTest(unittest.TestCase): class PackageSanityTest(unittest.TestCase):
def test_get_all_packages(self): def check_db(self):
"""Get all packages once and make sure that works.""" """Get all packages in a DB to make sure they work."""
for name in spack.db.all_package_names(): for name in spack.db.all_package_names():
spack.db.get(name) spack.db.get(name)
def test_get_all_packages(self):
"""Get all packages once and make sure that works."""
self.check_db()
def test_get_all_mock_packages(self):
"""Get the mock packages once each too."""
tmp = spack.db
spack.db = PackageDB(spack.mock_packages_path)
self.check_db()
spack.db = tmp
def test_url_versions(self): def test_url_versions(self):
"""Ensure that url_for_version does the right thing for at least the """Check URLs for regular packages, if they are explicitly defined."""
default version of each package.
"""
for pkg in spack.db.all_packages(): for pkg in spack.db.all_packages():
v = url.parse_version(pkg.url) for v, vdesc in pkg.versions.items():
self.assertEqual(pkg.url, pkg.url_for_version(v)) if vdesc.url:
# If there is a url for the version check it.
v_url = pkg.url_for_version(v)
self.assertEqual(vdesc.url, v_url)

View File

@ -82,12 +82,16 @@ def parse_version_string_with_indices(path):
"""Try to extract a version string from a filename or URL. This is taken """Try to extract a version string from a filename or URL. This is taken
largely from Homebrew's Version class.""" largely from Homebrew's Version class."""
if os.path.isdir(path): # Strip off sourceforge download stuffix.
if re.search(r'((?:sourceforge.net|sf.net)/.*)/download$', path):
path = os.path.dirname(path)
# Strip archive extension
path = comp.strip_extension(path)
# Take basename to avoid including parent dirs in version name
# Remember the offset of the stem in the full path.
stem = os.path.basename(path) stem = os.path.basename(path)
elif re.search(r'((?:sourceforge.net|sf.net)/.*)/download$', path):
stem = comp.stem(os.path.dirname(path))
else:
stem = comp.stem(path)
version_types = [ version_types = [
# GitHub tarballs, e.g. v1.2.3 # GitHub tarballs, e.g. v1.2.3
@ -137,10 +141,10 @@ def parse_version_string_with_indices(path):
(r'_((\d+\.)+\d+[a-z]?)[.]orig$', stem), (r'_((\d+\.)+\d+[a-z]?)[.]orig$', stem),
# e.g. http://www.openssl.org/source/openssl-0.9.8s.tar.gz # e.g. http://www.openssl.org/source/openssl-0.9.8s.tar.gz
(r'-([^-]+)', stem), (r'-([^-]+(-alpha|-beta)?)', stem),
# e.g. astyle_1.23_macosx.tar.gz # e.g. astyle_1.23_macosx.tar.gz
(r'_([^_]+)', stem), (r'_([^_]+(_alpha|_beta)?)', stem),
# e.g. http://mirrors.jenkins-ci.org/war/1.486/jenkins.war # e.g. http://mirrors.jenkins-ci.org/war/1.486/jenkins.war
(r'\/(\d\.\d+)\/', path), (r'\/(\d\.\d+)\/', path),
@ -152,7 +156,9 @@ def parse_version_string_with_indices(path):
regex, match_string = vtype[:2] regex, match_string = vtype[:2]
match = re.search(regex, match_string) match = re.search(regex, match_string)
if match and match.group(1) is not None: if match and match.group(1) is not None:
return match.group(1), match.start(1), match.end(1) version = match.group(1)
start = path.index(version)
return version, start, start+len(version)
raise UndetectableVersionError(path) raise UndetectableVersionError(path)

View File

@ -48,7 +48,7 @@ def decompressor_for(path):
return tar return tar
def stem(path): def strip_extension(path):
"""Get the part of a path that does not include its compressed """Get the part of a path that does not include its compressed
type extension.""" type extension."""
for type in ALLOWED_ARCHIVE_TYPES: for type in ALLOWED_ARCHIVE_TYPES:

View File

@ -181,7 +181,7 @@ def a_or_n(seg):
# Add possible alpha or beta indicator at the end of each segemnt # Add possible alpha or beta indicator at the end of each segemnt
# We treat these specially b/c they're so common. # We treat these specially b/c they're so common.
wc += '[ab]?)?' * (len(segments) - 1) wc += '(?:[a-z]|alpha|beta)?)?' * (len(segments) - 1)
return wc return wc

View File

@ -28,9 +28,9 @@ class Callpath(Package):
homepage = "https://github.com/tgamblin/callpath" homepage = "https://github.com/tgamblin/callpath"
url = "http://github.com/tgamblin/callpath-1.0.tar.gz" url = "http://github.com/tgamblin/callpath-1.0.tar.gz"
versions = { 0.8 : 'foobarbaz', version(0.8, 'foobarbaz')
0.9 : 'foobarbaz', version(0.9, 'foobarbaz')
1.0 : 'foobarbaz' } version(1.0, 'foobarbaz')
depends_on("dyninst") depends_on("dyninst")
depends_on("mpi") depends_on("mpi")

View File

@ -28,7 +28,7 @@ class DirectMpich(Package):
homepage = "http://www.example.com" homepage = "http://www.example.com"
url = "http://www.example.com/direct_mpich-1.0.tar.gz" url = "http://www.example.com/direct_mpich-1.0.tar.gz"
versions = { 1.0 : 'foobarbaz' } version('1.0', 'foobarbaz')
depends_on('mpich') depends_on('mpich')

View File

@ -29,9 +29,8 @@ class Dyninst(Package):
url = "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1.2/DyninstAPI-8.1.2.tgz" url = "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1.2/DyninstAPI-8.1.2.tgz"
list_url = "http://www.dyninst.org/downloads/dyninst-8.x" list_url = "http://www.dyninst.org/downloads/dyninst-8.x"
versions = { version('8.1.2', 'bf03b33375afa66fe0efa46ce3f4b17a')
'8.1.2' : 'bf03b33375afa66fe0efa46ce3f4b17a', version('8.1.1', '1f8743e3a5662b25ce64a7edf647e77d')
'8.1.1' : '1f8743e3a5662b25ce64a7edf647e77d' }
depends_on("libelf") depends_on("libelf")
depends_on("libdwarf") depends_on("libdwarf")

View File

@ -27,7 +27,8 @@
class Fake(Package): class Fake(Package):
homepage = "http://www.fake-spack-example.org" homepage = "http://www.fake-spack-example.org"
url = "http://www.fake-spack-example.org/downloads/fake-1.0.tar.gz" url = "http://www.fake-spack-example.org/downloads/fake-1.0.tar.gz"
versions = { '1.0' : 'foobarbaz' }
version('1.0', 'foobarbaz')
def install(self, spec, prefix): def install(self, spec, prefix):
pass pass

View File

@ -32,7 +32,7 @@ class IndirectMpich(Package):
homepage = "http://www.example.com" homepage = "http://www.example.com"
url = "http://www.example.com/indirect_mpich-1.0.tar.gz" url = "http://www.example.com/indirect_mpich-1.0.tar.gz"
versions = { 1.0 : 'foobarbaz' } version(1.0, 'foobarbaz')
depends_on('mpi') depends_on('mpi')
depends_on('direct_mpich') depends_on('direct_mpich')

View File

@ -33,10 +33,10 @@ class Libdwarf(Package):
url = "http://www.prevanders.net/libdwarf-20130729.tar.gz" url = "http://www.prevanders.net/libdwarf-20130729.tar.gz"
list_url = homepage list_url = homepage
versions = { 20130729 : "64b42692e947d5180e162e46c689dfbf", version(20130729, "64b42692e947d5180e162e46c689dfbf")
20130207 : 'foobarbaz', version(20130207, 'foobarbaz')
20111030 : 'foobarbaz', version(20111030, 'foobarbaz')
20070703 : 'foobarbaz' } version(20070703, 'foobarbaz')
depends_on("libelf") depends_on("libelf")

View File

@ -28,9 +28,9 @@ class Libelf(Package):
homepage = "http://www.mr511.de/software/english.html" homepage = "http://www.mr511.de/software/english.html"
url = "http://www.mr511.de/software/libelf-0.8.13.tar.gz" url = "http://www.mr511.de/software/libelf-0.8.13.tar.gz"
versions = {'0.8.13' : '4136d7b4c04df68b686570afa26988ac', version('0.8.13', '4136d7b4c04df68b686570afa26988ac')
'0.8.12' : 'e21f8273d9f5f6d43a59878dc274fec7', version('0.8.12', 'e21f8273d9f5f6d43a59878dc274fec7')
'0.8.10' : '9db4d36c283d9790d8fa7df1f4d7b4d9' } version('0.8.10', '9db4d36c283d9790d8fa7df1f4d7b4d9')
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=%s" % prefix, configure("--prefix=%s" % prefix,

View File

@ -30,11 +30,11 @@ class Mpich(Package):
list_url = "http://www.mpich.org/static/downloads/" list_url = "http://www.mpich.org/static/downloads/"
list_depth = 2 list_depth = 2
versions = { '3.0.4' : '9c5d5d4fe1e17dd12153f40bc5b6dbc0', version('3.0.4', '9c5d5d4fe1e17dd12153f40bc5b6dbc0')
'3.0.3' : 'foobarbaz', version('3.0.3', 'foobarbaz')
'3.0.2' : 'foobarbaz', version('3.0.2', 'foobarbaz')
'3.0.1' : 'foobarbaz', version('3.0.1', 'foobarbaz')
'3.0' : 'foobarbaz' } version('3.0', 'foobarbaz')
provides('mpi@:3', when='@3:') provides('mpi@:3', when='@3:')
provides('mpi@:1', when='@1:') provides('mpi@:1', when='@1:')

View File

@ -30,12 +30,12 @@ class Mpich2(Package):
list_url = "http://www.mpich.org/static/downloads/" list_url = "http://www.mpich.org/static/downloads/"
list_depth = 2 list_depth = 2
versions = { '1.5' : '9c5d5d4fe1e17dd12153f40bc5b6dbc0', version('1.5', '9c5d5d4fe1e17dd12153f40bc5b6dbc0')
'1.4' : 'foobarbaz', version('1.4', 'foobarbaz')
'1.3' : 'foobarbaz', version('1.3', 'foobarbaz')
'1.2' : 'foobarbaz', version('1.2', 'foobarbaz')
'1.1' : 'foobarbaz', version('1.1', 'foobarbaz')
'1.0' : 'foobarbaz' } version('1.0', 'foobarbaz')
provides('mpi@:2.0') provides('mpi@:2.0')
provides('mpi@:2.1', when='@1.1:') provides('mpi@:2.1', when='@1.1:')

View File

@ -28,10 +28,10 @@ class Mpileaks(Package):
homepage = "http://www.llnl.gov" homepage = "http://www.llnl.gov"
url = "http://www.llnl.gov/mpileaks-1.0.tar.gz" url = "http://www.llnl.gov/mpileaks-1.0.tar.gz"
versions = { 1.0 : 'foobarbaz', version(1.0, 'foobarbaz')
2.1 : 'foobarbaz', version(2.1, 'foobarbaz')
2.2 : 'foobarbaz', version(2.2, 'foobarbaz')
2.3 : 'foobarbaz' } version(2.3, 'foobarbaz')
depends_on("mpi") depends_on("mpi")
depends_on("callpath") depends_on("callpath")

View File

@ -30,7 +30,7 @@ class TrivialInstallTestPackage(Package):
homepage = "http://www.example.com/trivial_install" homepage = "http://www.example.com/trivial_install"
url = "http://www.unit-test-should-replace-this-url/trivial_install-1.0.tar.gz" url = "http://www.unit-test-should-replace-this-url/trivial_install-1.0.tar.gz"
versions = { '1.0' : 'foobarbaz' } version('1.0', 'foobarbaz')
def install(self, spec, prefix): def install(self, spec, prefix):
configure('--prefix=%s' % prefix) configure('--prefix=%s' % prefix)

View File

@ -30,7 +30,7 @@ class Zmpi(Package):
homepage = "http://www.spack-fake-zmpi.org" homepage = "http://www.spack-fake-zmpi.org"
url = "http://www.spack-fake-zmpi.org/downloads/zmpi-1.0.tar.gz" url = "http://www.spack-fake-zmpi.org/downloads/zmpi-1.0.tar.gz"
versions = { '1.0' : 'foobarbaz' } version('1.0', 'foobarbaz')
provides('mpi@:10.0') provides('mpi@:10.0')
depends_on('fake') depends_on('fake')

View File

@ -11,17 +11,15 @@ class Samrai(Package):
url = "https://computation-rnd.llnl.gov/SAMRAI/download/SAMRAI-v3.7.3.tar.gz" url = "https://computation-rnd.llnl.gov/SAMRAI/download/SAMRAI-v3.7.3.tar.gz"
list_url = homepage list_url = homepage
versions = { version('3.7.3', '12d574eacadf8c9a70f1bb4cd1a69df6')
'3.7.3' : '12d574eacadf8c9a70f1bb4cd1a69df6', version('3.7.2', 'f6a716f171c9fdbf3cb12f71fa6e2737')
'3.7.2' : 'f6a716f171c9fdbf3cb12f71fa6e2737', version('3.6.3-beta', 'ef0510bf2893042daedaca434e5ec6ce')
'3.6.3-beta' : 'ef0510bf2893042daedaca434e5ec6ce', version('3.5.2-beta', 'd072d9d681eeb9ada15ce91bea784274')
'3.5.2-beta' : 'd072d9d681eeb9ada15ce91bea784274', version('3.5.0-beta', '1ad18a319fc573e12e2b1fbb6f6b0a19')
'3.5.0-beta' : '1ad18a319fc573e12e2b1fbb6f6b0a19', version('3.4.1-beta', '00814cbee2cb76bf8302aff56bbb385b')
'3.4.1-beta' : '00814cbee2cb76bf8302aff56bbb385b', version('3.3.3-beta', '1db3241d3e1cab913dc310d736c34388')
'3.3.3-beta' : '1db3241d3e1cab913dc310d736c34388', version('3.3.2-beta', 'e598a085dab979498fcb6c110c4dd26c')
'3.3.2-beta' : 'e598a085dab979498fcb6c110c4dd26c', version('2.4.4', '04fb048ed0efe7c531ac10c81cc5f6ac')
'2.4.4' : '04fb048ed0efe7c531ac10c81cc5f6ac',
}
depends_on("mpi") depends_on("mpi")
depends_on("zlib") depends_on("zlib")

View File

@ -14,32 +14,31 @@ class Boost(Package):
list_url = "http://sourceforge.net/projects/boost/files/boost/" list_url = "http://sourceforge.net/projects/boost/files/boost/"
list_depth = 2 list_depth = 2
versions = { version('1.55.0', 'd6eef4b4cacb2183f2bf265a5a03a354')
'1.55.0' : 'd6eef4b4cacb2183f2bf265a5a03a354', version('1.54.0', '15cb8c0803064faef0c4ddf5bc5ca279')
'1.54.0' : '15cb8c0803064faef0c4ddf5bc5ca279', version('1.53.0', 'a00d22605d5dbcfb4c9936a9b35bc4c2')
'1.53.0' : 'a00d22605d5dbcfb4c9936a9b35bc4c2', version('1.52.0', '3a855e0f919107e0ca4de4d84ad3f750')
'1.52.0' : '3a855e0f919107e0ca4de4d84ad3f750', version('1.51.0', '4b6bd483b692fd138aef84ed2c8eb679')
'1.51.0' : '4b6bd483b692fd138aef84ed2c8eb679', version('1.50.0', '52dd00be775e689f55a987baebccc462')
'1.50.0' : '52dd00be775e689f55a987baebccc462', version('1.49.0', '0d202cb811f934282dea64856a175698')
'1.49.0' : '0d202cb811f934282dea64856a175698', version('1.48.0', 'd1e9a7a7f532bb031a3c175d86688d95')
'1.48.0' : 'd1e9a7a7f532bb031a3c175d86688d95', version('1.47.0', 'a2dc343f7bc7f83f8941e47ed4a18200')
'1.47.0' : 'a2dc343f7bc7f83f8941e47ed4a18200', version('1.46.1', '7375679575f4c8db605d426fc721d506')
'1.46.1' : '7375679575f4c8db605d426fc721d506', version('1.46.0', '37b12f1702319b73876b0097982087e0')
'1.46.0' : '37b12f1702319b73876b0097982087e0', version('1.45.0', 'd405c606354789d0426bc07bea617e58')
'1.45.0' : 'd405c606354789d0426bc07bea617e58', version('1.44.0', 'f02578f5218f217a9f20e9c30e119c6a')
'1.44.0' : 'f02578f5218f217a9f20e9c30e119c6a', version('1.43.0', 'dd49767bfb726b0c774f7db0cef91ed1')
'1.43.0' : 'dd49767bfb726b0c774f7db0cef91ed1', version('1.42.0', '7bf3b4eb841b62ffb0ade2b82218ebe6')
'1.42.0' : '7bf3b4eb841b62ffb0ade2b82218ebe6', version('1.41.0', '8bb65e133907db727a2a825c5400d0a6')
'1.41.0' : '8bb65e133907db727a2a825c5400d0a6', version('1.40.0', 'ec3875caeac8c52c7c129802a8483bd7')
'1.40.0' : 'ec3875caeac8c52c7c129802a8483bd7', version('1.39.0', 'a17281fd88c48e0d866e1a12deecbcc0')
'1.39.0' : 'a17281fd88c48e0d866e1a12deecbcc0', version('1.38.0', '5eca2116d39d61382b8f8235915cb267')
'1.38.0' : '5eca2116d39d61382b8f8235915cb267', version('1.37.0', '8d9f990bfb7e83769fa5f1d6f065bc92')
'1.37.0' : '8d9f990bfb7e83769fa5f1d6f065bc92', version('1.36.0', '328bfec66c312150e4c2a78dcecb504b')
'1.36.0' : '328bfec66c312150e4c2a78dcecb504b', version('1.35.0', 'dce952a7214e72d6597516bcac84048b')
'1.35.0' : 'dce952a7214e72d6597516bcac84048b', version('1.34.1', '2d938467e8a448a2c9763e0a9f8ca7e5')
'1.34.1' : '2d938467e8a448a2c9763e0a9f8ca7e5', version('1.34.0', 'ed5b9291ffad776f8757a916e1726ad0')
'1.34.0' : 'ed5b9291ffad776f8757a916e1726ad0'
}
def url_for_version(self, version): def url_for_version(self, version):
"""Handle Boost's weird URLs, which write the version two different ways.""" """Handle Boost's weird URLs, which write the version two different ways."""

View File

@ -27,7 +27,8 @@
class Cmake(Package): class Cmake(Package):
homepage = 'https://www.cmake.org' homepage = 'https://www.cmake.org'
url = 'http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz' url = 'http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz'
versions = { '2.8.10.2' : '097278785da7182ec0aea8769d06860c' }
version('2.8.10.2', '097278785da7182ec0aea8769d06860c')
def install(self, spec, prefix): def install(self, spec, prefix):
configure('--prefix=' + prefix, configure('--prefix=' + prefix,

View File

@ -29,8 +29,8 @@ class Dyninst(Package):
url = "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1.2/DyninstAPI-8.1.2.tgz" url = "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1.2/DyninstAPI-8.1.2.tgz"
list_url = "http://www.dyninst.org/downloads/dyninst-8.x" list_url = "http://www.dyninst.org/downloads/dyninst-8.x"
versions = {'8.1.2' : 'bf03b33375afa66fe0efa46ce3f4b17a', version('8.1.2', 'bf03b33375afa66fe0efa46ce3f4b17a')
'8.1.1' : '1f8743e3a5662b25ce64a7edf647e77d' } version('8.1.1', '1f8743e3a5662b25ce64a7edf647e77d')
depends_on("libelf") depends_on("libelf")
depends_on("libdwarf") depends_on("libdwarf")

View File

@ -5,7 +5,7 @@ class Graphlib(Package):
homepage = "http://https://github.com/lee218llnl/graphlib" homepage = "http://https://github.com/lee218llnl/graphlib"
url = "https://github.com/lee218llnl/graphlib/archive/v2.0.0.tar.gz" url = "https://github.com/lee218llnl/graphlib/archive/v2.0.0.tar.gz"
versions = { '2.0.0' : '43c6df84f1d38ba5a5dce0ae19371a70', } version('2.0.0', '43c6df84f1d38ba5a5dce0ae19371a70')
def install(self, spec, prefix): def install(self, spec, prefix):
cmake(".", *std_cmake_args) cmake(".", *std_cmake_args)

View File

@ -11,7 +11,7 @@ class Hdf5(Package):
list_url = "http://www.hdfgroup.org/ftp/HDF5/releases" list_url = "http://www.hdfgroup.org/ftp/HDF5/releases"
list_depth = 3 list_depth = 3
versions = { '1.8.13' : 'c03426e9e77d7766944654280b467289', } version('1.8.13', 'c03426e9e77d7766944654280b467289')
depends_on("mpi") depends_on("mpi")
depends_on("zlib") depends_on("zlib")

View File

@ -28,7 +28,7 @@ class Launchmon(Package):
homepage = "http://sourceforge.net/projects/launchmon" homepage = "http://sourceforge.net/projects/launchmon"
url = "http://downloads.sourceforge.net/project/launchmon/launchmon/1.0.1%20release/launchmon-1.0.1.tar.gz" url = "http://downloads.sourceforge.net/project/launchmon/launchmon/1.0.1%20release/launchmon-1.0.1.tar.gz"
versions = { '1.0.1' : '2f12465803409fd07f91174a4389eb2b' } version('1.0.1', '2f12465803409fd07f91174a4389eb2b')
def install(self, spec, prefix): def install(self, spec, prefix):
configure( configure(

View File

@ -44,9 +44,9 @@ class Libdwarf(Package):
url = "http://www.prevanders.net/libdwarf-20130729.tar.gz" url = "http://www.prevanders.net/libdwarf-20130729.tar.gz"
list_url = homepage list_url = homepage
versions = { '20130729' : '4cc5e48693f7b93b7aa0261e63c0e21d', version('20130729', '4cc5e48693f7b93b7aa0261e63c0e21d')
'20130207' : '64b42692e947d5180e162e46c689dfbf', version('20130207', '64b42692e947d5180e162e46c689dfbf')
'20130126' : 'ded74a5e90edb5a12aac3c29d260c5db' } version('20130126', 'ded74a5e90edb5a12aac3c29d260c5db')
depends_on("libelf") depends_on("libelf")

View File

@ -33,8 +33,8 @@ class Libelf(Package):
homepage = "http://www.mr511.de/software/english.html" homepage = "http://www.mr511.de/software/english.html"
url = "http://www.mr511.de/software/libelf-0.8.13.tar.gz" url = "http://www.mr511.de/software/libelf-0.8.13.tar.gz"
versions = { '0.8.13' : '4136d7b4c04df68b686570afa26988ac', version('0.8.13', '4136d7b4c04df68b686570afa26988ac')
'0.8.12' : 'e21f8273d9f5f6d43a59878dc274fec7', } version('0.8.12', 'e21f8273d9f5f6d43a59878dc274fec7')
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=" + prefix, configure("--prefix=" + prefix,

View File

@ -11,18 +11,17 @@ class Libevent(Package):
url = "https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz" url = "https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz"
list_url = "http://libevent.org/old-releases.html" list_url = "http://libevent.org/old-releases.html"
versions = { version('2.0.21', 'b2405cc9ebf264aa47ff615d9de527a2')
'2.0.21' : 'b2405cc9ebf264aa47ff615d9de527a2', version('2.0.20', '94270cdee32c0cd0aa9f4ee6ede27e8e')
'2.0.20' : '94270cdee32c0cd0aa9f4ee6ede27e8e', version('2.0.19', '91111579769f46055b0a438f5cc59572')
'2.0.19' : '91111579769f46055b0a438f5cc59572', version('2.0.18', 'aa1ce9bc0dee7b8084f6855765f2c86a')
'2.0.18' : 'aa1ce9bc0dee7b8084f6855765f2c86a', version('2.0.17', 'dad64aaaaff16b5fbec25160c06fee9a')
'2.0.17' : 'dad64aaaaff16b5fbec25160c06fee9a', version('2.0.16', '899efcffccdb3d5111419df76e7dc8df')
'2.0.16' : '899efcffccdb3d5111419df76e7dc8df', version('2.0.15', '2643abe7ba242df15c08b2cc14ec8759')
'2.0.15' : '2643abe7ba242df15c08b2cc14ec8759', version('2.0.14', 'cac0f379da35d3b98f83ac16fcfe1df4')
'2.0.14' : 'cac0f379da35d3b98f83ac16fcfe1df4', version('2.0.13', 'af786b4b3f790c9d3279792edf7867fc')
'2.0.13' : 'af786b4b3f790c9d3279792edf7867fc', version('2.0.12', '42986228baf95e325778ed328a93e070')
'2.0.12' : '42986228baf95e325778ed328a93e070',
}
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=%s" % prefix) configure("--prefix=%s" % prefix)

View File

@ -28,7 +28,7 @@ class Libunwind(Package):
homepage = "http://www.nongnu.org/libunwind/" homepage = "http://www.nongnu.org/libunwind/"
url = "http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz" url = "http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz"
versions = { '1.1' : 'fb4ea2f6fbbe45bf032cd36e586883ce' } version('1.1', 'fb4ea2f6fbbe45bf032cd36e586883ce')
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=" + prefix) configure("--prefix=" + prefix)

View File

@ -32,7 +32,7 @@ class Mpich(Package):
list_url = "http://www.mpich.org/static/downloads/" list_url = "http://www.mpich.org/static/downloads/"
list_depth = 2 list_depth = 2
versions = { '3.0.4' : '9c5d5d4fe1e17dd12153f40bc5b6dbc0' } version('3.0.4', '9c5d5d4fe1e17dd12153f40bc5b6dbc0')
provides('mpi@:3', when='@3:') provides('mpi@:3', when='@3:')
provides('mpi@:1', when='@1:') provides('mpi@:1', when='@1:')

View File

@ -5,8 +5,9 @@ class Mrnet(Package):
homepage = "http://paradyn.org/mrnet" homepage = "http://paradyn.org/mrnet"
url = "ftp://ftp.cs.wisc.edu/paradyn/mrnet/mrnet_4.0.0.tar.gz" url = "ftp://ftp.cs.wisc.edu/paradyn/mrnet/mrnet_4.0.0.tar.gz"
versions = { '4.0.0' : 'd00301c078cba57ef68613be32ceea2f', } version('4.0.0', 'd00301c078cba57ef68613be32ceea2f')
versions = { '4.1.0' : '5a248298b395b329e2371bf25366115c', } version('4.1.0', '5a248298b395b329e2371bf25366115c')
parallel = False parallel = False
depends_on("boost") depends_on("boost")

View File

@ -2,11 +2,12 @@
class Mvapich2(Package): class Mvapich2(Package):
"""mvapich2 is an MPI implmenetation for infiniband networks.""" """mvapich2 is an MPI implmenetation for infiniband networks."""
homepage = "http://mvapich.cse.ohio-state.edu/" homepage = "http://mvapich.cse.ohio-state.edu/"
url = "http://mvapich.cse.ohio-state.edu/download/mvapich2/mv2/mvapich2-1.9.tgz"
versions = { '1.9' : '5dc58ed08fd3142c260b70fe297e127c', } version('1.9', '5dc58ed08fd3142c260b70fe297e127c',
url="http://mvapich.cse.ohio-state.edu/download/mvapich2/mv2/mvapich2-1.9.tgz")
version('2.0', '9fbb68a4111a8b6338e476dc657388b4',
url='http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.0.tar.gz')
provides('mpi@:1', when='@1.9:') provides('mpi@:1', when='@1.9:')

View File

@ -8,14 +8,12 @@ class Ncurses(Package):
""" """
homepage = "http://invisible-island.net/ncurses/ncurses.html" homepage = "http://invisible-island.net/ncurses/ncurses.html"
url = "http://invisible-island.net/datafiles/release/ncurses.tar.gz"
versions = { 'stable' : '8cb9c412e5f2d96bc6f459aa8c6282a1' } version('5.9', '8cb9c412e5f2d96bc6f459aa8c6282a1',
url='http://invisible-island.net/datafiles/release/ncurses.tar.gz')
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=%s" % prefix) configure("--prefix=%s" % prefix)
make() make()
make("install") make("install")
def url_for_version(self, version):
return "http://invisible-island.net/datafiles/release/ncurses.tar.gz"

View File

@ -12,7 +12,7 @@ class Openmpi(Package):
homepage = "http://www.open-mpi.org" homepage = "http://www.open-mpi.org"
url = "http://www.open-mpi.org/software/ompi/v1.6/downloads/openmpi-1.6.5.tar.bz2" url = "http://www.open-mpi.org/software/ompi/v1.6/downloads/openmpi-1.6.5.tar.bz2"
versions = { '1.6.5' : '03aed2a4aa4d0b27196962a2a65fc475', } version('1.6.5', '03aed2a4aa4d0b27196962a2a65fc475')
provides('mpi@:2') provides('mpi@:2')

View File

@ -8,7 +8,7 @@ class Parmetis(Package):
homepage = "http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview" homepage = "http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview"
url = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/parmetis-4.0.3.tar.gz" url = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/parmetis-4.0.3.tar.gz"
versions = { '4.0.3' : 'f69c479586bf6bb7aff6a9bc0c739628', } version('4.0.3', 'f69c479586bf6bb7aff6a9bc0c739628')
depends_on('mpi') depends_on('mpi')

View File

@ -30,7 +30,7 @@ class PmgrCollective(Package):
homepage = "http://www.sourceforge.net/projects/pmgrcollective" homepage = "http://www.sourceforge.net/projects/pmgrcollective"
url = "http://downloads.sourceforge.net/project/pmgrcollective/pmgrcollective/PMGR_COLLECTIVE-1.0/pmgr_collective-1.0.tgz" url = "http://downloads.sourceforge.net/project/pmgrcollective/pmgrcollective/PMGR_COLLECTIVE-1.0/pmgr_collective-1.0.tgz"
versions = { '1.0' : '0384d008774274cc3fc7b4d810dfd07e' } version('1.0', '0384d008774274cc3fc7b4d810dfd07e')
def install(self, spec, prefix): def install(self, spec, prefix):
make('PREFIX="' + prefix + '"') make('PREFIX="' + prefix + '"')

View File

@ -30,7 +30,7 @@ class Scr(Package):
depends_on("mpi") depends_on("mpi")
versions = { '1.1-7' : 'a5930e9ab27d1b7049447c2fd7734ebd' } version('1.1-7', 'a5930e9ab27d1b7049447c2fd7734ebd')
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=" + prefix, configure("--prefix=" + prefix,

View File

@ -29,7 +29,7 @@ class Spindle(Package):
url = "https://github.com/hpc/Spindle/archive/v0.8.1.tar.gz" url = "https://github.com/hpc/Spindle/archive/v0.8.1.tar.gz"
list_url = "https://github.com/hpc/Spindle/releases" list_url = "https://github.com/hpc/Spindle/releases"
versions = {'0.8.1' : 'f11793a6b9d8df2cd231fccb2857d912' } version('0.8.1', 'f11793a6b9d8df2cd231fccb2857d912')
depends_on("launchmon") depends_on("launchmon")

View File

@ -5,8 +5,8 @@ class Stat(Package):
homepage = "http://paradyn.org/STAT/STAT.html" homepage = "http://paradyn.org/STAT/STAT.html"
url = "https://github.com/lee218llnl/stat/archive/v2.0.0.tar.gz" url = "https://github.com/lee218llnl/stat/archive/v2.0.0.tar.gz"
versions = { '2.0.0' : 'c7494210b0ba26b577171b92838e1a9b', } version('2.0.0', 'c7494210b0ba26b577171b92838e1a9b')
versions = { '2.1.0' : 'ece26beaf057aa9134d62adcdda1ba91', } version('2.1.0', 'ece26beaf057aa9134d62adcdda1ba91')
depends_on('libdwarf') depends_on('libdwarf')
depends_on('dyninst') depends_on('dyninst')

View File

@ -10,7 +10,8 @@ class Tau(Package):
homepage = "http://www.cs.uoregon.edu/research/tau" homepage = "http://www.cs.uoregon.edu/research/tau"
url = "http://www.cs.uoregon.edu/research/paracomp/tau/tauprofile/dist/tau-2.23.1.tar.gz" url = "http://www.cs.uoregon.edu/research/paracomp/tau/tauprofile/dist/tau-2.23.1.tar.gz"
versions = { '2.23.1' : '6593b47ae1e7a838e632652f0426fe72', } version('2.23.1', '6593b47ae1e7a838e632652f0426fe72')
def install(self, spec, prefix): def install(self, spec, prefix):
# TAU isn't happy with directories that have '@' in the path. Sigh. # TAU isn't happy with directories that have '@' in the path. Sigh.

View File

@ -10,7 +10,7 @@ class Tmux(Package):
homepage = "http://tmux.sourceforge.net" homepage = "http://tmux.sourceforge.net"
url = "http://downloads.sourceforge.net/project/tmux/tmux/tmux-1.9/tmux-1.9a.tar.gz" url = "http://downloads.sourceforge.net/project/tmux/tmux/tmux-1.9/tmux-1.9a.tar.gz"
versions = { '1.9a' : 'b07601711f96f1d260b390513b509a2d', } version('1.9a', 'b07601711f96f1d260b390513b509a2d')
depends_on('libevent') depends_on('libevent')
depends_on('ncurses') depends_on('ncurses')

View File

@ -13,19 +13,17 @@ class Vim(Package):
url = "ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2" url = "ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2"
list_url = "http://ftp.vim.org/pub/vim/unix/" list_url = "http://ftp.vim.org/pub/vim/unix/"
versions = { version('7.4', '607e135c559be642f210094ad023dc65')
'7.4' : '607e135c559be642f210094ad023dc65', version('7.3', '5b9510a17074e2b37d8bb38ae09edbf2')
'7.3' : '5b9510a17074e2b37d8bb38ae09edbf2', version('7.2', 'f0901284b338e448bfd79ccca0041254')
'7.2' : 'f0901284b338e448bfd79ccca0041254', version('7.1', '44c6b4914f38d6f9aa959640b89da329')
'7.1' : '44c6b4914f38d6f9aa959640b89da329', version('7.0', '4ca69757678272f718b1041c810d82d8')
'7.0' : '4ca69757678272f718b1041c810d82d8', version('6.4', '774c14d93ce58674b3b2c880edd12d77')
'6.4' : '774c14d93ce58674b3b2c880edd12d77', version('6.3', '821fda8f14d674346b87e3ef9cb96389')
'6.3' : '821fda8f14d674346b87e3ef9cb96389', version('6.2', 'c49d360bbd069d00e2a57804f2a123d9')
'6.2' : 'c49d360bbd069d00e2a57804f2a123d9', version('6.1.405', 'd220ff58f2c72ed606e6d0297c2f2a7c')
'6.1.405' : 'd220ff58f2c72ed606e6d0297c2f2a7c', version('6.1', '7fd0f915adc7c0dab89772884268b030')
'6.1' : '7fd0f915adc7c0dab89772884268b030', version('6.0', '9d9ca84d489af6b3f54639dd97af3774')
'6.0' : '9d9ca84d489af6b3f54639dd97af3774',
}
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=%s" % prefix) configure("--prefix=%s" % prefix)

View File

@ -9,7 +9,7 @@ class Zlib(Package):
homepage = "http://zlib.net" homepage = "http://zlib.net"
url = "http://zlib.net/zlib-1.2.8.tar.gz" url = "http://zlib.net/zlib-1.2.8.tar.gz"
versions = { '1.2.8' : '44d667c142d7cda120332623eab69f40', } version('1.2.8', '44d667c142d7cda120332623eab69f40')
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=%s" % prefix) configure("--prefix=%s" % prefix)