summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authoralalazo <massimiliano.culpo@googlemail.com>2016-04-05 18:03:09 +0200
committeralalazo <massimiliano.culpo@googlemail.com>2016-04-05 18:03:09 +0200
commit2968b60ee0b6b8d649e3d0c1a091857bfde28b89 (patch)
treef3173e112f8e463db6828770d4d67d30ddbb186a /lib
parentca7d7010076a520fa20f02ab0609bbc3e6216d2f (diff)
downloadspack-2968b60ee0b6b8d649e3d0c1a091857bfde28b89.tar.gz
spack-2968b60ee0b6b8d649e3d0c1a091857bfde28b89.tar.bz2
spack-2968b60ee0b6b8d649e3d0c1a091857bfde28b89.tar.xz
spack-2968b60ee0b6b8d649e3d0c1a091857bfde28b89.zip
module file : added autoload and prereq
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/config.py8
-rw-r--r--lib/spack/spack/modules.py65
2 files changed, 61 insertions, 12 deletions
diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py
index 4fca735fc9..ff5fba24f8 100644
--- a/lib/spack/spack/config.py
+++ b/lib/spack/spack/config.py
@@ -246,6 +246,10 @@ section_schemas = {
'type': 'object',
'additionalProperties': False,
'definitions': {
+ 'dependency_selection': {
+ 'type': 'string',
+ 'enum': ['None', 'Direct', 'All']
+ },
'module_type_configuration': {
'type': 'object',
'default': {},
@@ -264,7 +268,9 @@ section_schemas = {
}
}
}
- }
+ },
+ 'autoload': {'$ref': '#/definitions/dependency_selection'},
+ 'prerequisites': {'$ref': '#/definitions/dependency_selection'}
}
}
},
diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py
index 04317f53b1..d9a846f281 100644
--- a/lib/spack/spack/modules.py
+++ b/lib/spack/spack/modules.py
@@ -164,15 +164,25 @@ class EnvModule(object):
# package-specific modifications
spack_env = EnvironmentModifications()
- def dependencies():
+ def dependencies(request='All'):
+ if request == 'None':
+ return []
+
+ l = [x for x in sorted(self.spec.traverse(order='post', depth=True, cover='nodes', root=False), reverse=True)]
+
+ if request == 'Direct':
+ return [x for ii, x in l if ii == 1]
+
# FIXME : during module file creation nodes seem to be visited multiple times even if cover='nodes'
# FIXME : is given. This work around permits to get a unique list of spec anyhow.
# FIXME : Possibly we miss a merge step among nodes that refer to the same package.
- l = [x for x in sorted(self.spec.traverse(order='post', depth=True, cover='nodes'),reverse=True)]
seen = set()
- return [x for ii, x in l if not (x in seen or seen.add(x))]
+ seen_add = seen.add
+ return [x for ii, x in l if not (x in seen or seen_add(x))]
- for item in dependencies():
+ # TODO : the code down below is quite similar to build_environment.setup_package and needs to be
+ # TODO : factored out to a single place
+ for item in dependencies('All'):
try:
package = self.spec[item.name].package
modules = parent_class_modules(package.__class__)
@@ -190,11 +200,18 @@ class EnvModule(object):
set_module_variables_for_package(self.pkg, self.pkg.module)
self.spec.package.setup_environment(spack_env, env)
- # TODO : implement site-specific modifications and filters
- if not env:
- return
+ # Get list of modules that will be loaded automatically
+ try:
+ autoload_list = dependencies(CONFIGURATION[self.name]['autoload'])
+ except KeyError:
+ autoload_list = []
- # Filter modifications to the environment according to configuration files
+ try:
+ prerequisites_list = dependencies(CONFIGURATION[self.name]['prerequisites'])
+ except KeyError:
+ prerequisites_list = []
+
+ # Filter modifications to environment variables
try:
filter_list = CONFIGURATION[self.name]['filter']['environment_modifications']
except KeyError:
@@ -202,14 +219,26 @@ class EnvModule(object):
with open(self.file_name, 'w') as f:
self.write_header(f)
- for line in self.process_environment_command(
- filter_environment_modifications(env, filter_list)
- ):
+ # Automatic loads
+ for x in autoload_list:
+ self.write_autoload(f, x)
+ # Prerequisites
+ for x in prerequisites_list:
+ self.write_prerequisite(f, x)
+ # Modifications to the environment
+ iterable = self.process_environment_command( filter_environment_modifications(env, filter_list))
+ for line in iterable:
f.write(line)
def write_header(self, stream):
raise NotImplementedError()
+ def write_autoload(self, stream, spec):
+ raise NotImplementedError()
+
+ def write_prerequisite(self, stream, spec):
+ raise NotImplementedError()
+
def process_environment_command(self, env):
for command in env:
try:
@@ -309,3 +338,17 @@ class TclModule(EnvModule):
for line in textwrap.wrap(self.long_description, 72):
module_file.write("puts stderr \"%s\"\n" % line)
module_file.write('}\n\n')
+
+ def write_autoload(self, module_file, spec):
+ autoload_format = '''
+if ![ is-loaded {module_file} ] {{
+ puts stderr "Autoloading {module_file}"
+ module load {module_file}
+}}
+'''''
+ m = TclModule(spec)
+ module_file.write(autoload_format.format(module_file=m.use_name))
+
+ def write_prerequisite(self, module_file, spec):
+ m = TclModule(spec)
+ module_file.write('prereq {module_file}\n'.format(module_file=m.use_name))