Skip to content

Commit da2978d

Browse files
committed
fix semantics of --set-default-module: only set default for specified easyconfigs, not for the ones that are installed as dependencies via --robot (fixes #3090)
1 parent 72e5fb0 commit da2978d

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

easybuild/framework/easyblock.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ def __init__(self, ec):
175175
self.module_generator = module_generator(self, fake=True)
176176
self.mod_filepath = self.module_generator.get_module_filepath()
177177
self.mod_file_backup = None
178+
self.set_default_module = self.cfg.set_default_module
178179

179180
# modules footer/header
180181
self.modules_footer = None
@@ -2719,7 +2720,7 @@ def make_module_step(self, fake=False):
27192720

27202721
# always set default for temporary module file,
27212722
# to avoid that it gets overruled by an existing module file that is set as default
2722-
if fake or build_option('set_default_module'):
2723+
if fake or self.set_default_module:
27232724
self._set_module_as_default(fake=fake)
27242725

27252726
return modpath

easybuild/framework/easyconfig/easyconfig.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,8 @@ def __init__(self, path, extra_options=None, build_specs=None, validate=True, hi
497497
self.short_mod_name = mns.det_short_module_name(self)
498498
self.mod_subdir = mns.det_module_subdir(self)
499499

500+
self.set_default_module = False
501+
500502
self.software_license = None
501503

502504
def filename(self):

easybuild/main.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,11 @@ def main(args=None, logfile=None, do_build=None, testing=False, modtool=None):
362362
print_msg("%s is already installed (module found), skipping" % skipped_ec['full_mod_name'])
363363
easyconfigs = retained_ecs
364364

365+
# keep track for which easyconfigs we should set the corresponding module as default
366+
if options.set_default_module:
367+
for easyconfig in easyconfigs:
368+
easyconfig['ec'].set_default_module = True
369+
365370
# determine an order that will allow all specs in the set to build
366371
if len(easyconfigs) > 0:
367372
# resolve dependencies if robot is enabled, except in dry run mode

test/framework/options.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3980,6 +3980,60 @@ def test_set_default_module(self):
39803980
else:
39813981
self.assertTrue(False, "Uknown module syntax: %s" % get_module_syntax())
39823982

3983+
def test_set_default_module_robot(self):
3984+
"""Test use of --set-default-module --robot."""
3985+
# create two test easyconfigs, one depending on the other
3986+
# (using dummy Toolchain easyblock included in the tests)
3987+
test_ec = os.path.join(self.test_prefix, 'test.eb')
3988+
write_file(test_ec, '\n'.join([
3989+
"easyblock = 'Toolchain'",
3990+
"name = 'test'",
3991+
"version = '1.0'",
3992+
"homepage = 'https://example.com'",
3993+
"description = 'this is just a test'",
3994+
"toolchain = SYSTEM",
3995+
"dependencies = [('thisisjustatestdep', '3.14')]",
3996+
]))
3997+
testdep_ec = os.path.join(self.test_prefix, 'thisisjustatestdep-3.14.eb')
3998+
write_file(testdep_ec, '\n'.join([
3999+
"easyblock = 'Toolchain'",
4000+
"name = 'thisisjustatestdep'",
4001+
"version = '3.14'",
4002+
"homepage = 'https://example.com'",
4003+
"description = 'this is just a test'",
4004+
"toolchain = SYSTEM",
4005+
]))
4006+
4007+
args = [
4008+
test_ec,
4009+
'--force',
4010+
'--set-default-module',
4011+
'--robot',
4012+
self.test_prefix,
4013+
]
4014+
self.eb_main(args, do_build=True, raise_error=True)
4015+
4016+
# default module is set for specified easyconfig, but *not* for its dependency
4017+
modfiles_dir = os.path.join(self.test_installpath, 'modules', 'all')
4018+
self.assertEqual(sorted(os.listdir(modfiles_dir)), ['test', 'thisisjustatestdep'])
4019+
test_mod_dir = os.path.join(modfiles_dir, 'test')
4020+
testdep_mod_dir = os.path.join(modfiles_dir, 'thisisjustatestdep')
4021+
4022+
if get_module_syntax() == 'Lua':
4023+
# only 'default' symlink for test/1.0, not for thisisjustadep/3.14
4024+
self.assertEqual(sorted(os.listdir(test_mod_dir)), ['1.0.lua', 'default'])
4025+
self.assertEqual(sorted(os.listdir(testdep_mod_dir)), ['3.14.lua'])
4026+
default_symlink = os.path.join(test_mod_dir, 'default')
4027+
self.assertTrue(os.path.islink(default_symlink))
4028+
self.assertEqual(os.readlink(default_symlink), '1.0.lua')
4029+
elif get_module_syntax() == 'Tcl':
4030+
self.assertEqual(sorted(os.listdir(test_mod_dir)), ['.version', '1.0'])
4031+
self.assertEqual(sorted(os.listdir(testdep_mod_dir)), ['3.14'])
4032+
dot_version_file = os.path.join(test_mod_dir, '.version')
4033+
self.assertTrue("set ModulesVersion 1.0" in read_file(dot_version_file))
4034+
else:
4035+
self.assertTrue(False, "Uknown module syntax: %s" % get_module_syntax())
4036+
39834037
def test_inject_checksums(self):
39844038
"""Test for --inject-checksums"""
39854039
topdir = os.path.dirname(os.path.abspath(__file__))

0 commit comments

Comments
 (0)