Skip to content

Commit f3b642b

Browse files
author
SebastianAchilles
authored
Merge pull request #4023 from easybuilders/4.5.x
release EasyBuild v4.5.5
2 parents 26af550 + 901fc36 commit f3b642b

File tree

24 files changed

+442
-62
lines changed

24 files changed

+442
-62
lines changed

.github/workflows/eb_command.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ jobs:
7373
pymajver=$(python -c 'import sys; print(sys.version_info[0])')
7474
pymajminver=$(python -c 'import sys; print(".".join(str(x) for x in sys.version_info[:2]))')
7575
# check patterns in verbose output
76-
for pattern in "^>> Considering .python.\.\.\." "^>> .python. version: ${pymajminver}\.[0-9]\+, which matches Python ${pymajver} version requirement" "^>> 'python' is able to import 'easybuild.main', so retaining it" "^>> Selected Python command: python \(.*/bin/python\)" "^This is EasyBuild 4\.[0-9.]\+"; do
76+
for pattern in "^>> Considering .python.\.\.\." "^>> .python. version: ${pymajminver}\.[0-9]\+, which matches Python ${pymajver} version requirement" "^>> 'python' is able to import 'easybuild.framework', so retaining it" "^>> Selected Python command: python \(.*/bin/python\)" "^This is EasyBuild 4\.[0-9.]\+"; do
7777
echo "Looking for pattern \"${pattern}\" in eb_version.out..."
7878
grep "$pattern" eb_version.out
7979
done
8080
# also check when specifying Python command via $EB_PYTHON
8181
for eb_python in "python${pymajver}" "python${pymajminver}"; do
8282
export EB_PYTHON="${eb_python}"
8383
eb --version | tee eb_version.out 2>&1
84-
for pattern in "^>> Considering .${eb_python}.\.\.\." "^>> .${eb_python}. version: ${pymajminver}\.[0-9]\+, which matches Python ${pymajver} version requirement" "^>> '${eb_python}' is able to import 'easybuild.main', so retaining it" "^>> Selected Python command: ${eb_python} \(.*/bin/${eb_python}\)" "^This is EasyBuild 4\.[0-9.]\+"; do
84+
for pattern in "^>> Considering .${eb_python}.\.\.\." "^>> .${eb_python}. version: ${pymajminver}\.[0-9]\+, which matches Python ${pymajver} version requirement" "^>> '${eb_python}' is able to import 'easybuild.framework', so retaining it" "^>> Selected Python command: ${eb_python} \(.*/bin/${eb_python}\)" "^This is EasyBuild 4\.[0-9.]\+"; do
8585
echo "Looking for pattern \"${pattern}\" in eb_version.out..."
8686
grep "$pattern" eb_version.out
8787
done

.github/workflows/unit_tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ jobs:
200200
# run test suite
201201
python -O -m test.framework.suite 2>&1 | tee test_framework_suite.log
202202
# try and make sure output of running tests is clean (no printed messages/warnings)
203-
IGNORE_PATTERNS="no GitHub token available|skipping SvnRepository test|requires Lmod as modules tool|stty: 'standard input': Inappropriate ioctl for device|CryptographyDeprecationWarning: Python 3.5|from cryptography.*default_backend|CryptographyDeprecationWarning: Python 2|from cryptography.utils import int_from_bytes"
203+
IGNORE_PATTERNS="no GitHub token available|skipping SvnRepository test|requires Lmod as modules tool|stty: 'standard input': Inappropriate ioctl for device|CryptographyDeprecationWarning: Python 3.[56]|from cryptography.*default_backend|CryptographyDeprecationWarning: Python 2|from cryptography.utils import int_from_bytes|Blowfish"
204204
# '|| true' is needed to avoid that Travis stops the job on non-zero exit of grep (i.e. when there are no matches)
205205
PRINTED_MSG=$(egrep -v "${IGNORE_PATTERNS}" test_framework_suite.log | grep '\.\n*[A-Za-z]' || true)
206206
test "x$PRINTED_MSG" = "x" || (echo "ERROR: Found printed messages in output of test suite\n${PRINTED_MSG}" && exit 1)

RELEASE_NOTES

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,27 @@ For more detailed information, please see the git log.
44
These release notes can also be consulted at https://easybuild.readthedocs.io/en/latest/Release_notes.html.
55

