diff --git a/easybuild/easyblocks/generic/buildenv.py b/easybuild/easyblocks/generic/buildenv.py index 85a7d204b4c..bbd9c985b46 100644 --- a/easybuild/easyblocks/generic/buildenv.py +++ b/easybuild/easyblocks/generic/buildenv.py @@ -28,7 +28,11 @@ @author: Alan O'Cais (Juelich Supercomputing Centre) """ +import os + from easybuild.easyblocks.generic.bundle import Bundle +from easybuild.tools.filetools import copy_dir +from easybuild.tools.toolchain.toolchain import RPATH_WRAPPERS_SUBDIR class BuildEnv(Bundle): @@ -36,6 +40,27 @@ class BuildEnv(Bundle): Build environment of toolchain: only generate module file """ + def prepare_step(self, *args, **kwargs): + """ + Custom prepare step for buildenv: export rpath wrappers if they are being used + """ + # passed to toolchain.prepare to specify location for RPATH wrapper scripts (if RPATH linking is enabled) + self.rpath_wrappers_dir = self.builddir + + super(BuildEnv, self).prepare_step(*args, **kwargs) + + def install_step(self, *args, **kwargs): + """ + Custom install step for buildenv: copy RPATH wrapper scripts to install dir, if desired + """ + super(BuildEnv, self).install_step(*args, **kwargs) + + # copy RPATH wrapper scripts to install directory (if they exist) + wrappers_dir = os.path.join(self.rpath_wrappers_dir, RPATH_WRAPPERS_SUBDIR) + if os.path.exists(wrappers_dir): + self.rpath_wrappers_dir = os.path.join(self.installdir, 'bin') + copy_dir(wrappers_dir, os.path.join(self.rpath_wrappers_dir, RPATH_WRAPPERS_SUBDIR)) + def make_module_extra(self): """Add all the build environment variables.""" txt = super(BuildEnv, self).make_module_extra() @@ -45,5 +70,13 @@ def make_module_extra(self): for key, val in sorted(self.toolchain.vars.items()): txt += self.module_generator.set_environment(key, val) - self.log.debug("make_module_extra added this: %s" % txt) + self.log.debug(f"make_module_extra added this: {txt}") return txt + + def make_module_step(self, fake=False): + """Specify correct bin directories for buildenv installation.""" + wrappers_dir = os.path.join(self.rpath_wrappers_dir, RPATH_WRAPPERS_SUBDIR) + if os.path.exists(wrappers_dir): + self.module_load_environment.PATH = [os.path.join(wrappers_dir, d) for d in os.listdir(wrappers_dir)] + + return super(BuildEnv, self).make_module_step(fake=fake)