Skip to content

Commit

Permalink
Merge pull request #3542 from boegel/5.0.x
Browse files Browse the repository at this point in the history
sync with develop (20241226)
  • Loading branch information
Micket authored Dec 27, 2024
2 parents 6ea38b6 + 329aa6d commit c47ffdf
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 10 deletions.
2 changes: 1 addition & 1 deletion easybuild/easyblocks/c/clang_aomp.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ def configure_step(self):
raise EasyBuildError("Could not find 'ROCm-Device-Libs' source directory in %s", self.builddir)

num_comps = len(self.cfg['components'])
for idx, comp in enumerate(self.comp_cfgs):
for idx, (comp, _) in enumerate(self.comp_instances):
name = comp['name']
msg = "configuring bundle component %s %s (%d/%d)..." % (name, comp['version'], idx + 1, num_comps)
print_msg(msg)
Expand Down
49 changes: 40 additions & 9 deletions easybuild/easyblocks/generic/bundle.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
@author: Pieter De Baets (Ghent University)
@author: Jens Timmerman (Ghent University)
@author: Jasper Grimm (University of York)
@author: Jan Andre Reuter (Juelich Supercomputing Centre)
"""
import copy
import os
Expand Down Expand Up @@ -70,8 +71,8 @@ def __init__(self, *args, **kwargs):
self.altroot = None
self.altversion = None

# list of EasyConfig instances for components
self.comp_cfgs = []
# list of EasyConfig instances and their EasyBlocks for components
self.comp_instances = []

# list of EasyConfig instances of components for which to run sanity checks
self.comp_cfgs_sanity_check = []
Expand Down Expand Up @@ -207,7 +208,7 @@ def __init__(self, *args, **kwargs):

comp_cfg.expect_resolved_template_values = True

self.comp_cfgs.append(comp_cfg)
self.comp_instances.append((comp_cfg, comp_cfg.easyblock(comp_cfg, logfile=self.logfile)))

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

Expand All @@ -226,7 +227,7 @@ def check_checksums(self):
"""
checksum_issues = super(Bundle, self).check_checksums()

for comp in self.comp_cfgs:
for comp, _ in self.comp_instances:
checksum_issues.extend(self.check_checksums_for(comp, sub="of component %s" % comp['name']))

return checksum_issues
Expand Down Expand Up @@ -256,14 +257,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(self.comp_instances):

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 @@ -332,8 +331,40 @@ def install_step(self):
new_val = path
env.setvar(envvar, new_val)

# close log for this component
comp.close_log()
def make_module_req_guess(self):
"""
Set module requirements from all components, 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 existence of folders,
as this is done in the generic EasyBlock while creating
the module file 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 self.comp_instances:
self.log.info("Gathering module paths for component %s v%s", cfg['name'], cfg['version'])
reqs = comp.make_module_req_guess()

# Try-except block to fail with an easily understandable error message.
# This should only trigger when an EasyBlock returns non-dict module requirements
# for make_module_req_guess() which should then be fixed in the components EasyBlock.
try:
for key, value in sorted(reqs.items()):
if isinstance(value, str):
value = [value]
final_reqs.setdefault(key, [])
final_reqs[key].extend(value)
except AttributeError:
raise EasyBuildError("Cannot process module requirements of bundle component %s v%s",
cfg['name'], cfg['version'])

return final_reqs

def make_module_extra(self, *args, **kwargs):
"""Set extra stuff in module file, e.g. $EBROOT*, $EBVERSION*, etc."""
Expand Down
3 changes: 3 additions & 0 deletions easybuild/easyblocks/q/quantumespresso.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
@author: Kenneth Hoste (Ghent University)
@author: Ake Sandgren (HPC2N, Umea University)
@author: Davide Grassano (CECAM, EPFL)
@author: Jan Reuter (Juelich Supercomputing Centre)
"""

import fileinput
Expand Down Expand Up @@ -84,6 +85,8 @@ def __init__(self, ec, *args, **kwargs):

# Required to avoid CMakeMake default extra_opts to override the ConfigMake ones
new_ec = EasyConfig(ec.path, extra_options=eb.extra_options())
# Disable log file for nested EasyBlock
kwargs['logfile'] = self.logfile
self.ebclass = eb(new_ec, *args, **kwargs)

class EB_QuantumESPRESSOcmake(CMakeMake):
Expand Down

0 comments on commit c47ffdf

Please sign in to comment.