Skip to content

Commit

Permalink
Enhance generic Bundle EasyBlock to transfer module requirements of c…
Browse files Browse the repository at this point in the history
…omponents

This commit implements the `make_module_req_guess` method for the
generic Bundle EasyBlock. With this, all the requirements of the
components in a bundle are transferred correctly to the final module.
Previously, this could lead to missing environment variables, letting
the build succeed but still resulting in a broken module, for example
because `PATH` is not set.

Signed-off-by: Jan André Reuter <[email protected]>
  • Loading branch information
Thyre committed Nov 8, 2024
1 parent 8551f99 commit b13db46
Showing 1 changed file with 40 additions and 3 deletions.
43 changes: 40 additions & 3 deletions easybuild/easyblocks/generic/bundle.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ def __init__(self, *args, **kwargs):
# list of EasyConfig instances for components
self.comp_cfgs = []

# list of EasyBlocks for components
self.comp_blocks = []

# list of EasyConfig instances of components for which to run sanity checks
self.comp_cfgs_sanity_check = []

Expand Down Expand Up @@ -199,6 +202,7 @@ def __init__(self, *args, **kwargs):
self.cfg.update('patches', comp_cfg['patches'])

self.comp_cfgs.append(comp_cfg)
self.comp_blocks.append(comp_cfg.easyblock(comp_cfg))

self.cfg.update('checksums', checksums_patches)

Expand Down Expand Up @@ -247,14 +251,12 @@ def build_step(self):
def install_step(self):
"""Install components, if specified."""
comp_cnt = len(self.cfg['components'])
for idx, cfg in enumerate(self.comp_cfgs):
for idx, (cfg, comp) in enumerate(zip(self.comp_cfgs, self.comp_blocks)):

print_msg("installing bundle component %s v%s (%d/%d)..." %
(cfg['name'], cfg['version'], idx + 1, comp_cnt))
self.log.info("Installing component %s v%s using easyblock %s", cfg['name'], cfg['version'], cfg.easyblock)

comp = cfg.easyblock(cfg)

# correct build/install dirs
comp.builddir = self.builddir
comp.install_subdir, comp.installdir = self.install_subdir, self.installdir
Expand Down Expand Up @@ -324,6 +326,41 @@ def install_step(self):
# close log for this component
comp.close_log()

def make_module_req_guess(self):
"""
Set module requirements from all comppnents, e.g. $PATH, etc.
During the install step, we only set these requirements temporarily.
Later on when building the module, those paths are not considered.
Therefore, iterate through all the components again and gather
the requirements.
Do not remove duplicates or check for existance of folders,
as this is done in the generic EasyBlock while creating
the modulefile already.
"""
# Start with the paths from the generic EasyBlock.
# If not added here, they might be missing entirely and fail sanity checks.
final_reqs = super(Bundle, self).make_module_req_guess()

for cfg, comp in zip(self.comp_cfgs, self.comp_blocks):
self.log.info("Gathering module paths for component %s v%s", cfg['name'], cfg['version'])
reqs = comp.make_module_req_guess()

if not reqs or not isinstance(reqs, dict):
self.log.warning("Expected requirements to be a dict but is not. Therefore, this component is skipped.")
continue

for key, value in sorted(reqs.items()):
if isinstance(reqs, string_type):
self.log.warning("Hoisting string value %s into a list before iterating over it", value)
value = [value]
if key not in final_reqs:
final_reqs[key] = value
else:
final_reqs[key] += value

return final_reqs

def make_module_extra(self, *args, **kwargs):
"""Set extra stuff in module file, e.g. $EBROOT*, $EBVERSION*, etc."""
if not self.altroot and not self.altversion:
Expand Down

0 comments on commit b13db46

Please sign in to comment.