From 02a371918370e0f339830a4b7b623292abb077e7 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Mon, 10 Jun 2024 09:40:41 +0200 Subject: [PATCH 01/27] Correctly evaluate result for `--dep-graph` The success message was always printed even when dumping the graph failed resulting in no file being created but a message like: > Error: renderer for .pdf is unavailable > Wrote dependency graph for 1 easyconfigs to graph.pdf --- easybuild/framework/easyconfig/tools.py | 26 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/easybuild/framework/easyconfig/tools.py b/easybuild/framework/easyconfig/tools.py index 6f2a2741ad..1d5d45adb1 100644 --- a/easybuild/framework/easyconfig/tools.py +++ b/easybuild/framework/easyconfig/tools.py @@ -54,7 +54,7 @@ from easybuild.framework.easyconfig.format.yeb import quote_yaml_special_chars from easybuild.framework.easyconfig.style import cmdline_easyconfigs_style_check from easybuild.tools import LooseVersion -from easybuild.tools.build_log import EasyBuildError, print_msg, print_warning +from easybuild.tools.build_log import EasyBuildError, print_error, print_msg, print_warning from easybuild.tools.config import build_option from easybuild.tools.environment import restore_env from easybuild.tools.filetools import find_easyconfigs, is_patch_file, locate_files @@ -219,10 +219,12 @@ def mk_node_name(spec): if dep in spec['ec'].build_dependencies: dgr.add_edge_attributes((spec['module'], dep), attrs=edge_attrs) - _dep_graph_dump(dgr, filename) - - if not build_option('silent'): - print("Wrote dependency graph for %d easyconfigs to %s" % (len(specs), filename)) + what = "dependency graph for %d easyconfigs to %s" % (len(specs), filename) + silent = build_option('silent') + if _dep_graph_dump(dgr, filename): + print_msg("Wrote " + what, silent=silent) + else: + print_error("Failed writing " + what, silent=silent) @only_if_module_is_available('pygraph.readwrite.dot', pkgname='python-graph-dot') @@ -232,9 +234,15 @@ def _dep_graph_dump(dgr, filename): dottxt = dot.write(dgr) if os.path.splitext(filename)[-1] == '.dot': # create .dot file - write_file(filename, dottxt) + try: + write_file(filename, dottxt) + except EasyBuildError as e: + print(str(e)) + return False + else: + return True else: - _dep_graph_gv(dottxt, filename) + return _dep_graph_gv(dottxt, filename) @only_if_module_is_available('gv', pkgname='graphviz-python') @@ -242,8 +250,8 @@ def _dep_graph_gv(dottxt, filename): """Render dependency graph to file using graphviz.""" # try and render graph in specified file format gvv = gv.readstring(dottxt) - gv.layout(gvv, 'dot') - gv.render(gvv, os.path.splitext(filename)[-1], filename) + if gv.layout(gvv, 'dot') is not False: + return gv.render(gvv, os.path.splitext(filename)[-1], filename) def get_paths_for(subdir=EASYCONFIGS_PKG_SUBDIR, robot_path=None): From 467afd54dc5844586dd07467e5f16e53f7b9ece7 Mon Sep 17 00:00:00 2001 From: Richard Top Date: Mon, 24 Jun 2024 13:10:54 +0000 Subject: [PATCH 02/27] Adding gmpflf --- easybuild/toolchains/gmpflf.py | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 easybuild/toolchains/gmpflf.py diff --git a/easybuild/toolchains/gmpflf.py b/easybuild/toolchains/gmpflf.py new file mode 100644 index 0000000000..91b5aec135 --- /dev/null +++ b/easybuild/toolchains/gmpflf.py @@ -0,0 +1,47 @@ +## +# Copyright 2013-2024 Ghent University +# +# This file is triple-licensed under GPLv2 (see below), MIT, and +# BSD three-clause licenses. +# +# This file is part of EasyBuild, +# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en), +# with support of Ghent University (http://ugent.be/hpc), +# the Flemish Supercomputer Centre (VSC) (https://www.vscentrum.be), +# Flemish Research Foundation (FWO) (http://www.fwo.be/en) +# and the Department of Economy, Science and Innovation (EWI) (http://www.ewi-vlaanderen.be/en). +# +# https://github.com/easybuilders/easybuild +# +# EasyBuild is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation v2. +# +# EasyBuild is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with EasyBuild. If not, see . +## +""" +EasyBuild support for gmpflf compiler toolchain (includes GCC, MPICH2, OpenBLAS, LAPACK, ScaLAPACK and FFTW). + +Authors: + +* Richard Topouchian (University of Bergen) +""" +from easybuild.toolchains.gmpich import Gmpich +from easybuild.toolchains.gfbf import Gfbf +from easybuild.toolchains.golf import Golf +from easybuild.toolchains.fft.fftw import Fftw +from easybuild.toolchains.linalg.flexiblas import FlexiBLAS +from easybuild.toolchains.linalg.openblas import OpenBLAS +from easybuild.toolchains.linalg.scalapack import ScaLAPACK + + +class Gmpflf(Gmpich, OpenBLAS, FlexiBLAS, ScaLAPACK, Fftw): + """Compiler toolchain with GCC, MPICH, OpenBLAS, ScaLAPACK and FFTW.""" + NAME = 'gmpflf' + SUBTOOLCHAIN = [Gmpich.NAME, Golf.NAME, Gfbf.NAME] From f8a192cb0b5fbb1071d24837ca0ff1010574bc7b Mon Sep 17 00:00:00 2001 From: TopRichard <121792457+TopRichard@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:17:01 +0200 Subject: [PATCH 03/27] Update gmpflf.py --- easybuild/toolchains/gmpflf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/toolchains/gmpflf.py b/easybuild/toolchains/gmpflf.py index 91b5aec135..f040a161da 100644 --- a/easybuild/toolchains/gmpflf.py +++ b/easybuild/toolchains/gmpflf.py @@ -26,7 +26,7 @@ # along with EasyBuild. If not, see . ## """ -EasyBuild support for gmpflf compiler toolchain (includes GCC, MPICH2, OpenBLAS, LAPACK, ScaLAPACK and FFTW). +EasyBuild support for gmpflf compiler toolchain (includes GCC, MPICH, FlexiBLAS, LAPACK, ScaLAPACK and FFTW). Authors: From 9da5c353dff77d97425293fc1d23ccce0e53e98e Mon Sep 17 00:00:00 2001 From: Bart Oldeman Date: Thu, 27 Jun 2024 14:05:31 +0000 Subject: [PATCH 04/27] Set oneapi_fortran=True by default for Intel 2024.0.0+ ifort is deprecated, so default to ifx --- .../toolchains/compiler/intel_compilers.py | 6 ++- .../modules/intel-compilers/2024.0.0 | 37 +++++++++++++++++++ test/framework/toolchain.py | 31 ++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 test/framework/modules/intel-compilers/2024.0.0 diff --git a/easybuild/toolchains/compiler/intel_compilers.py b/easybuild/toolchains/compiler/intel_compilers.py index 1a21b21943..c33b5ee1a2 100644 --- a/easybuild/toolchains/compiler/intel_compilers.py +++ b/easybuild/toolchains/compiler/intel_compilers.py @@ -48,7 +48,8 @@ class IntelCompilers(IntelIccIfort): 'oneapi': (None, "Use oneAPI compilers icx/icpx/ifx instead of classic compilers"), 'oneapi_c_cxx': (None, "Use oneAPI C/C++ compilers icx/icpx instead of classic Intel C/C++ compilers " "(auto-enabled for Intel compilers version 2022.2.0, or newer)"), - 'oneapi_fortran': (False, "Use oneAPI Fortran compiler ifx instead of classic Intel Fortran compiler"), + 'oneapi_fortran': (None, "Use oneAPI Fortran compiler ifx instead of classic Intel Fortran compiler " + "(auto-enabled for Intel compilers version 2024.0.0, or newer)"), }) def _set_compiler_vars(self): @@ -75,6 +76,9 @@ def set_variables(self): # auto-enable use of oneAPI C/C++ compilers for sufficiently recent versions of Intel compilers comp_ver = self.get_software_version(self.COMPILER_MODULE_NAME)[0] if LooseVersion(comp_ver) >= LooseVersion('2022.2.0'): + if LooseVersion(comp_ver) >= LooseVersion('2024.0.0'): + if self.options.get('oneapi_fortran', None) is None: + self.options['oneapi_fortran'] = True if self.options.get('oneapi_c_cxx', None) is None: self.options['oneapi_c_cxx'] = True diff --git a/test/framework/modules/intel-compilers/2024.0.0 b/test/framework/modules/intel-compilers/2024.0.0 new file mode 100644 index 0000000000..a5c0267f9d --- /dev/null +++ b/test/framework/modules/intel-compilers/2024.0.0 @@ -0,0 +1,37 @@ +#%Module +proc ModulesHelp { } { + puts stderr { + +Description +=========== +Intel C, C++ & Fortran compilers (classic and oneAPI) + + +More information +================ + - Homepage: https://software.intel.com/content/www/us/en/develop/tools/oneapi/hpc-toolkit.html + } +} + +module-whatis {Description: Intel C, C++ & Fortran compilers (classic and oneAPI)} +module-whatis {Homepage: https://software.intel.com/content/www/us/en/develop/tools/oneapi/hpc-toolkit.html} +module-whatis {URL: https://software.intel.com/content/www/us/en/develop/tools/oneapi/hpc-toolkit.html} + +set root /tmp/intel-compilers/2024.0.0 + +conflict intel-compilers + +prepend-path CPATH $root/tbb/2021.11/include +prepend-path LD_LIBRARY_PATH $root/compiler/2024.0/linux/lib +prepend-path LD_LIBRARY_PATH $root/tbb/2021.11/lib/intel64/gcc4.8 +prepend-path LIBRARY_PATH $root/compiler/2024.0/linux/lib +prepend-path LIBRARY_PATH $root/tbb/2021.11/lib/intel64/gcc4.8 +prepend-path MANPATH $root/compiler/2024.0/share/man +prepend-path OCL_ICD_FILENAMES $root/compiler/2024.0/lib/libintelocl.so +prepend-path PATH $root/compiler/2024.0/bin +prepend-path TBBROOT $root/tbb/2021.11 +setenv EBROOTINTELMINCOMPILERS "$root" +setenv EBVERSIONINTELMINCOMPILERS "2024.0.0" +setenv EBDEVELINTELMINCOMPILERS "$root/easybuild/Core-intel-compilers-2024.0.0-easybuild-devel" + +# Built with EasyBuild version 4.8.2 diff --git a/test/framework/toolchain.py b/test/framework/toolchain.py index 0e53639491..dad20a91fc 100644 --- a/test/framework/toolchain.py +++ b/test/framework/toolchain.py @@ -1496,6 +1496,37 @@ def test_intel_toolchain_oneapi(self): self.assertEqual(os.getenv('F90'), 'ifx') self.assertEqual(os.getenv('FC'), 'ifx') + self.modtool.purge() + tc = self.get_toolchain('intel-compilers', version='2024.0.0') + tc.prepare() + + # by default (for version >= 2024.0.0): oneAPI C/C++ compiler + oneAPI Fortran compiler + self.assertEqual(os.getenv('CC'), 'icx') + self.assertEqual(os.getenv('CXX'), 'icpx') + self.assertEqual(os.getenv('F77'), 'ifx') + self.assertEqual(os.getenv('F90'), 'ifx') + self.assertEqual(os.getenv('FC'), 'ifx') + + self.modtool.purge() + tc = self.get_toolchain('intel-compilers', version='2024.0.0') + tc.set_options({'oneapi_fortran': False}) + tc.prepare() + self.assertEqual(os.getenv('CC'), 'icx') + self.assertEqual(os.getenv('CXX'), 'icpx') + self.assertEqual(os.getenv('F77'), 'ifort') + self.assertEqual(os.getenv('F90'), 'ifort') + self.assertEqual(os.getenv('FC'), 'ifort') + + self.modtool.purge() + tc = self.get_toolchain('intel-compilers', version='2024.0.0') + tc.set_options({'oneapi_c_cxx': False, 'oneapi_fortran': False}) + tc.prepare() + self.assertEqual(os.getenv('CC'), 'icc') + self.assertEqual(os.getenv('CXX'), 'icpc') + self.assertEqual(os.getenv('F77'), 'ifort') + self.assertEqual(os.getenv('F90'), 'ifort') + self.assertEqual(os.getenv('FC'), 'ifort') + self.modtool.purge() tc = self.get_toolchain('intel', version='2021b') tc.set_options({'oneapi_c_cxx': True}) From 05d66237630f87b8435721a06bfcae805abe1bf0 Mon Sep 17 00:00:00 2001 From: Bart Oldeman Date: Thu, 27 Jun 2024 14:46:01 +0000 Subject: [PATCH 05/27] We now have 111 test modules! --- test/framework/modules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/framework/modules.py b/test/framework/modules.py index 195bf0339c..8ba4f4ac65 100644 --- a/test/framework/modules.py +++ b/test/framework/modules.py @@ -55,7 +55,7 @@ # number of modules included for testing purposes -TEST_MODULES_COUNT = 110 +TEST_MODULES_COUNT = 111 class ModulesTest(EnhancedTestCase): From 92fb40673017ffe4d19b38af9d22a5f680a14ecb Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Fri, 28 Jun 2024 14:53:05 +0200 Subject: [PATCH 06/27] fix fetch progress bar showing to many files As we also call `obtain_file` for `checksum.json` the progress bar will show one file to many. E.g. > Fetching files: 100% (4/3) Ignore that file for updating the progressbar --- easybuild/framework/easyblock.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/easybuild/framework/easyblock.py b/easybuild/framework/easyblock.py index 80cddf8819..f2532df340 100644 --- a/easybuild/framework/easyblock.py +++ b/easybuild/framework/easyblock.py @@ -754,7 +754,9 @@ def obtain_file(self, filename, extension=False, urls=None, download_filename=No """ srcpaths = source_paths() - update_progress_bar(PROGRESS_BAR_DOWNLOAD_ALL, label=filename) + # We don't account for the checksums file in the progress bar + if filename != 'checksum.json': + update_progress_bar(PROGRESS_BAR_DOWNLOAD_ALL, label=filename) if alt_location is None: location = self.name From 3e445baa152b5f27b758362a22d8187d28d55f6b Mon Sep 17 00:00:00 2001 From: Bart Oldeman Date: Fri, 28 Jun 2024 14:09:49 +0000 Subject: [PATCH 07/27] Resolve internal imkl>=2021 version subdir via "latest" symlink This is already done in the easyblock, and needed since the "latest" symlink pointed to the full version in versions < 2024 but to a shorter version (e.g. 2024.2) in 2024 versions. --- easybuild/toolchains/linalg/intelmkl.py | 3 +++ test/framework/toolchain.py | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/easybuild/toolchains/linalg/intelmkl.py b/easybuild/toolchains/linalg/intelmkl.py index 8a32d684d9..9dc89da827 100644 --- a/easybuild/toolchains/linalg/intelmkl.py +++ b/easybuild/toolchains/linalg/intelmkl.py @@ -142,6 +142,7 @@ def _set_blas_variables(self): self.variables.nappend_el('CFLAGS', 'DMKL_ILP64') # exact paths/linking statements depend on imkl version + root = self.get_software_root(self.BLAS_MODULE_NAME)[0] found_version = self.get_software_version(self.BLAS_MODULE_NAME)[0] ver = LooseVersion(found_version) if ver < LooseVersion('10.3'): @@ -156,6 +157,8 @@ def _set_blas_variables(self): found_version) else: if ver >= LooseVersion('2021'): + if os.path.islink(os.path.join(root, 'mkl', 'latest')): + found_version = os.readlink(os.path.join(root, 'mkl', 'latest')) basedir = os.path.join('mkl', found_version) else: basedir = 'mkl' diff --git a/test/framework/toolchain.py b/test/framework/toolchain.py index 0e53639491..3307426bfd 100644 --- a/test/framework/toolchain.py +++ b/test/framework/toolchain.py @@ -1321,8 +1321,11 @@ def setup_sandbox_for_intel_fftw(self, moddir, imklver='2018.1.163'): ]) write_file(imkl_fftw_module_path, imkl_fftw_mod_txt) - subdir = 'mkl/%s/lib/intel64' % imklver + # put "latest" symbolic link to short version, used in newer MKL + imklshortver = '.'.join(imklver.split('.')[:2]) + subdir = 'mkl/%s/lib/intel64' % imklshortver os.makedirs(os.path.join(imkl_dir, subdir)) + os.symlink(imklshortver, os.path.join(imkl_dir, 'mkl', 'latest')) for fftlib in mkl_libs: write_file(os.path.join(imkl_dir, subdir, 'lib%s.a' % fftlib), 'foo') subdir = 'lib' From a4bf9d206df8b52ef1a988f6d808f29f17ac36e7 Mon Sep 17 00:00:00 2001 From: Bart Oldeman Date: Fri, 28 Jun 2024 14:41:43 +0000 Subject: [PATCH 08/27] Adjust internal version to short one in intel FFT test --- test/framework/toolchain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/framework/toolchain.py b/test/framework/toolchain.py index 3307426bfd..e77bf6abee 100644 --- a/test/framework/toolchain.py +++ b/test/framework/toolchain.py @@ -1201,7 +1201,7 @@ def test_fft_env_vars_intel(self): self.assertEqual(tc.get_variable('LIBFFT'), libfft) self.assertEqual(tc.get_variable('LIBFFT_MT'), libfft_mt) - fft_lib_dir = os.path.join(modules.get_software_root('imkl'), 'mkl/2021.4.0/lib/intel64') + fft_lib_dir = os.path.join(modules.get_software_root('imkl'), 'mkl/2021.4/lib/intel64') self.assertEqual(tc.get_variable('FFT_LIB_DIR'), fft_lib_dir) tc = self.get_toolchain('intel', version='2021b') From eed9e27b24624db200e0c740adf7e551794f0148 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Fri, 28 Jun 2024 15:26:50 +0200 Subject: [PATCH 09/27] reuse pre-computed checksums We calculate MD5 and SHA256 checksums as part of the log output which might take considerable time. Instead of recomputing it in `verify_checksum` we can reuse this value. --- easybuild/framework/easyblock.py | 9 +++++++-- easybuild/tools/filetools.py | 12 +++++++++--- test/framework/filetools.py | 19 ++++++++++++++++++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/easybuild/framework/easyblock.py b/easybuild/framework/easyblock.py index 80cddf8819..57d28e86ea 100644 --- a/easybuild/framework/easyblock.py +++ b/easybuild/framework/easyblock.py @@ -674,14 +674,16 @@ def collect_exts_file_info(self, fetch_files=True, verify_checksums=True): src_fn = os.path.basename(src_path) # report both MD5 and SHA256 checksums, since both are valid default checksum types + src_checksums = {} for checksum_type in (CHECKSUM_TYPE_MD5, CHECKSUM_TYPE_SHA256): src_checksum = compute_checksum(src_path, checksum_type=checksum_type) + src_checksums[checksum_type] = src_checksum self.log.info("%s checksum for %s: %s", checksum_type, src_path, src_checksum) # verify checksum (if provided) self.log.debug('Verifying checksums for extension source...') fn_checksum = self.get_checksum_for(checksums, filename=src_fn, index=0) - if verify_checksum(src_path, fn_checksum): + if verify_checksum(src_path, fn_checksum, src_checksums): self.log.info('Checksum for extension source %s verified', src_fn) elif build_option('ignore_checksums'): print_warning("Ignoring failing checksum verification for %s" % src_fn) @@ -700,12 +702,15 @@ def collect_exts_file_info(self, fetch_files=True, verify_checksums=True): ext_src.update({'patches': ext_patches}) if verify_checksums: + computed_checksums = {} for patch in ext_patches: patch = patch['path'] + computed_checksums[patch] = {} # report both MD5 and SHA256 checksums, # since both are valid default checksum types for checksum_type in (CHECKSUM_TYPE_MD5, CHECKSUM_TYPE_SHA256): checksum = compute_checksum(patch, checksum_type=checksum_type) + computed_checksums[patch][checksum_type] = checksum self.log.info("%s checksum for %s: %s", checksum_type, patch, checksum) # verify checksum (if provided) @@ -715,7 +720,7 @@ def collect_exts_file_info(self, fetch_files=True, verify_checksums=True): patch_fn = os.path.basename(patch) checksum = self.get_checksum_for(checksums, filename=patch_fn, index=idx+1) - if verify_checksum(patch, checksum): + if verify_checksum(patch, checksum, computed_checksums[patch]): self.log.info('Checksum for extension patch %s verified', patch_fn) elif build_option('ignore_checksums'): print_warning("Ignoring failing checksum verification for %s" % patch_fn) diff --git a/easybuild/tools/filetools.py b/easybuild/tools/filetools.py index 695043a595..700bb1401e 100644 --- a/easybuild/tools/filetools.py +++ b/easybuild/tools/filetools.py @@ -1242,7 +1242,7 @@ def calc_block_checksum(path, algorithm): return algorithm.hexdigest() -def verify_checksum(path, checksums): +def verify_checksum(path, checksums, computed_checksums=None): """ Verify checksum of specified file. @@ -1303,8 +1303,14 @@ def verify_checksum(path, checksums): "2-tuple (type, value), or tuple of alternative checksum specs.", checksum) - actual_checksum = compute_checksum(path, typ) - _log.debug("Computed %s checksum for %s: %s (correct checksum: %s)" % (typ, path, actual_checksum, checksum)) + if computed_checksums is not None and typ in computed_checksums: + actual_checksum = computed_checksums[typ] + computed_str = 'Precomputed' + else: + actual_checksum = compute_checksum(path, typ) + computed_str = 'Computed' + _log.debug("%s %s checksum for %s: %s (correct checksum: %s)" % + (computed_str, typ, path, actual_checksum, checksum)) if actual_checksum != checksum: return False diff --git a/test/framework/filetools.py b/test/framework/filetools.py index 63cd0a93b7..ae32993d9e 100644 --- a/test/framework/filetools.py +++ b/test/framework/filetools.py @@ -33,6 +33,7 @@ """ import datetime import glob +import logging import os import re import shutil @@ -297,10 +298,26 @@ def test_checksums(self): 'b7297da8b547d5e74b851d7c4e475900cec4744df0f887ae5c05bf1757c224b4', } + old_log_level = ft._log.getEffectiveLevel() + ft._log.setLevel(logging.DEBUG) # make sure checksums computation/verification is correct for checksum_type, checksum in known_checksums.items(): self.assertEqual(ft.compute_checksum(fp, checksum_type=checksum_type), checksum) - self.assertTrue(ft.verify_checksum(fp, (checksum_type, checksum))) + with self.log_to_testlogfile(): + self.assertTrue(ft.verify_checksum(fp, (checksum_type, checksum))) + self.assertIn('Computed ' + checksum_type, ft.read_file(self.logfile)) + # Passing precomputed checksums reuses it + with self.log_to_testlogfile(): + computed_checksums = {checksum_type: checksum} + self.assertTrue(ft.verify_checksum(fp, (checksum_type, checksum), computed_checksums)) + self.assertIn('Precomputed ' + checksum_type, ft.read_file(self.logfile)) + # If the type isn't contained the checksum will be computed + with self.log_to_testlogfile(): + computed_checksums = {'doesnt exist': 'checksum'} + self.assertTrue(ft.verify_checksum(fp, (checksum_type, checksum), computed_checksums)) + self.assertIn('Computed ' + checksum_type, ft.read_file(self.logfile)) + + ft._log.setLevel(old_log_level) # default checksum type is MD5 self.assertEqual(ft.compute_checksum(fp), known_checksums['md5']) From 17983102c5497197e8466c890a487cf962048728 Mon Sep 17 00:00:00 2001 From: Richard Top Date: Wed, 3 Jul 2024 13:48:18 +0000 Subject: [PATCH 10/27] gmpflf FlexiBLAS dependency --- easybuild/toolchains/gmpflf.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/easybuild/toolchains/gmpflf.py b/easybuild/toolchains/gmpflf.py index f040a161da..eb754cc873 100644 --- a/easybuild/toolchains/gmpflf.py +++ b/easybuild/toolchains/gmpflf.py @@ -45,3 +45,12 @@ class Gmpflf(Gmpich, OpenBLAS, FlexiBLAS, ScaLAPACK, Fftw): """Compiler toolchain with GCC, MPICH, OpenBLAS, ScaLAPACK and FFTW.""" NAME = 'gmpflf' SUBTOOLCHAIN = [Gmpich.NAME, Golf.NAME, Gfbf.NAME] + + def __init__(self, *args, **kwargs): + """Toolchain constructor.""" + super(Gmpflf, self).__init__(*args, **kwargs) + constants = ('BLAS_MODULE_NAME', 'BLAS_LIB', 'BLAS_LIB_MT', 'BLAS_FAMILY', + 'LAPACK_MODULE_NAME', 'LAPACK_IS_BLAS', 'LAPACK_FAMILY') + + for constant in constants: + setattr(self, constant, getattr(FlexiBLAS, constant)) From 7ae687c83bf6509431fae93086413fc4bff85df9 Mon Sep 17 00:00:00 2001 From: TopRichard <121792457+TopRichard@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:19:25 +0200 Subject: [PATCH 11/27] Update gmpflf.py --- easybuild/toolchains/gmpflf.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/easybuild/toolchains/gmpflf.py b/easybuild/toolchains/gmpflf.py index eb754cc873..99a01935d4 100644 --- a/easybuild/toolchains/gmpflf.py +++ b/easybuild/toolchains/gmpflf.py @@ -34,23 +34,13 @@ """ from easybuild.toolchains.gmpich import Gmpich from easybuild.toolchains.gfbf import Gfbf -from easybuild.toolchains.golf import Golf from easybuild.toolchains.fft.fftw import Fftw from easybuild.toolchains.linalg.flexiblas import FlexiBLAS from easybuild.toolchains.linalg.openblas import OpenBLAS from easybuild.toolchains.linalg.scalapack import ScaLAPACK -class Gmpflf(Gmpich, OpenBLAS, FlexiBLAS, ScaLAPACK, Fftw): +class Gmpflf(Gmpich, FlexiBLAS, ScaLAPACK, Fftw): """Compiler toolchain with GCC, MPICH, OpenBLAS, ScaLAPACK and FFTW.""" NAME = 'gmpflf' - SUBTOOLCHAIN = [Gmpich.NAME, Golf.NAME, Gfbf.NAME] - - def __init__(self, *args, **kwargs): - """Toolchain constructor.""" - super(Gmpflf, self).__init__(*args, **kwargs) - constants = ('BLAS_MODULE_NAME', 'BLAS_LIB', 'BLAS_LIB_MT', 'BLAS_FAMILY', - 'LAPACK_MODULE_NAME', 'LAPACK_IS_BLAS', 'LAPACK_FAMILY') - - for constant in constants: - setattr(self, constant, getattr(FlexiBLAS, constant)) + SUBTOOLCHAIN = [Gmpich.NAME, Gfbf.NAME] From e5d127d4701756b497a89af6864ecd4c227473b1 Mon Sep 17 00:00:00 2001 From: TopRichard <121792457+TopRichard@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:21:18 +0200 Subject: [PATCH 12/27] Update gmpflf.py --- easybuild/toolchains/gmpflf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/toolchains/gmpflf.py b/easybuild/toolchains/gmpflf.py index 99a01935d4..f5db523dc1 100644 --- a/easybuild/toolchains/gmpflf.py +++ b/easybuild/toolchains/gmpflf.py @@ -41,6 +41,6 @@ class Gmpflf(Gmpich, FlexiBLAS, ScaLAPACK, Fftw): - """Compiler toolchain with GCC, MPICH, OpenBLAS, ScaLAPACK and FFTW.""" + """Compiler toolchain with GCC, MPICH, FlexiBLAS, ScaLAPACK and FFTW.""" NAME = 'gmpflf' SUBTOOLCHAIN = [Gmpich.NAME, Gfbf.NAME] From 66b82a1805fa223cf6263f89b9c82af30cba2bd5 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Wed, 3 Jul 2024 17:06:32 +0200 Subject: [PATCH 13/27] Update docstring --- easybuild/tools/filetools.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/easybuild/tools/filetools.py b/easybuild/tools/filetools.py index 700bb1401e..50118c2e28 100644 --- a/easybuild/tools/filetools.py +++ b/easybuild/tools/filetools.py @@ -1247,7 +1247,11 @@ def verify_checksum(path, checksums, computed_checksums=None): Verify checksum of specified file. :param path: path of file to verify checksum of - :param checksums: checksum values (and type, optionally, default is MD5), e.g., 'af314', ('sha', '5ec1b') + :param checksums: checksum values to compare to + (and type, optionally, default is MD5), e.g., 'af314', ('sha', '5ec1b') + :param computed_checksums: Optional dictionary of (current) checksum(s) for this file + indexed by the checksum type (e.g. 'sha256'). + Each existing entry will be used, missing ones will be computed. """ filename = os.path.basename(path) From 9846b9a9f08cdb6b90d71a709887358eed1254df Mon Sep 17 00:00:00 2001 From: Kenneth Hoste Date: Thu, 4 Jul 2024 11:31:41 +0200 Subject: [PATCH 14/27] remove unused import for OpenBLAS in gmpflf toolchain definition --- easybuild/toolchains/gmpflf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/easybuild/toolchains/gmpflf.py b/easybuild/toolchains/gmpflf.py index f5db523dc1..30d10a90f7 100644 --- a/easybuild/toolchains/gmpflf.py +++ b/easybuild/toolchains/gmpflf.py @@ -36,7 +36,6 @@ from easybuild.toolchains.gfbf import Gfbf from easybuild.toolchains.fft.fftw import Fftw from easybuild.toolchains.linalg.flexiblas import FlexiBLAS -from easybuild.toolchains.linalg.openblas import OpenBLAS from easybuild.toolchains.linalg.scalapack import ScaLAPACK From e4bf7743a0bfc213e237646d64373cffc73f6070 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Thu, 4 Jul 2024 11:57:25 +0200 Subject: [PATCH 15/27] CI: Allow using Node 16 actions Required after https://github.blog/changelog/2024-03-07-github-actions-all-actions-will-run-on-node20-instead-of-node16-by-default --- .github/workflows/end2end.yml | 1 + .github/workflows/unit_tests_python2.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/end2end.yml b/.github/workflows/end2end.yml index 7327d876ba..e74b65cc79 100644 --- a/.github/workflows/end2end.yml +++ b/.github/workflows/end2end.yml @@ -18,6 +18,7 @@ jobs: fail-fast: false container: image: ghcr.io/easybuilders/${{ matrix.container }}-amd64 + env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions steps: - name: Check out the repo uses: actions/checkout@v3 diff --git a/.github/workflows/unit_tests_python2.yml b/.github/workflows/unit_tests_python2.yml index 1b921ee83c..aa00f9a2fd 100644 --- a/.github/workflows/unit_tests_python2.yml +++ b/.github/workflows/unit_tests_python2.yml @@ -16,6 +16,7 @@ jobs: # CentOS 7.9 container that already includes Lmod & co, # see https://github.com/easybuilders/easybuild-containers image: ghcr.io/easybuilders/centos-7.9-amd64 + env: {ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true} # Allow using Node16 actions steps: - uses: actions/checkout@v3 From 669806bc89951f02410d6faaf35c1f69576e4b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bob=20Dr=C3=B6ge?= Date: Fri, 5 Jul 2024 15:30:42 +0200 Subject: [PATCH 16/27] comit -> commit --- easybuild/tools/options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/tools/options.py b/easybuild/tools/options.py index 68ddba632a..df10ec859e 100644 --- a/easybuild/tools/options.py +++ b/easybuild/tools/options.py @@ -1590,7 +1590,7 @@ def check_included_multiple(included_easyblocks_from, source): check_included_multiple(included_from_commit, "commit %s" % easyblock_commit) for easyblock in included_from_commit: - print_msg("easyblock %s included from comit %s" % (easyblock, easyblock_commit), log=log) + print_msg("easyblock %s included from commit %s" % (easyblock, easyblock_commit), log=log) include_easyblocks(options.tmpdir, easyblocks_from_commit) From 2874f8f041b521bb2edbf6490800cb2d52927cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bob=20Dr=C3=B6ge?= Date: Fri, 5 Jul 2024 15:30:46 +0200 Subject: [PATCH 17/27] comit -> commit --- test/framework/options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/framework/options.py b/test/framework/options.py index 94c4372f91..a0ebac4324 100644 --- a/test/framework/options.py +++ b/test/framework/options.py @@ -2225,7 +2225,7 @@ def test_xxx_include_easyblocks_from_commit(self): import easybuild.easyblocks.generic reload(easybuild.easyblocks.generic) - pattern = "== easyblock binary.py included from comit %s" % test_commit + pattern = "== easyblock binary.py included from commit %s" % test_commit self.assertEqual(stderr, '') self.assertIn(pattern, stdout) From 66ec1af623c4e7c0a9140209369ad4911cfc2d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bob=20Dr=C3=B6ge?= Date: Fri, 12 Jul 2024 14:59:41 +0200 Subject: [PATCH 18/27] don't use special flags for strict and precise toolchain options on RISC-V --- easybuild/toolchains/compiler/gcc.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/easybuild/toolchains/compiler/gcc.py b/easybuild/toolchains/compiler/gcc.py index 548ac41187..bbf4027e59 100644 --- a/easybuild/toolchains/compiler/gcc.py +++ b/easybuild/toolchains/compiler/gcc.py @@ -78,6 +78,13 @@ class Gcc(Compiler): COMPILER_UNIQUE_OPTION_MAP['strict'] = no_recip_alternative COMPILER_UNIQUE_OPTION_MAP['precise'] = no_recip_alternative + # gcc on RISC-V does not support -mno-recip, -mieee-fp, -mfno-math-errno... + # https://gcc.gnu.org/onlinedocs/gcc/RISC-V-Options.html + # there are no good alternatives, so stick to the default flags + if systemtools.get_cpu_family() == systemtools.RISCV: + COMPILER_UNIQUE_OPTION_MAP['strict'] = [] + COMPILER_UNIQUE_OPTION_MAP['precise'] = [] + # used when 'optarch' toolchain option is enabled (and --optarch is not specified) COMPILER_OPTIMAL_ARCHITECTURE_OPTION = { (systemtools.AARCH32, systemtools.ARM): 'mcpu=native', # implies -march=native and -mtune=native From 37858f110a69ccb3dbae39bd171d81895434dc4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bob=20Dr=C3=B6ge?= Date: Mon, 15 Jul 2024 11:27:32 +0200 Subject: [PATCH 19/27] also remove unsupported flags for loose and veryloose on RISC-V --- easybuild/toolchains/compiler/gcc.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/easybuild/toolchains/compiler/gcc.py b/easybuild/toolchains/compiler/gcc.py index bbf4027e59..e9748f3bda 100644 --- a/easybuild/toolchains/compiler/gcc.py +++ b/easybuild/toolchains/compiler/gcc.py @@ -84,6 +84,8 @@ class Gcc(Compiler): if systemtools.get_cpu_family() == systemtools.RISCV: COMPILER_UNIQUE_OPTION_MAP['strict'] = [] COMPILER_UNIQUE_OPTION_MAP['precise'] = [] + COMPILER_UNIQUE_OPTION_MAP['loose'] = ['fno-math-errno'] + COMPILER_UNIQUE_OPTION_MAP['verloose'] = ['fno-math-errno'] # used when 'optarch' toolchain option is enabled (and --optarch is not specified) COMPILER_OPTIMAL_ARCHITECTURE_OPTION = { From 13eb8b602586d07a261d7fa098831030acd0b00f Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 22 Jul 2024 16:34:12 +0200 Subject: [PATCH 20/27] Add cuda_cc_space_sep variant that does not have periods, e.g. '80 90' if cuda compute capabilities is 8.0,9.0 --- easybuild/framework/easyconfig/templates.py | 3 +++ test/framework/easyconfig.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/easybuild/framework/easyconfig/templates.py b/easybuild/framework/easyconfig/templates.py index 9da6e9a2b9..eae4284687 100644 --- a/easybuild/framework/easyconfig/templates.py +++ b/easybuild/framework/easyconfig/templates.py @@ -97,6 +97,8 @@ "--cuda-compute-capabilities configuration option or via cuda_compute_capabilities easyconfig parameter"), ('cuda_cc_cmake', "List of CUDA compute capabilities suitable for use with $CUDAARCHS in CMake 3.18+"), ('cuda_cc_space_sep', "Space-separated list of CUDA compute capabilities"), + ('cuda_cc_space_sep_no_period', + "Space-separated list of CUDA compute capabilities, without periods (e.g. '80 90')."), ('cuda_cc_semicolon_sep', "Semicolon-separated list of CUDA compute capabilities"), ('cuda_sm_comma_sep', "Comma-separated list of sm_* values that correspond with CUDA compute capabilities"), ('cuda_sm_space_sep', "Space-separated list of sm_* values that correspond with CUDA compute capabilities"), @@ -367,6 +369,7 @@ def template_constant_dict(config, ignore=None, skip_lower=None, toolchain=None) if cuda_compute_capabilities: template_values['cuda_compute_capabilities'] = ','.join(cuda_compute_capabilities) template_values['cuda_cc_space_sep'] = ' '.join(cuda_compute_capabilities) + template_values['cuda_cc_space_sep_no_period'] = ' '.join(cc.replace('.', '') for cc in cuda_compute_capabilities) template_values['cuda_cc_semicolon_sep'] = ';'.join(cuda_compute_capabilities) template_values['cuda_cc_cmake'] = ';'.join(cc.replace('.', '') for cc in cuda_compute_capabilities) sm_values = ['sm_' + cc.replace('.', '') for cc in cuda_compute_capabilities] diff --git a/test/framework/easyconfig.py b/test/framework/easyconfig.py index 4b63dc605b..c873b9aa16 100644 --- a/test/framework/easyconfig.py +++ b/test/framework/easyconfig.py @@ -4606,7 +4606,7 @@ def test_cuda_compute_capabilities(self): toolchain = SYSTEM cuda_compute_capabilities = ['5.1', '7.0', '7.1'] installopts = '%(cuda_compute_capabilities)s' - preinstallopts = '%(cuda_cc_space_sep)s' + preinstallopts = 'period="%(cuda_cc_space_sep)s" noperiod="%(cuda_cc_space_sep_no_period)s"' prebuildopts = '%(cuda_cc_semicolon_sep)s' configopts = 'comma="%(cuda_sm_comma_sep)s" space="%(cuda_sm_space_sep)s"' preconfigopts = 'CUDAARCHS="%(cuda_cc_cmake)s"' @@ -4615,7 +4615,7 @@ def test_cuda_compute_capabilities(self): ec = EasyConfig(self.eb_file) self.assertEqual(ec['installopts'], '5.1,7.0,7.1') - self.assertEqual(ec['preinstallopts'], '5.1 7.0 7.1') + self.assertEqual(ec['preinstallopts'], 'period="5.1 7.0 7.1" noperiod="51 70 71"') self.assertEqual(ec['prebuildopts'], '5.1;7.0;7.1') self.assertEqual(ec['configopts'], 'comma="sm_51,sm_70,sm_71" ' 'space="sm_51 sm_70 sm_71"') From 49455ae88801d9760ba43965a12a6e2ba310c25a Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 22 Jul 2024 16:38:24 +0200 Subject: [PATCH 21/27] Shorten local variable name --- easybuild/framework/easyconfig/templates.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/easybuild/framework/easyconfig/templates.py b/easybuild/framework/easyconfig/templates.py index eae4284687..c6cfe747aa 100644 --- a/easybuild/framework/easyconfig/templates.py +++ b/easybuild/framework/easyconfig/templates.py @@ -93,8 +93,8 @@ ('sysroot', "Location root directory of system, prefix for standard paths like /usr/lib and /usr/include" "as specify by the --sysroot configuration option"), ('mpi_cmd_prefix', "Prefix command for running MPI programs (with default number of ranks)"), - ('cuda_compute_capabilities', "Comma-separated list of CUDA compute capabilities, as specified via " - "--cuda-compute-capabilities configuration option or via cuda_compute_capabilities easyconfig parameter"), + ('cuda_cc', "Comma-separated list of CUDA compute capabilities, as specified via " + "--cuda-compute-capabilities configuration option or via cuda_cc easyconfig parameter"), ('cuda_cc_cmake', "List of CUDA compute capabilities suitable for use with $CUDAARCHS in CMake 3.18+"), ('cuda_cc_space_sep', "Space-separated list of CUDA compute capabilities"), ('cuda_cc_space_sep_no_period', @@ -365,14 +365,14 @@ def template_constant_dict(config, ignore=None, skip_lower=None, toolchain=None) # step 6. CUDA compute capabilities # Use the commandline / easybuild config option if given, else use the value from the EC (as a default) - cuda_compute_capabilities = build_option('cuda_compute_capabilities') or config.get('cuda_compute_capabilities') - if cuda_compute_capabilities: - template_values['cuda_compute_capabilities'] = ','.join(cuda_compute_capabilities) - template_values['cuda_cc_space_sep'] = ' '.join(cuda_compute_capabilities) - template_values['cuda_cc_space_sep_no_period'] = ' '.join(cc.replace('.', '') for cc in cuda_compute_capabilities) - template_values['cuda_cc_semicolon_sep'] = ';'.join(cuda_compute_capabilities) - template_values['cuda_cc_cmake'] = ';'.join(cc.replace('.', '') for cc in cuda_compute_capabilities) - sm_values = ['sm_' + cc.replace('.', '') for cc in cuda_compute_capabilities] + cuda_cc = build_option('cuda_cc') or config.get('cuda_cc') + if cuda_cc: + template_values['cuda_compute_capabilities'] = ','.join(cuda_cc) + template_values['cuda_cc_space_sep'] = ' '.join(cuda_cc) + template_values['cuda_cc_space_sep_no_period'] = ' '.join(cc.replace('.', '') for cc in cuda_cc) + template_values['cuda_cc_semicolon_sep'] = ';'.join(cuda_cc) + template_values['cuda_cc_cmake'] = ';'.join(cc.replace('.', '') for cc in cuda_cc) + sm_values = ['sm_' + cc.replace('.', '') for cc in cuda_cc] template_values['cuda_sm_comma_sep'] = ','.join(sm_values) template_values['cuda_sm_space_sep'] = ' '.join(sm_values) From f17edd1f763074ad641f183e2f973093d534f0ef Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 22 Jul 2024 16:40:35 +0200 Subject: [PATCH 22/27] Revert shortening when it concerns the real build option cuda_compute_capabilities, and not the local variable --- easybuild/framework/easyconfig/templates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/framework/easyconfig/templates.py b/easybuild/framework/easyconfig/templates.py index c6cfe747aa..df46e5eaeb 100644 --- a/easybuild/framework/easyconfig/templates.py +++ b/easybuild/framework/easyconfig/templates.py @@ -365,7 +365,7 @@ def template_constant_dict(config, ignore=None, skip_lower=None, toolchain=None) # step 6. CUDA compute capabilities # Use the commandline / easybuild config option if given, else use the value from the EC (as a default) - cuda_cc = build_option('cuda_cc') or config.get('cuda_cc') + cuda_cc = build_option('cuda_cc') or config.get('cuda_compute_capabilities') if cuda_cc: template_values['cuda_compute_capabilities'] = ','.join(cuda_cc) template_values['cuda_cc_space_sep'] = ' '.join(cuda_cc) From 37a473deebb7ff9a91c103ca417793041769fd40 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 22 Jul 2024 17:14:59 +0200 Subject: [PATCH 23/27] Revert shortening when it's really about the cuda compute capabilities build option, instead of the local var --- easybuild/framework/easyconfig/templates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/framework/easyconfig/templates.py b/easybuild/framework/easyconfig/templates.py index df46e5eaeb..88174c8393 100644 --- a/easybuild/framework/easyconfig/templates.py +++ b/easybuild/framework/easyconfig/templates.py @@ -365,7 +365,7 @@ def template_constant_dict(config, ignore=None, skip_lower=None, toolchain=None) # step 6. CUDA compute capabilities # Use the commandline / easybuild config option if given, else use the value from the EC (as a default) - cuda_cc = build_option('cuda_cc') or config.get('cuda_compute_capabilities') + cuda_cc = build_option('cuda_compute_capabilities') or config.get('cuda_compute_capabilities') if cuda_cc: template_values['cuda_compute_capabilities'] = ','.join(cuda_cc) template_values['cuda_cc_space_sep'] = ' '.join(cuda_cc) From c6a572399e22bcafd7f050c081af9bc2af60d3d1 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 22 Jul 2024 17:36:12 +0200 Subject: [PATCH 24/27] Fix name of cuda_compute_capabilities template, it was accidentally replaced --- easybuild/framework/easyconfig/templates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/framework/easyconfig/templates.py b/easybuild/framework/easyconfig/templates.py index 88174c8393..e1ac187eee 100644 --- a/easybuild/framework/easyconfig/templates.py +++ b/easybuild/framework/easyconfig/templates.py @@ -93,7 +93,7 @@ ('sysroot', "Location root directory of system, prefix for standard paths like /usr/lib and /usr/include" "as specify by the --sysroot configuration option"), ('mpi_cmd_prefix', "Prefix command for running MPI programs (with default number of ranks)"), - ('cuda_cc', "Comma-separated list of CUDA compute capabilities, as specified via " + ('cuda_compute_capabilities', "Comma-separated list of CUDA compute capabilities, as specified via " "--cuda-compute-capabilities configuration option or via cuda_cc easyconfig parameter"), ('cuda_cc_cmake', "List of CUDA compute capabilities suitable for use with $CUDAARCHS in CMake 3.18+"), ('cuda_cc_space_sep', "Space-separated list of CUDA compute capabilities"), From 1674f1eb5acd34f645266b82be0860bf547cd445 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 22 Jul 2024 23:38:42 +0200 Subject: [PATCH 25/27] Forgot to change second expected pattern in unit test. Did so now --- test/framework/easyconfig.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/framework/easyconfig.py b/test/framework/easyconfig.py index c873b9aa16..eb21430f47 100644 --- a/test/framework/easyconfig.py +++ b/test/framework/easyconfig.py @@ -4625,7 +4625,7 @@ def test_cuda_compute_capabilities(self): init_config(build_options={'cuda_compute_capabilities': ['4.2', '6.3']}) ec = EasyConfig(self.eb_file) self.assertEqual(ec['installopts'], '4.2,6.3') - self.assertEqual(ec['preinstallopts'], '4.2 6.3') + self.assertEqual(ec['preinstallopts'], 'period="4.2 6.3" noperiod="42 63"') self.assertEqual(ec['prebuildopts'], '4.2;6.3') self.assertEqual(ec['configopts'], 'comma="sm_42,sm_63" ' 'space="sm_42 sm_63"') From fba1825ebd23a9a0520d02ecf3e8ec060df046af Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Wed, 24 Jul 2024 16:52:47 +0200 Subject: [PATCH 26/27] Make unrelated warning disappear --- .github/workflows/unit_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index c9f42891ec..5fa01efb5f 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -191,7 +191,7 @@ jobs: # run test suite python -O -m test.framework.suite 2>&1 | tee test_framework_suite.log # try and make sure output of running tests is clean (no printed messages/warnings) - 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.* import |CryptographyDeprecationWarning: Python 2|Blowfish|GC3Pie not available, skipping test" + 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.* import |CryptographyDeprecationWarning: Python 2|Blowfish|GC3Pie not available, skipping test|CryptographyDeprecationWarning: TripleDES has been moved" # '|| true' is needed to avoid that GitHub Actions stops the job on non-zero exit of grep (i.e. when there are no matches) PRINTED_MSG=$(egrep -v "${IGNORE_PATTERNS}" test_framework_suite.log | grep '\.\n*[A-Za-z]' || true) test "x$PRINTED_MSG" = "x" || (echo "ERROR: Found printed messages in output of test suite" && echo "${PRINTED_MSG}" && exit 1) From 262ff858c4c5388f025bcfc9d919493144d3777d Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Wed, 24 Jul 2024 17:16:07 +0200 Subject: [PATCH 27/27] Make unrelated warning from CI disappear --- .github/workflows/unit_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 5fa01efb5f..b6b79ac4d5 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -191,7 +191,7 @@ jobs: # run test suite python -O -m test.framework.suite 2>&1 | tee test_framework_suite.log # try and make sure output of running tests is clean (no printed messages/warnings) - 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.* import |CryptographyDeprecationWarning: Python 2|Blowfish|GC3Pie not available, skipping test|CryptographyDeprecationWarning: TripleDES has been moved" + 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.* import |CryptographyDeprecationWarning: Python 2|Blowfish|GC3Pie not available, skipping test|CryptographyDeprecationWarning: TripleDES has been moved|algorithms.TripleDES" # '|| true' is needed to avoid that GitHub Actions stops the job on non-zero exit of grep (i.e. when there are no matches) PRINTED_MSG=$(egrep -v "${IGNORE_PATTERNS}" test_framework_suite.log | grep '\.\n*[A-Za-z]' || true) test "x$PRINTED_MSG" = "x" || (echo "ERROR: Found printed messages in output of test suite" && echo "${PRINTED_MSG}" && exit 1)