summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2016-03-02 00:08:36 -0800
committerTodd Gamblin <tgamblin@llnl.gov>2016-03-02 00:08:36 -0800
commit21d125c9147f5d3cfc0eb8a9516c8ce24df7279b (patch)
tree7edf013e29dd44e8abb55e0ad5b8a06428f07216 /lib
parentbe306d09e99a69732afc3f44724222ab6c6d71cc (diff)
downloadspack-21d125c9147f5d3cfc0eb8a9516c8ce24df7279b.tar.gz
spack-21d125c9147f5d3cfc0eb8a9516c8ce24df7279b.tar.bz2
spack-21d125c9147f5d3cfc0eb8a9516c8ce24df7279b.tar.xz
spack-21d125c9147f5d3cfc0eb8a9516c8ce24df7279b.zip
Fixes #175: Dump environment provenance as well as build log.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/directory_layout.py14
-rw-r--r--lib/spack/spack/package.py7
-rw-r--r--lib/spack/spack/util/environment.py7
3 files changed, 27 insertions, 1 deletions
diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py
index 3e416a6a1f..29d87b65b3 100644
--- a/lib/spack/spack/directory_layout.py
+++ b/lib/spack/spack/directory_layout.py
@@ -173,7 +173,9 @@ class YamlDirectoryLayout(DirectoryLayout):
self.spec_file_name = 'spec.yaml'
self.extension_file_name = 'extensions.yaml'
- self.build_log_name = 'build.out' # TODO: use config file.
+ self.build_log_name = 'build.out' # build log.
+ self.build_env_name = 'build.env' # build environment
+ self.packages_dir = 'repos' # archive of package.py files
# Cache of already written/read extension maps.
self._extension_maps = {}
@@ -231,6 +233,16 @@ class YamlDirectoryLayout(DirectoryLayout):
self.build_log_name)
+ def build_env_path(self, spec):
+ return join_path(self.path_for_spec(spec), self.metadata_dir,
+ self.build_env_name)
+
+
+ def build_packages_path(self, spec):
+ return join_path(self.path_for_spec(spec), self.metadata_dir,
+ self.packages_dir)
+
+
def create_install_directory(self, spec):
_check_concrete(spec)
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index 8019b29cba..5b1927fe8f 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -66,6 +66,7 @@ from spack.version import *
from spack.stage import Stage, ResourceStage, StageComposite
from spack.util.compression import allowed_archive, extension
from spack.util.executable import ProcessError
+from spack.util.environment import dump_environment
"""Allowed URL schemes for spack packages."""
_ALLOWED_URL_SCHEMES = ["http", "https", "ftp", "file", "git"]
@@ -884,10 +885,14 @@ class Package(object):
# Do the real install in the source directory.
self.stage.chdir_to_source()
+ # Save the build environment in a file before building.
+ env_path = join_path(os.getcwd(), 'spack-build.env')
+
# This redirects I/O to a build log (and optionally to the terminal)
log_path = join_path(os.getcwd(), 'spack-build.out')
log_file = open(log_path, 'w')
with log_output(log_file, verbose, sys.stdout.isatty(), True):
+ dump_environment(env_path)
self.install(self.spec, self.prefix)
# Ensure that something was actually installed.
@@ -896,7 +901,9 @@ class Package(object):
# Move build log into install directory on success
if not fake:
log_install_path = spack.install_layout.build_log_path(self.spec)
+ env_install_path = spack.install_layout.build_env_path(self.spec)
install(log_path, log_install_path)
+ install(env_path, env_install_path)
# On successful install, remove the stage.
if not keep_stage:
diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py
index cd413dcfbc..ae8e5708be 100644
--- a/lib/spack/spack/util/environment.py
+++ b/lib/spack/spack/util/environment.py
@@ -63,3 +63,10 @@ def pop_keys(dictionary, *keys):
for key in keys:
if key in dictionary:
dictionary.pop(key)
+
+
+def dump_environment(path):
+ """Dump the current environment out to a file."""
+ with open(path, 'w') as env_file:
+ for key,val in sorted(os.environ.items()):
+ env_file.write("%s=%s\n" % (key, val))