Fixed passing of dependence prefixes to cc. libdwarf works.

This commit is contained in:
Todd Gamblin 2013-02-19 19:26:54 -08:00
parent d534c539d4
commit 48b0351945
4 changed files with 59 additions and 21 deletions

3
lib/spack/env/cc vendored
View File

@ -73,7 +73,8 @@ for var in ["LD_LIBRARY_PATH", "LD_RUN_PATH", "DYLD_LIBRARY_PATH"]:
os.environ.pop(var) os.environ.pop(var)
if spack_debug: if spack_debug:
print "{}==>{}: {} {}".format(green, reset, cmd, " ".join(arguments)) sys.stderr.write("{}==>{} {} {}\n".format(
green, reset, command, " ".join(arguments)))
rcode = subprocess.call([command] + arguments) rcode = subprocess.call([command] + arguments)
sys.exit(rcode) sys.exit(rcode)

View File

@ -50,6 +50,29 @@ def depends_on(*args, **kwargs):
dependencies.append(Dependency(name)) dependencies.append(Dependency(name))
class MakeExecutable(Executable):
"""Special Executable for make so the user can specify parallel or
not on a per-invocation basis. Using 'parallel' as a kwarg will
override whatever the package's global setting is, so you can
either default to true or false and override particular calls.
Note that if the SPACK_NO_PARALLEL_MAKE env var is set it overrides
everything.
"""
def __init__(self, name, parallel):
super(MakeExecutable, self).__init__(name)
self.parallel = parallel
def __call__(self, *args, **kwargs):
parallel = kwargs.get('parallel', self.parallel)
env_parallel = not env_flag("SPACK_NO_PARALLEL_MAKE")
if parallel and env_parallel:
args += ("-j%d" % multiprocessing.cpu_count(),)
super(MakeExecutable, self).__call__(*args, **kwargs)
class Package(object): class Package(object):
def __init__(self, arch=arch.sys_type()): def __init__(self, arch=arch.sys_type()):
attr.required(self, 'homepage') attr.required(self, 'homepage')
@ -90,8 +113,6 @@ def __init__(self, arch=arch.sys_type()):
def make_make(self): def make_make(self):
"""Create a make command set up with the proper default arguments.""" """Create a make command set up with the proper default arguments."""
make = which('make', required=True) make = which('make', required=True)
if self.parallel and not env_flag("SPACK_NO_PARALLEL_MAKE"):
make.add_default_arg("-j%d" % multiprocessing.cpu_count())
return make return make
@ -99,7 +120,8 @@ def add_commands_to_module(self):
"""Populate the module scope of install() with some useful functions. """Populate the module scope of install() with some useful functions.
This makes things easier for package writers. This makes things easier for package writers.
""" """
self.module.make = self.make_make() self.module.make = MakeExecutable('make', self.parallel)
self.module.gmake = MakeExecutable('gmake', self.parallel)
# Find the configure script in the archive path # Find the configure script in the archive path
# Don't use which for this; we want to find it in the current dir. # Don't use which for this; we want to find it in the current dir.
@ -270,16 +292,19 @@ def do_install(self):
self.do_stage() self.do_stage()
self.setup_install_environment() self.setup_install_environment()
tty.msg("Building %s." % self.name)
try: try:
self.install(self.prefix) self.install(self.prefix)
if not os.path.isdir(self.prefix): if not os.path.isdir(self.prefix):
tty.die("Install failed for %s. No install dir created." % self.name) tty.die("Install failed for %s. No install dir created." % self.name)
except Exception, e: except subprocess.CalledProcessError, e:
# Blow away the install tree if anything goes wrong.
if not self.dirty: if not self.dirty:
self.remove_prefix() self.remove_prefix()
tty.die("Install failed for %s" % self.name, e.message) tty.die("Install failed for %s" % self.name, e.message)
except Exception, e:
if not self.dirty:
self.remove_prefix()
raise
tty.msg("Successfully installed %s" % self.name) tty.msg("Successfully installed %s" % self.name)
tty.pkg(self.prefix) tty.pkg(self.prefix)
@ -300,15 +325,15 @@ def setup_install_environment(self):
path = new_path(env_path, file) path = new_path(env_path, file)
if file.startswith("case") and os.path.isdir(path): if file.startswith("case") and os.path.isdir(path):
env_paths.append(path) env_paths.append(path)
path_prepend("PATH", *env_paths) path_put_first("PATH", env_paths)
path_prepend("SPACK_ENV_PATH", *env_paths) path_set("SPACK_ENV_PATH", env_paths)
# Pass along paths of dependencies here # Pass along prefixes of dependencies here
for dep in self.dependencies: path_set("SPACK_DEPENDENCIES",
path_prepend("SPACK_DEPENDENCIES", dep.package.prefix) [dep.package.prefix for dep in self.dependencies])
# Install location # Install location
path_prepend("SPACK_PREFIX", self.prefix) os.environ["SPACK_PREFIX"] = self.prefix
def do_install_dependencies(self): def do_install_dependencies(self):
@ -354,7 +379,7 @@ def do_clean(self):
def clean(self): def clean(self):
"""By default just runs make clean. Override if this isn't good.""" """By default just runs make clean. Override if this isn't good."""
try: try:
make = self.make_make() make = MakeExecutable('make')
make('clean') make('clean')
tty.msg("Successfully cleaned %s" % self.name) tty.msg("Successfully cleaned %s" % self.name)
except subprocess.CalledProcessError, e: except subprocess.CalledProcessError, e:

View File

@ -11,4 +11,6 @@ def install(self, prefix):
"--disable-dependency-tracking", "--disable-dependency-tracking",
"--disable-debug") "--disable-debug")
make() make()
make("install")
# The mkdir commands in libelf's intsall can fail in parallel
make("install", parallel=False)

View File

@ -57,13 +57,23 @@ def env_flag(name):
return False return False
def path_prepend(var_name, *directories): def path_set(var_name, directories):
path = os.environ.get(var_name, "")
path_str = ":".join(str(dir) for dir in directories) path_str = ":".join(str(dir) for dir in directories)
if path == "":
os.environ[var_name] = path_str os.environ[var_name] = path_str
else:
os.environ[var_name] = "%s:%s" % (path_str, path)
def path_put_first(var_name, directories):
"""Puts the provided directories first in the path, adding them
if they're not already there.
"""
path = os.environ.get(var_name, "").split(':')
for dir in directories:
if dir in path:
path.remove(dir)
new_path = tuple(directories) + tuple(path)
path_set(var_name, new_path)
def pop_keys(dictionary, *keys): def pop_keys(dictionary, *keys):