Skip to content

Commit 210a2ec

Browse files
committed
Merge remote-tracking branch 'upstream/develop' into rocm-toolchain
2 parents c69bd8b + 9d84741 commit 210a2ec

348 files changed

Lines changed: 1176 additions & 496 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/unit_tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ jobs:
245245
# try and make sure output of running tests is clean (no printed messages/warnings)
246246
IGNORE_PATTERNS="no GitHub token available"
247247
IGNORE_PATTERNS+="|skipping SvnRepository test"
248+
IGNORE_PATTERNS+="|Skipping test_dep_graph"
248249
IGNORE_PATTERNS+="|requires Lmod as modules tool"
249250
IGNORE_PATTERNS+="|stty: 'standard input': Inappropriate ioctl for device"
250251
IGNORE_PATTERNS+="|CryptographyDeprecationWarning: Python 3.7"

RELEASE_NOTES

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,33 @@ For more detailed information, please see the git log.
33

44
These release notes can also be consulted at https://docs.easybuild.io/release-notes .
55

6+
v5.2.1 (20 Feb 2026)
7+
--------------------
8+
9+
update/bugfix release
10+
11+
- bug fixes:
12+
- ignore stderr for `rocm-smi` during test report creation (#5087)
13+
- use initially stored environment to determine GPU info for test reports (#5088)
14+
- add back `easybuild.toolchains.compiler.nvhpc` as deprecated toolchain compiler (#5089, #5096, #5105)
15+
- properly handle toolchains defining `openmp` toolchain opt as `dict` (relevant for NVHPC toolchain) (#5093)
16+
- enhance `get_source_tarball_from_git` to ensure that Git repo URL does not contain double slashes due to trailing slash in source URL (#5097)
17+
- fix crash with `MarkupError` in Rich when showing failed shell command containing special characters (#5098)
18+
- fix sub-toolchains of NVHPC and NVHPCToolchain and load each one where appropriate (#5103)
19+
- don't require installation prefix for toolchain dependencies that are an external module (#5108)
20+
- enhancements:
21+
- add support for injecting checksums for Rust crates (#4661)
22+
- include full shell command that failed in raised error (#5074)
23+
- improve error reporting for failures in `eb --merge-pr` and similar (#5076)
24+
- add LLVM toolchains using ParaStationMPI (#5094)
25+
- enhancements and fixes for test suite:
26+
- ignore output lines with skipped tests in check for unexpected output of test suite (#5082)
27+
- import specific submodule `pygraph.classes.digraph` in `test_dep_graph*` so we can skip the test if import fails with setuptools >= 82.0.0 (#5111, #5116)
28+
- other changes:
29+
- extend list of easyconfig parameters that extensions should not inherit: `sources`, `patches`, `checksums`, `skipsteps` (#5075)
30+
- deprecate `print_error` function and replace it with new `print_error_and_exit` function (#5092)
31+
- replace use of `datetime.utcfromtimestamp` which is deprecated since Python 3.12 (#5091)
32+
633

734
v5.2.0 (23 Dec 2025)
835
--------------------

easybuild/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
##
2-
# Copyright 2011-2025 Ghent University
2+
# Copyright 2011-2026 Ghent University
33
#
44
# This file is part of EasyBuild,
55
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),

easybuild/base/exceptions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright 2015-2025 Ghent University
2+
# Copyright 2015-2026 Ghent University
33
#
44
# This file is part of EasyBuild,
55
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),

easybuild/base/fancylogger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright 2011-2025 Ghent University
2+
# Copyright 2011-2026 Ghent University
33
#
44
# This file is part of EasyBuild,
55
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),

easybuild/base/generaloption.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright 2011-2025 Ghent University
2+
# Copyright 2011-2026 Ghent University
33
#
44
# This file is part of EasyBuild,
55
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),

easybuild/base/testing.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright 2014-2025 Ghent University
2+
# Copyright 2014-2026 Ghent University
33
#
44
# This file is part of EasyBuild,
55
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),
@@ -210,6 +210,15 @@ def mocked_stdout(self):
210210
finally:
211211
self.mock_stdout(False)
212212

213+
@contextmanager
214+
def mocked_stderr(self):
215+
"""Context manager to mock stdout"""
216+
self.mock_stderr(True)
217+
try:
218+
yield sys.stderr
219+
finally:
220+
self.mock_stderr(False)
221+
213222
@contextmanager
214223
def mocked_stdout_stderr(self, mock_stdout=True, mock_stderr=True):
215224
"""Context manager to mock stdout and stderr"""

easybuild/framework/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
##
2-
# Copyright 2009-2025 Ghent University
2+
# Copyright 2009-2026 Ghent University
33
#
44
# This file is part of EasyBuild,
55
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),

easybuild/framework/easyblock.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# #
2-
# Copyright 2009-2025 Ghent University
2+
# Copyright 2009-2026 Ghent University
33
#
44
# This file is part of EasyBuild,
55
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),
@@ -81,7 +81,7 @@
8181
from easybuild.tools import LooseVersion, config
8282
from easybuild.tools.build_details import get_build_stats
8383
from easybuild.tools.build_log import EasyBuildError, EasyBuildExit, dry_run_msg, dry_run_warning, dry_run_set_dirs
84-
from easybuild.tools.build_log import print_error, print_msg, print_warning
84+
from easybuild.tools.build_log import print_error_and_exit, print_msg, print_warning
8585
from easybuild.tools.config import CHECKSUM_PRIORITY_JSON, DEFAULT_ENVVAR_USERS_MODULES
8686
from easybuild.tools.config import EASYBUILD_SOURCES_URL, EBPYTHONPREFIXES # noqa
8787
from easybuild.tools.config import FORCE_DOWNLOAD_ALL, FORCE_DOWNLOAD_PATCHES, FORCE_DOWNLOAD_SOURCES
@@ -173,6 +173,14 @@ def extra_options(extra=None):
173173

174174
return extra
175175

176+
@staticmethod
177+
def src_parameter_names():
178+
"""
179+
Return list of EasyConfig parameter that contribute to the sources in the `src` member
180+
(or equivalently to the `sources` parameter of a parsed EasyConfig)
181+
"""
182+
return ['sources']
183+
176184
#
177185
# INIT
178186
#
@@ -1919,7 +1927,7 @@ def clean_up_fake_module(self, fake_mod_data):
19191927
# self.short_mod_name might not be set (e.g. during unit tests)
19201928
if fake_mod_path and self.short_mod_name is not None:
19211929
try:
1922-
self.modules_tool.unload([self.short_mod_name], log_changes=False)
1930+
self.modules_tool.unload([self.short_mod_name], hide_output=True)
19231931
self.modules_tool.remove_module_path(os.path.join(fake_mod_path, self.mod_subdir))
19241932
remove_dir(os.path.dirname(fake_mod_path))
19251933
except OSError as err:
@@ -2982,7 +2990,8 @@ def prepare_step(self, start_dir=True, load_tc_deps_modules=True):
29822990
if os.path.isabs(self.rpath_wrappers_dir):
29832991
_log.info(f"Using {self.rpath_wrappers_dir} to store/use RPATH wrappers")
29842992
else:
2985-
raise EasyBuildError(f"Path used for rpath_wrappers_dir is not an absolute path: {path}")
2993+
raise EasyBuildError("Path used for rpath_wrappers_dir is not an absolute path: %s",
2994+
self.rpath_wrappers_dir)
29862995

29872996
if self.iter_idx > 0:
29882997
# reset toolchain for iterative runs before preparing it again
@@ -4358,7 +4367,7 @@ def xs2str(xs):
43584367

43594368
# allow oversubscription of P processes on C cores (P>C) for software installed on top of Open MPI;
43604369
# this is useful to avoid failing of sanity check commands that involve MPI
4361-
if self.toolchain.mpi_family() and self.toolchain.mpi_family() in toolchain.OPENMPI:
4370+
if self.toolchain.mpi_family() and self.toolchain.mpi_family() == toolchain.OPENMPI:
43624371
env.setvar('OMPI_MCA_rmaps_base_oversubscribe', '1')
43634372

43644373
# run sanity checks from an empty temp directory
@@ -5066,8 +5075,8 @@ def build_and_install_one(ecdict, init_env):
50665075
app = app_class(ecdict['ec'])
50675076
_log.info("Obtained application instance for %s (easyblock: %s)" % (name, easyblock))
50685077
except EasyBuildError as err:
5069-
print_error("Failed to get application instance for %s (easyblock: %s): %s" % (name, easyblock, err.msg),
5070-
silent=silent)
5078+
print_error_and_exit("Failed to get application instance for %s (easyblock: %s): %s", name, easyblock, err.msg,
5079+
silent=silent, exit_code=err.exit_code)
50715080

50725081
# application settings
50735082
stop = build_option('stop')
@@ -5603,8 +5612,8 @@ def make_checksum_lines(checksums, indent_level):
56035612
if app.src:
56045613
placeholder = '# PLACEHOLDER FOR SOURCES/PATCHES WITH CHECKSUMS'
56055614

5606-
# grab raw lines for source_urls, sources, data_sources, patches
5607-
keys = ['data_sources', 'patches', 'source_urls', 'sources']
5615+
# grab raw lines for the following params
5616+
keys = ['data_sources', 'source_urls'] + app.src_parameter_names() + ['patches']
56085617
raw = {}
56095618
for key in keys:
56105619
regex = re.compile(r'^(%s(?:.|\n)*?\])\s*$' % key, re.M)
@@ -5615,15 +5624,11 @@ def make_checksum_lines(checksums, indent_level):
56155624

56165625
_log.debug("Raw lines for %s easyconfig parameters: %s", '/'.join(keys), raw)
56175626

5618-
# inject combination of source_urls/sources/patches/checksums into easyconfig
5619-
# by replacing first occurence of placeholder that was put in place
5620-
sources_raw = raw.get('sources', '')
5621-
data_sources_raw = raw.get('data_sources', '')
5622-
source_urls_raw = raw.get('source_urls', '')
5623-
patches_raw = raw.get('patches', '')
5627+
# inject combination of the grabbed lines and the checksums into the easyconfig
5628+
# by replacing first the occurence of the placeholder that was put in place
5629+
raw_text = ''.join(raw.get(key, '') for key in keys)
56245630
regex = re.compile(placeholder + '\n', re.M)
5625-
ectxt = regex.sub(source_urls_raw + sources_raw + data_sources_raw + patches_raw + checksums_txt + '\n',
5626-
ectxt, count=1)
5631+
ectxt = regex.sub(raw_text + checksums_txt + '\n', ectxt, count=1)
56275632

56285633
# get rid of potential remaining placeholders
56295634
ectxt = regex.sub('', ectxt)

easybuild/framework/easyconfig/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# #
2-
# Copyright 2009-2025 Ghent University
2+
# Copyright 2009-2026 Ghent University
33
#
44
# This file is part of EasyBuild,
55
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),

0 commit comments

Comments
 (0)