Skip to content

Commit 1c69ff9

Browse files
authored
Merge pull request #4748 from lexming/non-path-module-env
add TODO and warning about non-path variables not being currently handled in module load environment
2 parents 3272aa0 + 64bd0b3 commit 1c69ff9

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

easybuild/framework/easyblock.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,14 +1668,23 @@ def make_module_req(self):
16681668
)
16691669
self.module_load_environment.update(self.make_module_req_guess())
16701670

1671-
# Only inject path-like environment variables into module file
1672-
env_var_requirements = sorted([
1673-
(envar_name, envar_val) for envar_name, envar_val in self.module_load_environment.items()
1671+
# Expand and inject path-like environment variables into module file
1672+
env_var_requirements = {
1673+
envar_name: envar_val
1674+
for envar_name, envar_val in sorted(self.module_load_environment.items())
16741675
if envar_val.is_path
1675-
])
1676+
}
16761677
self.log.debug(f"Tentative module environment requirements before path expansion: {env_var_requirements}")
1678+
# TODO: handle non-path variables in make_module_extra
1679+
# in the meantime, just report if any is found
1680+
non_path_envars = set(self.module_load_environment) - set(env_var_requirements)
1681+
if non_path_envars:
1682+
self.log.warning(
1683+
f"Non-path variables found in module load environment: {non_path_envars}."
1684+
"This is not yet supported by this version of EasyBuild."
1685+
)
16771686

1678-
for env_var, search_paths in env_var_requirements:
1687+
for env_var, search_paths in env_var_requirements.items():
16791688
if self.dry_run:
16801689
self.dry_run_msg(f" ${env_var}:{', '.join(search_paths)}")
16811690
# Don't expand globs or do any filtering for dry run

easybuild/tools/modules.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ def __setattr__(self, name, value):
272272
"""
273273
if name != name.upper():
274274
raise EasyBuildError(f"Names of ModuleLoadEnvironment attributes must be uppercase, got '{name}'")
275+
275276
try:
276277
(contents, kwargs) = value
277278
except ValueError:

test/framework/easyblock.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,8 @@ def test_make_module_req(self):
594594
full_path = os.path.join(eb.installdir, path, 'subpath')
595595
os.makedirs(full_path)
596596
write_file(os.path.join(full_path, 'any.file'), 'test')
597-
txt = eb.make_module_req()
597+
with eb.module_generator.start_module_creation():
598+
txt = eb.make_module_req()
598599
if get_module_syntax() == 'Tcl':
599600
self.assertFalse(re.search(r"prepend-path\s+LD_LIBRARY_PATH\s+\$%s\n" % sub_lib_path,
600601
txt, re.M))
@@ -605,6 +606,27 @@ def test_make_module_req(self):
605606
txt, re.M))
606607
self.assertFalse(re.search(r'prepend_path\("PATH", pathJoin\(root, "%s"\)\)\n' % sub_path_path, txt, re.M))
607608

609+
# Module load environement may contain non-path variables
610+
# TODO: remove whenever this is properly supported, in the meantime check warning
611+
eb.module_load_environment.NONPATH = ('non_path', {'var_type': "STRING"})
612+
eb.module_load_environment.PATH = ['bin']
613+
with self.mocked_stdout_stderr():
614+
txt = eb.make_module_req()
615+
616+
self.assertEqual(list(eb.module_load_environment), ['PATH', 'LD_LIBRARY_PATH', 'NONPATH'])
617+
618+
if get_module_syntax() == 'Tcl':
619+
self.assertTrue(re.match(r"^\nprepend-path\s+PATH\s+\$root/bin\n$", txt, re.M))
620+
self.assertFalse(re.match(r"^\nprepend-path\s+NONPATH\s+\$root/non_path\n$", txt, re.M))
621+
elif get_module_syntax() == 'Lua':
622+
self.assertTrue(re.match(r'^\nprepend_path\("PATH", pathJoin\(root, "bin"\)\)\n$', txt, re.M))
623+
self.assertFalse(re.match(r'^\nprepend_path\("NONPATH", pathJoin\(root, "non_path"\)\)\n$', txt, re.M))
624+
else:
625+
self.fail("Unknown module syntax: %s" % get_module_syntax())
626+
627+
logtxt = read_file(eb.logfile)
628+
self.assertTrue(re.search(r"WARNING Non-path variables found in module load env.*NONPATH", logtxt, re.M))
629+
608630
# cleanup
609631
eb.close_log()
610632
os.remove(eb.logfile)

0 commit comments

Comments
 (0)