Skip to content

Commit 301c21f

Browse files
authored
Merge pull request #3088 from boegel/env_vars_external_module
flesh out env_vars_external_module from Toolchain._simulated_load_dependency_module
2 parents dd72827 + 31674e9 commit 301c21f

File tree

2 files changed

+58
-24
lines changed

2 files changed

+58
-24
lines changed

easybuild/tools/toolchain/toolchain.py

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,41 @@ def is_system_toolchain(tc_name):
106106
return tc_name in [DUMMY_TOOLCHAIN_NAME, SYSTEM_TOOLCHAIN_NAME]
107107

108108

109+
def env_vars_external_module(name, version, metadata):
110+
"""
111+
Determine $EBROOT* and/or $EBVERSION* environment variables that can be set for external module,
112+
based on the provided name, version and metadata.
113+
"""
114+
env_vars = {}
115+
116+
# define $EBROOT env var for install prefix, picked up by get_software_root
117+
prefix = metadata.get('prefix')
118+
if prefix is not None:
119+
# the prefix can be specified in a number of ways
120+
# * name of environment variable (+ optional relative path to combine it with; format: <name>/<relpath>
121+
# * filepath (assumed if environment variable is not defined)
122+
parts = prefix.split(os.path.sep)
123+
env_var = parts[0]
124+
if env_var in os.environ:
125+
prefix = os.environ[env_var]
126+
rel_path = os.path.sep.join(parts[1:])
127+
if rel_path:
128+
prefix = os.path.join(prefix, rel_path, '')
129+
130+
_log.debug("Derived prefix for software named %s from $%s (rel path: %s): %s",
131+
name, env_var, rel_path, prefix)
132+
else:
133+
_log.debug("Using specified path as prefix for software named %s: %s", name, prefix)
134+
135+
env_vars[get_software_root_env_var_name(name)] = prefix
136+
137+
# define $EBVERSION env var for software version, picked up by get_software_version
138+
if version is not None:
139+
env_vars[get_software_version_env_var_name(name)] = version
140+
141+
return env_vars
142+
143+
109144
class Toolchain(object):
110145
"""General toolchain class"""
111146

@@ -512,30 +547,9 @@ def _simulated_load_dependency_module(self, name, version, metadata, verbose=Fal
512547

513548
self.log.debug("Defining $EB* environment variables for software named %s", name)
514549

515-
# define $EBROOT env var for install prefix, picked up by get_software_root
516-
prefix = metadata.get('prefix')
517-
if prefix is not None:
518-
# the prefix can be specified in a number of ways
519-
# * name of environment variable (+ optional relative path to combine it with; format: <name>/<relpath>
520-
# * filepath (assumed if environment variable is not defined)
521-
parts = prefix.split(os.path.sep)
522-
env_var = parts[0]
523-
if env_var in os.environ:
524-
prefix = os.environ[env_var]
525-
rel_path = os.path.sep.join(parts[1:])
526-
if rel_path:
527-
prefix = os.path.join(prefix, rel_path, '')
528-
529-
self.log.debug("Derived prefix for software named %s from $%s (rel path: %s): %s",
530-
name, env_var, rel_path, prefix)
531-
else:
532-
self.log.debug("Using specified path as prefix for software named %s: %s", name, prefix)
533-
534-
setvar(get_software_root_env_var_name(name), prefix, verbose=verbose)
535-
536-
# define $EBVERSION env var for software version, picked up by get_software_version
537-
if version is not None:
538-
setvar(get_software_version_env_var_name(name), version, verbose=verbose)
550+
env_vars = env_vars_external_module(name, version, metadata)
551+
for key in env_vars:
552+
setvar(key, env_vars[key], verbose=verbose)
539553

540554
def _load_toolchain_module(self, silent=False):
541555
"""Load toolchain module."""

test/framework/toolchain.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
from easybuild.tools.filetools import adjust_permissions, copy_dir, find_eb_script, mkdir, read_file, write_file, which
5050
from easybuild.tools.py2vs3 import string_type
5151
from easybuild.tools.run import run_cmd
52+
from easybuild.tools.toolchain.toolchain import env_vars_external_module
5253
from easybuild.tools.toolchain.utilities import get_toolchain, search_toolchain
5354

5455
easybuild.tools.toolchain.compiler.systemtools.get_compiler_family = lambda: st.POWER
@@ -1830,6 +1831,25 @@ def prep():
18301831
# we may have created our own short tmpdir above, so make sure to clean things up...
18311832
shutil.rmtree(orig_tmpdir)
18321833

1834+
def test_env_vars_external_module(self):
1835+
"""Test env_vars_external_module function."""
1836+
1837+
res = env_vars_external_module('test', '1.2.3', {'prefix': '/software/test/1.2.3'})
1838+
expected = {'EBVERSIONTEST': '1.2.3', 'EBROOTTEST': '/software/test/1.2.3'}
1839+
self.assertEqual(res, expected)
1840+
1841+
res = env_vars_external_module('test-test', '1.2.3', {})
1842+
expected = {'EBVERSIONTESTMINTEST': '1.2.3'}
1843+
self.assertEqual(res, expected)
1844+
1845+
res = env_vars_external_module('test', None, {'prefix': '/software/test/1.2.3'})
1846+
expected = {'EBROOTTEST': '/software/test/1.2.3'}
1847+
self.assertEqual(res, expected)
1848+
1849+
res = env_vars_external_module('test', None, {})
1850+
expected = {}
1851+
self.assertEqual(res, expected)
1852+
18331853

18341854
def suite():
18351855
""" return all the tests"""

0 commit comments

Comments
 (0)