Use tmp directory for downloading and building

This commit is contained in:
Todd Gamblin 2013-02-21 19:05:16 -08:00
parent 1c4e16afdf
commit 705447bdc2
2 changed files with 44 additions and 3 deletions

View file

@ -36,9 +36,17 @@
verbose = False verbose = False
debug = False debug = False
# Whether stage should use tmp filesystem or build in the spack prefix # Whether to build in tmp space or directly in the stage_path.
# If this is true, then spack will make stage directories in
# a tmp filesystem, and it will symlink them into stage_path.
use_tmp_stage = True use_tmp_stage = True
# Locations to use for staging and building, in order of preference
# Spack will try to create stage directories in <tmp_dir>/<username>
# if one of these tmp_dirs exists. Otherwise it'll use a default
# location per the python implementation of tempfile.mkdtemp().
tmp_dirs = ['/nfs/tmp2', '/var/tmp', '/tmp']
# Important environment variables # Important environment variables
SPACK_NO_PARALLEL_MAKE = 'SPACK_NO_PARALLEL_MAKE' SPACK_NO_PARALLEL_MAKE = 'SPACK_NO_PARALLEL_MAKE'
SPACK_LIB = 'SPACK_LIB' SPACK_LIB = 'SPACK_LIB'

View file

@ -2,6 +2,7 @@
import re import re
import shutil import shutil
import tempfile import tempfile
import getpass
import spack import spack
import packages import packages
@ -30,11 +31,39 @@ def path(self):
def setup(self): def setup(self):
# If the user switched stage types on us, destroy the old one and
# start over
if spack.use_tmp_stage:
if not os.path.islink(self.path):
self.destroy()
else:
if os.path.islink(self.path):
self.destroy()
if os.path.exists(self.path): if os.path.exists(self.path):
if not os.path.isdir(self.path): if not os.path.isdir(self.path):
tty.die("Stage path %s is not a directory!" % self.path) tty.die("Stage path %s is not a directory!" % self.path)
else: else:
os.makedirs(self.path) # Now create the stage directory
spack.mkdirp(spack.stage_path)
# And the stage for this build within it
if not spack.use_tmp_stage:
# non-tmp stage is just a directory in spack.stage_path
spack.mkdirp(self.path)
else:
# tmp stage is created in tmp but linked to spack.stage_path
tmp_dir = next((tmp for tmp in spack.tmp_dirs
if os.access(tmp, os.R_OK|os.W_OK)), None)
username = getpass.getuser()
if username:
tmp_dir = spack.new_path(tmp_dir, username)
spack.mkdirp(tmp_dir)
tmp_dir = tempfile.mkdtemp(
'.stage', self.stage_name + '-', tmp_dir)
os.symlink(tmp_dir, self.path)
ensure_access(self.path) ensure_access(self.path)
@ -136,4 +165,8 @@ def restage(self):
def destroy(self): def destroy(self):
"""Blows away the stage directory. Can always call setup() again.""" """Blows away the stage directory. Can always call setup() again."""
if os.path.exists(self.path): if os.path.exists(self.path):
shutil.rmtree(self.path, True) if os.path.islink(self.path):
shutil.rmtree(os.path.realpath(self.path), True)
os.unlink(self.path)
else:
shutil.rmtree(self.path, True)