diff --git a/easybuild/easyblocks/generic/juliapackage.py b/easybuild/easyblocks/generic/juliapackage.py index a3e641b2178..3f850230779 100644 --- a/easybuild/easyblocks/generic/juliapackage.py +++ b/easybuild/easyblocks/generic/juliapackage.py @@ -38,7 +38,7 @@ from easybuild.framework.easyconfig import CUSTOM from easybuild.framework.extensioneasyblock import ExtensionEasyBlock from easybuild.tools.build_log import EasyBuildError -from easybuild.tools.modules import get_software_root, get_software_version +from easybuild.tools.modules import get_software_root from easybuild.tools.filetools import copy_dir, mkdir from easybuild.tools.run import run_shell_cmd from easybuild.tools.utilities import trace_msg @@ -118,11 +118,31 @@ def get_julia_env(env_var): return parsed_var + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._julia_version = None + + @property + def julia_version(self) -> str: + """Needs to get Julia version from dependencies to allow --sanity-check-only to generate the fake module""" + if self._julia_version is None: + deps = self.cfg.dependencies(runtime_only=True) + for dep in deps: + if dep['name'] == 'Julia': + self._julia_version = dep['version'] + break + else: + raise EasyBuildError( + "Julia not included as dependency, cannot determine Julia version for installation of: %s", + self.name + ) + return self._julia_version + def julia_env_path(self, absolute=True, base=True): """ Return path to installation environment file. """ - julia_version = get_software_version('Julia').split('.') + julia_version = self.julia_version.split('.') env_dir = "v{}.{}".format(*julia_version[:2]) project_env = os.path.join("environments", env_dir, "Project.toml") @@ -137,8 +157,7 @@ def set_pkg_offline(self): """Enable offline mode of Julia Pkg""" if not self.cfg['download_pkg_deps']: - julia_version = get_software_version('Julia') - if LooseVersion(julia_version) >= LooseVersion('1.5'): + if LooseVersion(self.julia_version) >= LooseVersion('1.5'): # Enable offline mode of Julia Pkg # https://pkgdocs.julialang.org/v1/api/#Pkg.offline env.setvar('JULIA_PKG_OFFLINE', 'true') @@ -148,7 +167,7 @@ def set_pkg_offline(self): "Enable easyconfig option 'download_pkg_deps' to allow installation " "with any extra downloaded dependencies." ) - raise EasyBuildError(errmsg, julia_version) + raise EasyBuildError(errmsg, self.julia_version) def prepare_julia_env(self): """ diff --git a/test/easyblocks/module.py b/test/easyblocks/module.py index 846c2c3ef33..28f2d11b23f 100644 --- a/test/easyblocks/module.py +++ b/test/easyblocks/module.py @@ -451,7 +451,7 @@ def innertest(self): write_file(os.path.join(TMPDIR, 'modules', 'all', prgenv, '1.2.3'), "#%Module") # add empty module files for dependencies that are required for testing easyblocks - for dep_mod_name in ('foo/1.2.3.4.5', 'PyTorch/1.12.1'): + for dep_mod_name in ('foo/1.2.3.4.5', 'PyTorch/1.12.1', "Julia/1.6.7"): write_file(os.path.join(TMPDIR, 'modules', 'all', dep_mod_name), "#%Module") for easyblock in easyblocks: @@ -505,6 +505,10 @@ def innertest(self): elif eb_fn in ['python.py', 'tkinter.py']: # custom easyblock for Python (ensurepip) requires version >= 3.4.0 innertest = make_inner_test(easyblock, name=eb_fn.replace('_', '-')[:-3], version='3.4.0') + elif eb_fn in ['juliapackage.py', 'juliabundle.py']: + # Building a Julia package/bundle requires Julia as a dependency + extra_txt = 'dependencies = [("Julia", "1.6.7")]' + innertest = make_inner_test(easyblock, name='julia-stuff', extra_txt=extra_txt) elif eb_fn == 'torchvision.py': # torchvision easyblock requires that PyTorch is listed as dependency extra_txt = "dependencies = [('PyTorch', '1.12.1')]"