install() now takes spec AND prefix
This commit is contained in:
parent
0cd5866eea
commit
a4cda94524
21 changed files with 122 additions and 62 deletions
|
@ -9,6 +9,12 @@
|
|||
from spack.error import SpackError
|
||||
|
||||
|
||||
def _check_concrete(spec):
|
||||
"""If the spec is not concrete, raise a ValueError"""
|
||||
if not spec.concrete:
|
||||
raise ValueError('Specs passed to a DirectoryLayout must be concrete!')
|
||||
|
||||
|
||||
class DirectoryLayout(object):
|
||||
"""A directory layout is used to associate unique paths with specs.
|
||||
Different installations are going to want differnet layouts for their
|
||||
|
@ -39,7 +45,8 @@ def make_path_for_spec(self, spec):
|
|||
|
||||
def path_for_spec(self, spec):
|
||||
"""Return an absolute path from the root to a directory for the spec."""
|
||||
assert(spec.concrete)
|
||||
_check_concrete(spec)
|
||||
|
||||
path = self.relative_path_for_spec(spec)
|
||||
assert(not path.startswith(self.root))
|
||||
return os.path.join(self.root, path)
|
||||
|
@ -105,7 +112,7 @@ def __init__(self, root, **kwargs):
|
|||
|
||||
|
||||
def relative_path_for_spec(self, spec):
|
||||
assert(spec.concrete)
|
||||
_check_concrete(spec)
|
||||
|
||||
path = new_path(
|
||||
spec.architecture,
|
||||
|
@ -134,7 +141,7 @@ def read_spec(self, path):
|
|||
|
||||
|
||||
def make_path_for_spec(self, spec):
|
||||
assert(spec.concrete)
|
||||
_check_concrete(spec)
|
||||
|
||||
path = self.path_for_spec(spec)
|
||||
spec_file_path = new_path(path, self.spec_file)
|
||||
|
@ -200,5 +207,3 @@ class InstallDirectoryAlreadyExistsError(DirectoryLayoutError):
|
|||
def __init__(self, path):
|
||||
super(InstallDirectoryAlreadyExistsError, self).__init__(
|
||||
"Install path %s already exists!")
|
||||
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ class Cmake(Package):
|
|||
url = 'http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz'
|
||||
md5 = '097278785da7182ec0aea8769d06860c'
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure('--prefix=%s' % prefix,
|
||||
'--parallel=%s' % make_jobs)
|
||||
make()
|
||||
|
@ -407,27 +407,9 @@ def add_commands_to_module(self):
|
|||
m.rmtree = shutil.rmtree
|
||||
m.move = shutil.move
|
||||
|
||||
# Useful directories within the prefix
|
||||
# Useful directories within the prefix are encapsulated in
|
||||
# a Prefix object.
|
||||
m.prefix = self.prefix
|
||||
m.bin = new_path(self.prefix, 'bin')
|
||||
m.sbin = new_path(self.prefix, 'sbin')
|
||||
m.etc = new_path(self.prefix, 'etc')
|
||||
m.include = new_path(self.prefix, 'include')
|
||||
m.lib = new_path(self.prefix, 'lib')
|
||||
m.lib64 = new_path(self.prefix, 'lib64')
|
||||
m.libexec = new_path(self.prefix, 'libexec')
|
||||
m.share = new_path(self.prefix, 'share')
|
||||
m.doc = new_path(m.share, 'doc')
|
||||
m.info = new_path(m.share, 'info')
|
||||
m.man = new_path(m.share, 'man')
|
||||
m.man1 = new_path(m.man, 'man1')
|
||||
m.man2 = new_path(m.man, 'man2')
|
||||
m.man3 = new_path(m.man, 'man3')
|
||||
m.man4 = new_path(m.man, 'man4')
|
||||
m.man5 = new_path(m.man, 'man5')
|
||||
m.man6 = new_path(m.man, 'man6')
|
||||
m.man7 = new_path(m.man, 'man7')
|
||||
m.man8 = new_path(m.man, 'man8')
|
||||
|
||||
|
||||
def preorder_traversal(self, visited=None, **kwargs):
|
||||
|
@ -529,7 +511,7 @@ def installed_dependents(self):
|
|||
@property
|
||||
def prefix(self):
|
||||
"""Get the prefix into which this package should be installed."""
|
||||
return spack.install_layout.path_for_spec(self.spec)
|
||||
return self.spec.prefix
|
||||
|
||||
|
||||
def url_version(self, version):
|
||||
|
@ -620,7 +602,7 @@ def do_install(self):
|
|||
# case it needs to add extra files)
|
||||
spack.install_layout.make_path_for_spec(self.spec)
|
||||
|
||||
self.install(self.prefix)
|
||||
self.install(self.spec, self.prefix)
|
||||
if not os.path.isdir(self.prefix):
|
||||
tty.die("Install failed for %s. No install dir created." % self.name)
|
||||
|
||||
|
@ -683,7 +665,7 @@ def module(self):
|
|||
fromlist=[self.__class__.__name__])
|
||||
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
"""Package implementations override this with their own build configuration."""
|
||||
tty.die("Packages must provide an install method!")
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ class Callpath(Package):
|
|||
depends_on("dyninst")
|
||||
depends_on("mpich")
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -5,7 +5,7 @@ class Cmake(Package):
|
|||
url = 'http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz'
|
||||
versions = { '2.8.10.2' : '097278785da7182ec0aea8769d06860c' }
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure('--prefix=%s' % prefix,
|
||||
'--parallel=%s' % make_jobs)
|
||||
make()
|
||||
|
|
|
@ -11,7 +11,7 @@ class Dyninst(Package):
|
|||
depends_on("libelf")
|
||||
depends_on("libdwarf")
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -23,21 +23,21 @@ def clean(self):
|
|||
make('clean')
|
||||
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
# dwarf build does not set arguments for ar properly
|
||||
make.add_default_arg('ARFLAGS=rcs')
|
||||
|
||||
# Dwarf doesn't provide an install, so we have to do it.
|
||||
mkdirp(bin, include, lib, man1)
|
||||
mkdirp(prefix.bin, prefix.include, prefix.lib, prefix.man1)
|
||||
|
||||
with working_dir('libdwarf'):
|
||||
configure("--prefix=%s" % prefix, '--enable-shared')
|
||||
make()
|
||||
|
||||
install('libdwarf.a', lib)
|
||||
install('libdwarf.so', lib)
|
||||
install('libdwarf.h', include)
|
||||
install('dwarf.h', include)
|
||||
install('libdwarf.a', prefix.lib)
|
||||
install('libdwarf.so', prefix.lib)
|
||||
install('libdwarf.h', prefix.include)
|
||||
install('dwarf.h', prefix.include)
|
||||
|
||||
with working_dir('dwarfdump2'):
|
||||
configure("--prefix=%s" % prefix)
|
||||
|
@ -46,6 +46,6 @@ def install(self, prefix):
|
|||
# cause a race in parallel
|
||||
make(parallel=False)
|
||||
|
||||
install('dwarfdump', bin)
|
||||
install('dwarfdump.conf', lib)
|
||||
install('dwarfdump.1', man1)
|
||||
install('dwarfdump', prefix.bin)
|
||||
install('dwarfdump.conf', prefix.lib)
|
||||
install('dwarfdump.1', prefix.man1)
|
||||
|
|
|
@ -6,7 +6,7 @@ class Libelf(Package):
|
|||
|
||||
versions = { '0.8.13' : '4136d7b4c04df68b686570afa26988ac' }
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix,
|
||||
"--enable-shared",
|
||||
"--disable-dependency-tracking",
|
||||
|
|
|
@ -6,7 +6,7 @@ class Libunwind(Package):
|
|||
|
||||
versions = { '1.1' : 'fb4ea2f6fbbe45bf032cd36e586883ce' }
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -13,7 +13,7 @@ class Mpich(Package):
|
|||
provides('mpi@:3', when='@3:')
|
||||
provides('mpi@:1', when='@1:')
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -7,7 +7,7 @@ class Mpileaks(Package):
|
|||
depends_on("mpich")
|
||||
depends_on("callpath")
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -82,6 +82,7 @@
|
|||
from spack.color import *
|
||||
from spack.util.lang import *
|
||||
from spack.util.string import *
|
||||
from spack.util.prefix import Prefix
|
||||
|
||||
|
||||
# Convenient names for color formats so that other things can use them
|
||||
|
@ -439,6 +440,11 @@ def preorder_traversal(self, visited=None, d=0, **kwargs):
|
|||
yield elt
|
||||
|
||||
|
||||
@property
|
||||
def prefix(self):
|
||||
return Prefix(spack.install_layout.path_for_spec(self))
|
||||
|
||||
|
||||
def _concretize_helper(self, presets=None, visited=None):
|
||||
"""Recursive helper function for concretize().
|
||||
This concretizes everything bottom-up. As things are
|
||||
|
|
|
@ -11,7 +11,7 @@ class Callpath(Package):
|
|||
depends_on("dyninst")
|
||||
depends_on("mpi")
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -12,7 +12,7 @@ class Dyninst(Package):
|
|||
depends_on("libelf")
|
||||
depends_on("libdwarf")
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -5,7 +5,7 @@ class Fake(Package):
|
|||
url = "http://www.fake-spack-example.org/downloads/fake-1.0.tar.gz"
|
||||
versions = { '1.0' : 'foobarbaz' }
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -23,21 +23,21 @@ def clean(self):
|
|||
make('clean')
|
||||
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
# dwarf build does not set arguments for ar properly
|
||||
make.add_default_arg('ARFLAGS=rcs')
|
||||
|
||||
# Dwarf doesn't provide an install, so we have to do it.
|
||||
mkdirp(bin, include, lib, man1)
|
||||
mkdirp(prefix.bin, prefix.include, prefix.lib, prefix.man1)
|
||||
|
||||
with working_dir('libdwarf'):
|
||||
configure("--prefix=%s" % prefix, '--enable-shared')
|
||||
make()
|
||||
|
||||
install('libdwarf.a', lib)
|
||||
install('libdwarf.so', lib)
|
||||
install('libdwarf.h', include)
|
||||
install('dwarf.h', include)
|
||||
install('libdwarf.a', prefix.lib)
|
||||
install('libdwarf.so', prefix.lib)
|
||||
install('libdwarf.h', prefix.include)
|
||||
install('dwarf.h', prefix.include)
|
||||
|
||||
with working_dir('dwarfdump2'):
|
||||
configure("--prefix=%s" % prefix)
|
||||
|
@ -46,6 +46,6 @@ def install(self, prefix):
|
|||
# cause a race in parallel
|
||||
make(parallel=False)
|
||||
|
||||
install('dwarfdump', bin)
|
||||
install('dwarfdump.conf', lib)
|
||||
install('dwarfdump.1', man1)
|
||||
install('dwarfdump', prefix.bin)
|
||||
install('dwarfdump.conf', prefix.lib)
|
||||
install('dwarfdump.1', prefix.man1)
|
||||
|
|
|
@ -8,7 +8,7 @@ class Libelf(Package):
|
|||
'0.8.12' : 'e21f8273d9f5f6d43a59878dc274fec7',
|
||||
'0.8.10' : '9db4d36c283d9790d8fa7df1f4d7b4d9' }
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix,
|
||||
"--enable-shared",
|
||||
"--disable-dependency-tracking",
|
||||
|
|
|
@ -15,7 +15,7 @@ class Mpich(Package):
|
|||
provides('mpi@:3', when='@3:')
|
||||
provides('mpi@:1', when='@1:')
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -17,7 +17,7 @@ class Mpich2(Package):
|
|||
provides('mpi@:2.1', when='@1.1:')
|
||||
provides('mpi@:2.2', when='@1.2:')
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -12,7 +12,7 @@ class Mpileaks(Package):
|
|||
depends_on("mpi")
|
||||
depends_on("callpath")
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
|
@ -11,7 +11,7 @@ class Zmpi(Package):
|
|||
provides('mpi@:10.0')
|
||||
depends_on('fake')
|
||||
|
||||
def install(self, prefix):
|
||||
def install(self, spec, prefix):
|
||||
configure("--prefix=%s" % prefix)
|
||||
make()
|
||||
make("install")
|
||||
|
|
67
lib/spack/spack/util/prefix.py
Normal file
67
lib/spack/spack/util/prefix.py
Normal file
|
@ -0,0 +1,67 @@
|
|||
"""
|
||||
This file contains utilities to help with installing packages.
|
||||
"""
|
||||
from spack.util.filesystem import new_path
|
||||
|
||||
class Prefix(object):
|
||||
"""This class represents an installation prefix, but provides useful
|
||||
attributes for referring to directories inside the prefix.
|
||||
|
||||
For example, you can do something like this::
|
||||
|
||||
prefix = Prefix('/usr')
|
||||
print prefix.lib
|
||||
print prefix.lib64
|
||||
print prefix.bin
|
||||
print prefix.share
|
||||
print prefix.man4
|
||||
|
||||
This program would print:
|
||||
|
||||
/usr/lib
|
||||
/usr/lib64
|
||||
/usr/bin
|
||||
/usr/share
|
||||
/usr/share/man/man4
|
||||
|
||||
In addition, Prefix objects can be added to strings, e.g.:
|
||||
|
||||
print "foobar " + prefix
|
||||
|
||||
This prints 'foobar /usr". All of this is meant to make custom
|
||||
installs easy.
|
||||
"""
|
||||
|
||||
def __init__(self, prefix):
|
||||
self.prefix = prefix
|
||||
self.bin = new_path(self.prefix, 'bin')
|
||||
self.sbin = new_path(self.prefix, 'sbin')
|
||||
self.etc = new_path(self.prefix, 'etc')
|
||||
self.include = new_path(self.prefix, 'include')
|
||||
self.lib = new_path(self.prefix, 'lib')
|
||||
self.lib64 = new_path(self.prefix, 'lib64')
|
||||
self.libexec = new_path(self.prefix, 'libexec')
|
||||
self.share = new_path(self.prefix, 'share')
|
||||
self.doc = new_path(self.share, 'doc')
|
||||
self.info = new_path(self.share, 'info')
|
||||
self.man = new_path(self.share, 'man')
|
||||
self.man1 = new_path(self.man, 'man1')
|
||||
self.man2 = new_path(self.man, 'man2')
|
||||
self.man3 = new_path(self.man, 'man3')
|
||||
self.man4 = new_path(self.man, 'man4')
|
||||
self.man5 = new_path(self.man, 'man5')
|
||||
self.man6 = new_path(self.man, 'man6')
|
||||
self.man7 = new_path(self.man, 'man7')
|
||||
self.man8 = new_path(self.man, 'man8')
|
||||
|
||||
|
||||
def __str__(self):
|
||||
return self.prefix
|
||||
|
||||
|
||||
def __add__(self, other):
|
||||
return str(self) + other
|
||||
|
||||
|
||||
def __radd__(self, other):
|
||||
return other + str(self)
|
Loading…
Reference in a new issue