Skip to content

Commit a821129

Browse files
authored
Merge pull request #3946 from easybuilders/5.1.x
release EasyBuild v5.1.2
2 parents c710c1d + 8148bd0 commit a821129

Some content is hidden

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

55 files changed

+1303
-551
lines changed

RELEASE_NOTES

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,90 @@ 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-
The latest version of easybuild-easyblocks provides 200 software-specific easyblocks and 45 generic easyblocks.
6+
The latest version of easybuild-easyblocks provides 201 software-specific easyblocks and 45 generic easyblocks.
7+
8+
9+
v5.1.2 (26 Sept 2025)
10+
---------------------
11+
12+
update/bugfix release
13+
14+
- new easyblocks:
15+
- restore custom easyblock for ipp and update it for EasyBuild 5.0+ (#3890)
16+
- enhancements:
17+
- improvements to custom easyblock for LLVM:
18+
- fix build of LLVM on RISC-V systems and ignore a bunch of tests (#3676)
19+
- make LLVM easyblock aware of `amdgcn_capabilities` build option (#3824)
20+
- explicitely set OMPT options for LLVM (#3853)
21+
- run tests for LLVM in parallel (#3875)
22+
- add sanity check to link system libraries to LLVM easyblock (#3877)
23+
- add custom easyconfig parameter for LLVM to ignore timed out tests (#3903)
24+
- enhance custom easyblock for NCCL so it defines `$NCCL_HOME` in generated module file (#3782)
25+
- enhance `Bundle` easyblock to show status of component installation (#3783)
26+
- enhance LAMMPS easyblock to use `FFT_KOKKOS` configure option (#3784)
27+
- add option to `CMakeMake` to specify name of build directory (#3786)
28+
- improve error message when CMake picked up invalid Python paths (#3833)
29+
- enhance FlexiBLAS easyblock to support NVPL library (#3866)
30+
- enhance Python easyblock to handle Tcl/Tk 9.0+ with external libtommath (#3867)
31+
- avoid writes to $HOME from Triton during PyTorch tests by setting `$TRITON_HOME` (#3876)
32+
- update torchvision easyblock for libwebp support (#3882)
33+
- allow oversubscription for FFTW tests, also for OpenMPI-5.X onwards (#3884)
34+
- enhance custom easyblock for SuperLU to allow oversubscription when running tests (#3885)
35+
- allow bypass of `update_amber` in custom easyblock for Amber/AmberTools (#3901)
36+
- set required Python environment variables when installing `lammps` Python package (#3915)
37+
- updates:
38+
- update TensorFlow easyblock for CUDA support in TensorFlow 2.18+ (#3765)
39+
- update ORCA easyblock for version 6.1.0 (#3796)
40+
- update DualSPHysics sanity checks for newer version (#3850)
41+
- update jaxlib easyblock for jax/jaxlib v0.6.2 and v0.7.0 (#3852)
42+
- update Amber easyblock for AmberTools >= 24.x (#3868)
43+
- update sanity check in custom easyblock for MUMPS to support v5.8.0 and higher (#3879)
44+
- update Mesa easyblock to remove `osmesa` part of the sanity check, since that's removed from Mesa 25.1 onwards (#3896)
45+
- bug fixes:
46+
- various fixes for custom easyblock for LLVM:
47+
- use property for `gcc_prefix`/`gcc_root` in LLVM easyblock (#3793)
48+
- move openmp to a runtime in newer versions of LLVM (#3799)
49+
- add explicit enabling/disabling of `libffi` with custom paths in LLVM easyblock (#3849)
50+
- fix missing `LIBOMPTARGET_DEVICE_ARCHITECTURES` in third stage of bootstrap build in LLVM easyblock (#3851)
51+
- allow sysroot for minimal builds for LLVM versions < 19 (#3880)
52+
- only consider explicit dependencies in LLVM easyblock (#3881)
53+
- disable LLVM OpenMP tests using Thread sanitizer if requested (#3883)
54+
- fix sanity check step of LLVM by loading `binutils` as extra module (#3899)
55+
- revert Python shebangs change for conda (#3760)
56+
- disable UCX signal catching in Java by setting `$UCX_ERROR_SIGNALS` (#3832)
57+
- stop setting `separate_build_dir` to `True` and update GPU target in custom easyblock for DualSPhysics (#3835)
58+
- remove use of deprecated `verbose` option in `build_step` methods (#3856, #3858)
59+
- add back configure options for PETSc dependencies with generic `--with` options (#3857)
60+
- remove duplicated output of test command from `PythonPackage` easyblock (#3859)
61+
- use `--COPTFLAGS`/`--CXXOPTFLAGS`/`--FOPTFLAGS` instead of (undocumented) `--CFLAGS`/`--CXXFLAGS`/`--FFLAGS` as configure option for PETSc (#3863)
62+
- use `sanity_check_load_module` in sanity check step of custom easyblock for pybind11 (#3864)
63+
- respect `--ignore-test-failure` and `--skip-test-step` for Perl extensions (#3865)
64+
- fix use of `--sanity-check-only` for custom easyblock for installing EasyBuild (#3871)
65+
- explicitly set LAPACK/BLAS to FlexiBLAS if present in OpenCV (#3874)
66+
- fix ELPA easyblock to not pass sm80 configure flag for newer NVIDIA GPUs (#3886)
67+
- fix ignore test typo in PyTorch easyblock (#3898)
68+
- accept arguments for `sanity_check_step` in HPL easyblock (#3904)
69+
- load module in Bundle easyblock instead of components (#3905)
70+
- change OpenFOAM easyblock to not use `cp -a`, might fail with NFS ACLs on install directory (#3916)
71+
- make HPL easyblock intel-aware + allow running the `xhpl` benchmark as a test (#3917)
72+
- resolve templates in `CmdCp` easyblock (#3918)
73+
- update WPS easyblock to patch CPP to replace the use of hardcoded `/usr/bin/cpp` (#3919)
74+
- fix `FATAL ERROR` regex to not match `printf` lines in OpenBLAS easyblock (#3923)
75+
- fix unresolved templates in `modextravars`/`modextrapaths` of components (#3940)
76+
- enhancements and fixes for test suite:
77+
- other changes:
78+
- deprecate the Clang Easyblock in favor of the LLVM one for newer (>=18.1.6) versions of LLVM (#3746)
79+
- don't install libomp aliases by default in LLVM easyblock (#3825)
80+
- clean up GCC-related options for full-LLVM build (#3827)
81+
- clean up ancient version support in custom easyblock for ROOT (#3841)
82+
- increase the default for the maximum number of failed PyTorch tests to 10 (#3869)
83+
- change `buildenv` easyblock: use `python3` as default path to Python executable in RPATH wrapper scripts (#3910)
84+
- limit parallelism of OpenBLAS tests with parallel property (#3936)
85+
- remove deprecated license classifier in setup.py (#3942)
86+
- code cleanup:
87+
- simplify use of `self.cfg.dependencies()` in `PETSc` easyblock (#3813)
88+
- stop setting `separate_build_dir` to `True` in various custom easyblock for Geant4 (#3836, #3837, #3838, #3839, #3840, #3842, #3843, #3844, #3845, #3846, #3847)
89+
- remove disabling libunwind on aarch64 for Mesa (#3908)
790

891

992
v5.1.1 (6 July 2025)

easybuild/easyblocks/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
# recent setuptools versions will *TRANSFORM* something like 'X.Y.Zdev' into 'X.Y.Z.dev0', with a warning like
4343
# UserWarning: Normalizing '2.4.0dev' to '2.4.0.dev0'
4444
# This causes problems further up the dependency chain...
45-
VERSION = '5.1.1'
45+
VERSION = '5.1.2'
4646
UNKNOWN = 'UNKNOWN'
4747

4848

easybuild/easyblocks/a/amber.py

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -88,35 +88,37 @@ def extract_step(self):
8888
def patch_step(self, *args, **kwargs):
8989
"""Patch Amber using 'update_amber' tool, prior to applying listed patch files (if any)."""
9090

91-
# figure out which Python command to use to run the update_amber script;
92-
# by default it uses 'python', but this may not be available (on CentOS 8 for example);
93-
# note that the dependencies are not loaded yet at this point, so we're at the mercy of the OS here...
94-
python_cmd = None
95-
for cand_python_cmd in ['python', 'python3', 'python2']:
96-
if which(cand_python_cmd):
97-
python_cmd = cand_python_cmd
98-
break
99-
100-
if python_cmd is None:
101-
raise EasyBuildError("No suitable Python command found to run update_amber script!")
102-
103-
if self.cfg['patchlevels'] == "latest":
104-
cmd = "%s ./update_amber --update" % python_cmd
105-
# Run as many times as specified. It is the responsibility
106-
# of the easyconfig author to get this right, especially if
107-
# he or she selects "latest". (Note: "latest" is not
108-
# recommended for this reason and others.)
109-
for _ in range(self.cfg['patchruns']):
110-
run_shell_cmd(cmd)
111-
else:
112-
for (tree, patch_level) in zip(['AmberTools', 'Amber'], self.cfg['patchlevels']):
113-
if patch_level == 0:
114-
continue
115-
cmd = "%s ./update_amber --update-to %s/%s" % (python_cmd, tree, patch_level)
91+
# Use the update_amber script if patchlevels is defined - if not then the easyconfig should apply the patches
92+
if self.cfg['patchlevels']:
93+
# figure out which Python command to use to run the update_amber script;
94+
# by default it uses 'python', but this may not be available (on CentOS 8 for example);
95+
# note that the dependencies are not loaded yet at this point, so we're at the mercy of the OS here...
96+
python_cmd = None
97+
for cand_python_cmd in ['python', 'python3', 'python2']:
98+
if which(cand_python_cmd):
99+
python_cmd = cand_python_cmd
100+
break
101+
102+
if python_cmd is None:
103+
raise EasyBuildError("No suitable Python command found to run update_amber script!")
104+
105+
if self.cfg['patchlevels'] == "latest":
106+
cmd = "%s ./update_amber --update" % python_cmd
116107
# Run as many times as specified. It is the responsibility
117-
# of the easyconfig author to get this right.
108+
# of the easyconfig author to get this right, especially if
109+
# he or she selects "latest". (Note: "latest" is not
110+
# recommended for this reason and others.)
118111
for _ in range(self.cfg['patchruns']):
119112
run_shell_cmd(cmd)
113+
else:
114+
for (tree, patch_level) in zip(['AmberTools', 'Amber'], self.cfg['patchlevels']):
115+
if patch_level == 0:
116+
continue
117+
cmd = "%s ./update_amber --update-to %s/%s" % (python_cmd, tree, patch_level)
118+
# Run as many times as specified. It is the responsibility
119+
# of the easyconfig author to get this right.
120+
for _ in range(self.cfg['patchruns']):
121+
run_shell_cmd(cmd)
120122

121123
super().patch_step(*args, **kwargs)
122124

@@ -328,10 +330,13 @@ def install_step(self):
328330

329331
super().install_step()
330332

331-
# Run the tests located in the build directory
333+
# Run the tests
332334
if self.cfg['runtest']:
333335
if LooseVersion(self.version) >= LooseVersion('24'):
334-
testdir = os.path.join(self.builddir, 'test')
336+
if self.name == 'AmberTools':
337+
testdir = os.path.join(self.builddir, 'AmberTools', 'test')
338+
elif self.name == 'Amber':
339+
testdir = os.path.join(self.builddir, 'test')
335340
testname_cs = 'test.cuda.serial'
336341
testname_cp = 'test.cuda.parallel'
337342
else:
@@ -341,12 +346,16 @@ def install_step(self):
341346
pretestcommands = 'source %s/amber.sh && cd %s' % (self.installdir, testdir)
342347

343348
# serial tests
344-
run_shell_cmd("%s && make test.serial" % pretestcommands)
349+
if LooseVersion(self.version) >= LooseVersion('24'):
350+
run_shell_cmd("%s && make test" % pretestcommands)
351+
else:
352+
run_shell_cmd("%s && make test.serial" % pretestcommands)
345353
if self.with_cuda:
346354
res = run_shell_cmd(f"{pretestcommands} && make {testname_cs}")
347355
if res.exit_code > 0:
348356
self.log.warning("Check the output of the Amber cuda tests for possible failures")
349357

358+
# parallel tests
350359
if self.with_mpi:
351360
# Hard-code parallel tests to use 4 threads
352361
env.setvar("DO_PARALLEL", self.toolchain.mpi_cmd_for('', 4))
@@ -373,11 +382,15 @@ def sanity_check_step(self):
373382
binaries.append('pmemd.cuda.MPI')
374383
else:
375384
binaries.append('pmemd.cuda_DPFP.MPI')
385+
if self.name == 'AmberTools':
386+
binaries.append('gem.pmemd')
376387

377388
if self.with_mpi:
378389
binaries.extend(['sander.MPI'])
379390
if self.name == 'Amber':
380391
binaries.append('pmemd.MPI')
392+
if self.name == 'AmberTools':
393+
binaries.append('gem.pmemd.MPI')
381394

382395
custom_paths = {
383396
'files': [os.path.join(self.installdir, 'bin', binary) for binary in binaries],

easybuild/easyblocks/a/anaconda.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import stat
3434

3535
from easybuild.easyblocks.generic.binary import Binary
36-
from easybuild.framework.easyconfig import CUSTOM
3736
from easybuild.tools.filetools import adjust_permissions, remove_dir
3837
from easybuild.tools.modules import MODULE_LOAD_ENV_HEADERS
3938
from easybuild.tools.run import run_shell_cmd
@@ -42,16 +41,6 @@
4241
class EB_Anaconda(Binary):
4342
"""Support for building/installing Anaconda and Miniconda."""
4443

45-
@staticmethod
46-
def extra_options():
47-
"""Add extra config options specific to Python."""
48-
extra_vars = {
49-
'fix_python_shebang_for': [['bin/*'], "List of files for which Python shebang should be fixed "
50-
"to '#!/usr/bin/env python' (glob patterns supported) "
51-
"(default: ['bin/*'])", CUSTOM],
52-
}
53-
return Binary.extra_options(extra_vars)
54-
5544
def __init__(self, *args, **kwargs):
5645
"""Initialize class variables."""
5746
super().__init__(*args, **kwargs)

easybuild/easyblocks/a/armadillo.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,6 @@
3838
class EB_Armadillo(CMakeMake):
3939
"""Support for building Armadillo."""
4040

41-
@staticmethod
42-
def extra_options():
43-
"""Extra easyconfig parameters for Armadillo."""
44-
extra_vars = CMakeMake.extra_options()
45-
extra_vars['separate_build_dir'][0] = True
46-
return extra_vars
47-
4841
def configure_step(self):
4942
"""Set some extra environment variables before configuring."""
5043

easybuild/easyblocks/b/blat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ def configure_step(self):
4242
"""Configure build: just create a 'bin' directory."""
4343
mkdir("bin")
4444

45-
def build_step(self, verbose=False):
45+
def build_step(self, *args, **kwargs):
4646
"""Build BLAT using make and the appropriate options (e.g. BINDIR=)."""
4747
self.cfg.update('prebuildopts', "MACHTYPE=x86_64")
4848
bindir = os.path.join(os.getcwd(), "bin")
4949
self.cfg.update('buildopts', "BINDIR=%s" % bindir)
5050

51-
return super().build_step(verbose=verbose)
51+
return super().build_step(*args, **kwargs)

easybuild/easyblocks/c/cgal.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,6 @@
4242
class EB_CGAL(CMakeMake):
4343
"""Support for building CGAL."""
4444

45-
@staticmethod
46-
def extra_options():
47-
extra_vars = CMakeMake.extra_options()
48-
extra_vars['separate_build_dir'][0] = True
49-
return extra_vars
50-
5145
def configure_step(self):
5246
"""Set some extra environment variables before configuring."""
5347

easybuild/easyblocks/c/clang.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@ def __init__(self, *args, **kwargs):
120120
"""Initialize custom class variables for Clang."""
121121

122122
super().__init__(*args, **kwargs)
123+
124+
if LooseVersion(self.version) >= LooseVersion('18.1.6'):
125+
raise EasyBuildError(
126+
"The Clang EasyBlock has been deprecated and does not support LLVM versions >= 18.1.6. "
127+
"Please use the 'LLVM' EasyBlock instead, which supports building Clang as well "
128+
"as other LLVM projects."
129+
)
130+
123131
self.llvm_src_dir = None
124132
self.llvm_obj_dir_stage1 = None
125133
self.llvm_obj_dir_stage2 = None

easybuild/easyblocks/d/dualsphysics.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from easybuild.tools.filetools import adjust_permissions
3939
from easybuild.tools.modules import get_software_root
4040
from easybuild.tools.run import run_shell_cmd
41+
from easybuild.tools import LooseVersion
4142

4243

4344
class EB_DualSPHysics(CMakeMakeCp):
@@ -48,8 +49,6 @@ def extra_options():
4849
"""Extra easyconfig parameters for DualSPHysics."""
4950
extra_vars = CMakeMakeCp.extra_options()
5051

51-
extra_vars['separate_build_dir'][0] = True
52-
5352
# files_to_copy is not mandatory here since we set it in the easyblock
5453
extra_vars['files_to_copy'][2] = CUSTOM
5554
return extra_vars
@@ -66,7 +65,7 @@ def prepare_step(self, *args, **kwargs):
6665
super().prepare_step(*args, **kwargs)
6766

6867
if get_software_root('CUDA'):
69-
self.dsph_target = 'GPU'
68+
self.dsph_target = ''
7069
else:
7170
self.dsph_target = 'CPU'
7271

@@ -128,14 +127,27 @@ def sanity_check_step(self):
128127

129128
# repeated here in case other steps are skipped (e.g. due to --sanity-check-only)
130129
if get_software_root('CUDA'):
131-
self.dsph_target = 'GPU'
130+
self.dsph_target = ''
132131
else:
133132
self.dsph_target = 'CPU'
134133

135-
bins = ['GenCase', 'PartVTK', 'IsoSurface', 'MeasureTool', 'GenCase_MkWord', 'DualSPHysics4.0_LiquidGas',
136-
'DualSPHysics4.0_LiquidGasCPU', 'DualSPHysics%s' % self.shortver,
137-
'DualSPHysics%s%s' % (self.shortver, self.dsph_target), 'DualSPHysics%s_NNewtonian' % self.shortver,
138-
'DualSPHysics%s_NNewtonianCPU' % self.shortver]
134+
# Determine which binaries to check based on version
135+
if LooseVersion(self.version) >= LooseVersion('5.4.0'):
136+
bins = [
137+
'GenCase', 'PartVTK', 'IsoSurface', 'MeasureTool',
138+
'DualSPHysics%sCPU' % self.shortver
139+
]
140+
if self.dsph_target == '':
141+
bins.append('DualSPHysics%s' % self.shortver)
142+
else:
143+
bins = [
144+
'GenCase', 'PartVTK', 'IsoSurface', 'MeasureTool', 'GenCase_MkWord',
145+
'DualSPHysics4.0_LiquidGas', 'DualSPHysics4.0_LiquidGasCPU',
146+
'DualSPHysics%s' % self.shortver,
147+
'DualSPHysics%s%s' % (self.shortver, self.dsph_target),
148+
'DualSPHysics%s_NNewtonian' % self.shortver,
149+
'DualSPHysics%s_NNewtonianCPU' % self.shortver,
150+
]
139151

140152
custom_paths = {
141153
'files': ['bin/%s_linux64' % x for x in bins],

easybuild/easyblocks/e/easybuildmeta.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import os
3232
import re
3333
import sys
34+
import tempfile
3435
from collections import OrderedDict
3536

3637
from easybuild.easyblocks.generic.pythonpackage import PythonPackage
@@ -189,6 +190,9 @@ def post_processing_step(self):
189190
def sanity_check_step(self):
190191
"""Custom sanity check for EasyBuild."""
191192

193+
if self.python_cmd is None:
194+
self.prepare_python()
195+
192196
# check whether easy-install.pth contains correct entries
193197
easy_install_pth = os.path.join(self.installdir, self.pylibdir, 'easy-install.pth')
194198
if os.path.exists(easy_install_pth):
@@ -290,7 +294,10 @@ def sanity_check_step(self):
290294
val = self.initial_environ.pop(key)
291295
self.log.info("$%s found in environment, unset for running sanity check (was: %s)", key, val)
292296

293-
super().sanity_check_step(custom_paths=custom_paths, custom_commands=custom_commands)
297+
with tempfile.TemporaryDirectory() as tempdir:
298+
# Similar avoid a custom config being used which might define options unknown to that EasyBuild version
299+
self.initial_environ['XDG_CONFIG_HOME'] = tempdir
300+
super().sanity_check_step(custom_paths=custom_paths, custom_commands=custom_commands)
294301

295302
def make_module_extra(self):
296303
"""

0 commit comments

Comments
 (0)