66

7+
v4.5.5 (June 8th 2022)
8+
----------------------
9+
10+
update/bugfix release
11+
12+
- various enhancements, including:
13+
- add toolchain definitions for nvompi (NVHPC + OpenMPI) (#3969), nvpsmpi (NVHPC + ParaStationMPI) (#3970), gfbf (GCC, FlexiBLAS, FFTW) (#4006)
14+
- add support for FFTW.MPI toolchain component ($FFT*DIR variables) (#4012)
15+
- add support for customizing EasyBuild command used in jobs via --job-eb-cmd (#4016)
16+
- various bug fixes, including:
17+
- fix copying of easyconfig file with --copy-ec without --rebuild if module is already installed (#3993)
18+
- ignore deprecation warnings regarding cryptography in Python 3.6 + Blowfish with Python 3.10 in test suite output (#3999)
19+
- fix typo in debug log message in easyblock.py (#4000)
20+
- fix printing of list of attempted download URLs when url-encoded characters are used in URL (#4005)
21+
- set $FFT(W)_LIB_DIR to imkl-FFTW's lib path in build environment if usempi toolchain option is enabled (#4011)
22+
- correctly identify Apple Silicon M1 as Arm 64-bit by also considering arm64 next to aarch64 (#4014)
23+
- fix 'eb --show-system-info' on Apple M1 system (#4015)
24+
- other changes:
25+
- change 'eb' command to import easybuild.framework to check if EasyBuild framework is available (#3995, #3998)
26+
27+
728
v4.5.4 (March 31st 2022)
829
------------------------
930

easybuild/framework/easyblock.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -883,8 +883,10 @@ def obtain_file(self, filename, extension=False, urls=None, download_filename=No
883883
error_msg += "please follow the download instructions above, and make the file available "
884884
error_msg += "in the active source path (%s)" % ':'.join(source_paths())
885885
else:
886+
# flatten list to string with '%' characters escaped (literal '%' desired in 'sprintf')
887+
failedpaths_msg = ', '.join(failedpaths).replace('%', '%%')
886888
error_msg += "and downloading it didn't work either... "
887-
error_msg += "Paths attempted (in order): %s " % ', '.join(failedpaths)
889+
error_msg += "Paths attempted (in order): %s " % failedpaths_msg
888890

889891
raise EasyBuildError(error_msg, filename)
890892

@@ -3286,7 +3288,7 @@ def _sanity_check_step_dry_run(self, custom_paths=None, custom_commands=None, **
32863288
if self.toolchain.use_rpath:
32873289
self.sanity_check_rpath()
32883290
else:
3289-
self.log.debug("Skiping RPATH sanity check")
3291+
self.log.debug("Skipping RPATH sanity check")
32903292

32913293
def _sanity_check_step_extensions(self):
32923294
"""Sanity check on extensions (if any)."""
@@ -3452,7 +3454,7 @@ def xs2str(xs):
34523454
self.log.warning("RPATH sanity check failed!")
34533455
self.sanity_check_fail_msgs.extend(rpath_fails)
34543456
else:
3455-
self.log.debug("Skiping RPATH sanity check")
3457+
self.log.debug("Skipping RPATH sanity check")
34563458

34573459
# pass or fail
34583460
if self.sanity_check_fail_msgs:

easybuild/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ def main(args=None, logfile=None, do_build=None, testing=False, modtool=None):
447447
forced = options.force or options.rebuild
448448
dry_run_mode = options.dry_run or options.dry_run_short or options.missing_modules
449449

450-
keep_available_modules = forced or dry_run_mode or options.extended_dry_run or pr_options
450+
keep_available_modules = forced or dry_run_mode or options.extended_dry_run or pr_options or options.copy_ec
451451
keep_available_modules = keep_available_modules or options.inject_checksums or options.sanity_check_only
452452

453453
# skip modules that are already installed unless forced, or unless an option is used that warrants not skipping

easybuild/toolchains/fft/fftw.py

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

3434
from easybuild.tools.build_log import EasyBuildError
3535
from easybuild.tools.toolchain.fft import Fft
36+
from easybuild.tools.modules import get_software_root
3637

3738

3839
class Fftw(Fft):
@@ -56,6 +57,11 @@ def _set_fftw_variables(self):
5657
fftw_libs = ["fftw%s" % suffix]
5758
if self.options.get('usempi', False):
5859
fftw_libs.insert(0, "fftw%s_mpi" % suffix)
60+
fftwmpiroot = get_software_root('FFTW.MPI')
61+
if fftwmpiroot:
62+
# get libfft%_mpi via the FFTW.MPI module
63+
self.FFT_MODULE_NAME = ['FFTW.MPI']
64+
5965
fftw_libs_mt = ["fftw%s" % suffix]
6066
if self.options.get('openmp', False):
6167
fftw_libs_mt.insert(0, "fftw%s_omp" % suffix)

easybuild/toolchains/fft/intelfftw.py

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ def _set_fftw_variables(self):
4949
if not hasattr(self, 'BLAS_LIB_DIR'):
5050
raise EasyBuildError("_set_fftw_variables: IntelFFT based on IntelMKL (no BLAS_LIB_DIR found)")
5151

52+
imklroot = get_software_root(self.FFT_MODULE_NAME[0])
5253
imklver = get_software_version(self.FFT_MODULE_NAME[0])
54+
self.FFT_LIB_DIR = self.BLAS_LIB_DIR
55+
self.FFT_INCLUDE_DIR = [os.path.join(d, 'fftw') for d in self.BLAS_INCLUDE_DIR]
5356

5457
picsuff = ''
5558
if self.options.get('pic', None):
@@ -69,54 +72,47 @@ def _set_fftw_variables(self):
6972
raise EasyBuildError(error_msg)
7073

7174
interface_lib = "fftw3xc%s%s" % (compsuff, picsuff)
72-
fftw_libs = [interface_lib]
73-
cluster_interface_lib = None
75+
fft_lib_dirs = [os.path.join(imklroot, d) for d in self.FFT_LIB_DIR]
76+
77+
def fftw_lib_exists(libname):
78+
"""Helper function to check whether FFTW library with specified name exists."""
79+
return any(os.path.exists(os.path.join(d, "lib%s.a" % libname)) for d in fft_lib_dirs)
80+
81+
# interface libs can be optional:
82+
# MKL >= 10.2 include fftw3xc and fftw3xf interfaces in LIBBLAS=libmkl_gf/libmkl_intel
83+
# See https://software.intel.com/en-us/articles/intel-mkl-main-libraries-contain-fftw3-interfaces
84+
# The cluster interface libs (libfftw3x_cdft*) can be omitted if the toolchain does not provide MPI-FFTW
85+
# interfaces.
86+
fftw_libs = []
87+
if fftw_lib_exists(interface_lib) or LooseVersion(imklver) < LooseVersion("10.2"):
88+
fftw_libs = [interface_lib]
89+
7490
if self.options.get('usempi', False):
7591
# add cluster interface for recent imkl versions
76-
if LooseVersion(imklver) >= LooseVersion('10.3'):
92+
# only get cluster_interface_lib from seperate module imkl-FFTW, rest via libmkl_gf/libmkl_intel
93+
imklfftwroot = get_software_root('imkl-FFTW')
94+
if LooseVersion(imklver) >= LooseVersion('10.3') and (fftw_libs or imklfftwroot):
7795
suff = picsuff
7896
if LooseVersion(imklver) >= LooseVersion('11.0.2'):
7997
suff = bitsuff + suff
8098
cluster_interface_lib = 'fftw3x_cdft%s' % suff
8199
fftw_libs.append(cluster_interface_lib)
82100
fftw_libs.append("mkl_cdft_core") # add cluster dft
83101
fftw_libs.extend(self.variables['LIBBLACS'].flatten()) # add BLACS; use flatten because ListOfList
102+
if imklfftwroot:
103+
fft_lib_dirs += [os.path.join(imklfftwroot, 'lib')]
104+
self.FFT_LIB_DIR = [os.path.join(imklfftwroot, 'lib')]
84105

85106
fftw_mt_libs = fftw_libs + [x % self.BLAS_LIB_MAP for x in self.BLAS_LIB_MT]
86107

87108
self.log.debug('fftw_libs %s' % fftw_libs.__repr__())
88109
fftw_libs.extend(self.variables['LIBBLAS'].flatten()) # add BLAS libs (contains dft)
89110
self.log.debug('fftw_libs %s' % fftw_libs.__repr__())
90111

91-
self.FFT_LIB_DIR = self.BLAS_LIB_DIR
92-
self.FFT_INCLUDE_DIR = [os.path.join(d, 'fftw') for d in self.BLAS_INCLUDE_DIR]
93-
94112
# building the FFTW interfaces is optional,
95113
# so make sure libraries are there before FFT_LIB is set
96-
imklroot = get_software_root(self.FFT_MODULE_NAME[0])
97-
fft_lib_dirs = [os.path.join(imklroot, d) for d in self.FFT_LIB_DIR]
98-
imklfftwroot = get_software_root('imkl-FFTW')
99-
if imklfftwroot:
100-
# only get cluster_interface_lib from seperate module imkl-FFTW, rest via libmkl_gf/libmkl_intel
101-
fft_lib_dirs += [os.path.join(imklfftwroot, 'lib')]
102-
fftw_libs.remove(interface_lib)
103-
fftw_mt_libs.remove(interface_lib)
104-
105-
def fftw_lib_exists(libname):
106-
"""Helper function to check whether FFTW library with specified name exists."""
107-
return any(os.path.exists(os.path.join(d, "lib%s.a" % libname)) for d in fft_lib_dirs)
108-
109-
if not fftw_lib_exists(interface_lib) and LooseVersion(imklver) >= LooseVersion("10.2"):
110-
# interface libs can be optional:
111-
# MKL >= 10.2 include fftw3xc and fftw3xf interfaces in LIBBLAS=libmkl_gf/libmkl_intel
112-
# See https://software.intel.com/en-us/articles/intel-mkl-main-libraries-contain-fftw3-interfaces
113-
# The cluster interface libs (libfftw3x_cdft*) can be omitted if the toolchain does not provide MPI-FFTW
114-
# interfaces.
115-
fftw_libs = [lib for lib in fftw_libs if lib not in [interface_lib, cluster_interface_lib]]
116-
fftw_mt_libs = [lib for lib in fftw_mt_libs if lib not in [interface_lib, cluster_interface_lib]]
117-
118114
# filter out libraries from list of FFTW libraries to check for if they are not provided by Intel MKL
119-
check_fftw_libs = [lib for lib in fftw_libs if lib not in ['dl', 'gfortran']]
115+
check_fftw_libs = [lib for lib in fftw_libs + fftw_mt_libs if lib not in ['dl', 'gfortran']]
120116

121117
missing_fftw_libs = [lib for lib in check_fftw_libs if not fftw_lib_exists(lib)]
122118
if missing_fftw_libs:
@@ -128,5 +124,4 @@ def fftw_lib_exists(libname):
128124
raise EasyBuildError(msg)
129125
else:
130126
self.FFT_LIB = fftw_libs
131-
132-
self.FFT_LIB_MT = fftw_mt_libs
127+
self.FFT_LIB_MT = fftw_mt_libs

easybuild/toolchains/gfbf.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
##
2+
# Copyright 2021-2022 Ghent University
3+
#
4+
# This file is part of EasyBuild,
5+
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),
6+
# with support of Ghent University (http://ugent.be/hpc),
7+
# the Flemish Supercomputer Centre (VSC) (https://www.vscentrum.be),
8+
# Flemish Research Foundation (FWO) (http://www.fwo.be/en)
9+
# and the Department of Economy, Science and Innovation (EWI) (http://www.ewi-vlaanderen.be/en).
10+
#
11+
# https://github.com/easybuilders/easybuild
12+
#
13+
# EasyBuild is free software: you can redistribute it and/or modify
14+
# it under the terms of the GNU General Public License as published by
15+
# the Free Software Foundation v2.
16+
#
17+
# EasyBuild is distributed in the hope that it will be useful,
18+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
19+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20+
# GNU General Public License for more details.
21+
#
22+
# You should have received a copy of the GNU General Public License
23+
# along with EasyBuild. If not, see <http://www.gnu.org/licenses/>.
24+
##
25+
"""
26+
EasyBuild support for gfbf compiler toolchain (includes GCC, FlexiBLAS and FFTW)
27+
28+
:author: Kenneth Hoste (Ghent University)
29+
:author: Bart Oldeman (McGill University, Calcul Quebec, Compute Canada)
30+
"""
31+
32+
from easybuild.toolchains.gcc import GccToolchain
33+
from easybuild.toolchains.fft.fftw import Fftw
34+
from easybuild.toolchains.linalg.flexiblas import FlexiBLAS
35+
36+
37+
class Gfbf(GccToolchain, FlexiBLAS, Fftw):
38+
"""Compiler toolchain with GCC, FlexiBLAS and FFTW."""
39+
NAME = 'gfbf'
40+
SUBTOOLCHAIN = GccToolchain.NAME
41+
OPTIONAL = True

easybuild/toolchains/nvompi.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
##
2+
# Copyright 2013-2021 Ghent University
3+
#
4+
# This file is part of EasyBuild,
5+
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),
6+
# with support of Ghent University (http://ugent.be/hpc),
7+
# the Flemish Supercomputer Centre (VSC) (https://www.vscentrum.be),
8+
# Flemish Research Foundation (FWO) (http://www.fwo.be/en)
9+
# and the Department of Economy, Science and Innovation (EWI) (http://www.ewi-vlaanderen.be/en).
10+
#
11+
# https://github.com/easybuilders/easybuild
12+
#
13+
# EasyBuild is free software: you can redistribute it and/or modify
14+
# it under the terms of the GNU General Public License as published by
15+
# the Free Software Foundation v2.
16+
#
17+
# EasyBuild is distributed in the hope that it will be useful,
18+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
19+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20+
# GNU General Public License for more details.
21+
#
22+
# You should have received a copy of the GNU General Public License
23+
# along with EasyBuild. If not, see <http://www.gnu.org/licenses/>.
24+
##
25+
"""
26+
EasyBuild support for nvompi compiler toolchain (NVHPC + Open MPI).
27+
28+
:author: Robert Mijakovic <[email protected]> (LuxProvide)
29+
"""
30+
31+
from easybuild.toolchains.nvhpc import NVHPCToolchain
32+
from easybuild.toolchains.mpi.openmpi import OpenMPI
33+
34+
35+
class Nvompi(NVHPCToolchain, OpenMPI):
36+
"""Compiler toolchain with NVHPC and Open MPI."""
37+
NAME = 'nvompi'
38+
SUBTOOLCHAIN = NVHPCToolchain.NAME

easybuild/toolchains/nvpsmpi.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
##
2+
# Copyright 2016-2021 Ghent University
3+
# Copyright 2016-2021 Forschungszentrum Juelich
4+
#
5+
# This file is part of EasyBuild,
6+
# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),
7+
# with support of Ghent University (http://ugent.be/hpc),
8+
# the Flemish Supercomputer Centre (VSC) (https://vscentrum.be),
9+
# Flemish Research Foundation (FWO) (http://www.fwo.be/en)
10+
# and the Department of Economy, Science and Innovation (EWI) (http://www.ewi-vlaanderen.be/en).
11+
#
12+
# https://github.com/easybuilders/easybuild
13+
#
14+
# EasyBuild is free software: you can redistribute it and/or modify
15+
# it under the terms of the GNU General Public License as published by
16+
# the Free Software Foundation v2.
17+
#
18+
# EasyBuild is distributed in the hope that it will be useful,
19+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
20+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21+
# GNU General Public License for more details.
22+
#
23+
# You should have received a copy of the GNU General Public License
24+
# along with EasyBuild. If not, see <http://www.gnu.org/licenses/>.
25+
##
26+
"""
27+
EasyBuild support for nvsmpi compiler toolchain (includes NVHPC and ParaStationMPI).
28+
29+
:author: Robert Mijakovic <[email protected]> (LuxProvide)
30+
"""
31+
32+
from easybuild.toolchains.nvhpc import NVHPCToolchain
33+
from easybuild.toolchains.mpi.psmpi import Psmpi
34+
35+
36+
# Order matters!
37+
class NVpsmpi(NVHPCToolchain, Psmpi):
38+
"""Compiler toolchain with NVHPC and ParaStationMPI."""
39+
NAME = 'nvpsmpi'
40+
SUBTOOLCHAIN = NVHPCToolchain.NAME

0 commit comments

Comments
 (0)