From b90c57bea77cf299db868c4ebbeb24730ed22d4f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ruth=20Sch=C3=B6bel?= <r.schoebel@fz-juelich.de>
Date: Tue, 21 Feb 2023 10:54:32 +0100
Subject: [PATCH] add easyblock

---
 Custom_EasyBlocks/hypre.py | 116 +++++++++++++++++++++++++++++++++++++
 1 file changed, 116 insertions(+)
 create mode 100644 Custom_EasyBlocks/hypre.py

diff --git a/Custom_EasyBlocks/hypre.py b/Custom_EasyBlocks/hypre.py
new file mode 100644
index 000000000..9ec0f109d
--- /dev/null
+++ b/Custom_EasyBlocks/hypre.py
@@ -0,0 +1,116 @@
+##
+# Copyright 2009-2022 Ghent University
+#
+# 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 <http://www.gnu.org/licenses/>.
+##
+"""
+EasyBuild support for Hypre, implemented as an easyblock
+@author: Kenneth Hoste (Ghent University)
+@author: Mikael OEhman (Chalmers University of Technology)
+@author: Alex Domingo (Vrije Universiteit Brussel)
+@author: Simon Branford (University of Birmingham)
+"""
+import os
+
+from easybuild.easyblocks.generic.configuremake import ConfigureMake
+from easybuild.tools.build_log import EasyBuildError
+from easybuild.tools.config import build_option
+from easybuild.tools.modules import get_software_root
+from easybuild.tools.systemtools import get_shared_lib_ext
+from easybuild.framework.easyconfig import CUSTOM
+from easybuild.framework.easyblock import EasyBlock
+
+class EB_Hypre(ConfigureMake):
+    """Support for building Hypre."""
+
+    @staticmethod
+    def extra_options():
+        """Add extra easyconfig parameters custom to CHARMM."""
+        extra_vars = {
+            'disable_cuda': [False, "Force disabling CUDA", CUSTOM]
+        }
+        return EasyBlock.extra_options(extra_vars)
+
+
+    def __init__(self, *args, **kwargs):
+        """Easyblock constructor."""
+
+        super(EB_Hypre, self).__init__(*args, **kwargs)
+
+        self.config_shared = False
+        self.config_static = False
+
+    def configure_step(self):
+        """Configure Hypre build after setting extra configure options."""
+
+        if '--enable-shared' in self.cfg['configopts']:
+            self.config_shared = True
+            ext_libs = 'LIB%s'
+        else:
+            self.config_static = True
+            ext_libs = '%s_STATIC_LIBS'
+
+        # Use BLAS/LAPACK from EB
+        for dep in ["BLAS", "LAPACK"]:
+            blas_libs = ' '.join(os.getenv(ext_libs % dep).split(','))
+            blas_libs = blas_libs.replace('-l', '')  # Remove any '-l' as those are prepended for shared builds
+            self.cfg.update('configopts', '--with-%s-libs="%s"' % (dep.lower(), blas_libs))
+            self.cfg.update('configopts', '--with-%s-lib-dirs="%s"' % (dep.lower(),
+                                                                       os.getenv('%s_LIB_DIR' % dep)))
+
+        # Use MPI implementation from EB
+        self.cfg.update('configopts', '--with-MPI-include=%s' % os.getenv('MPI_INC_DIR'))
+
+        if (get_software_root('CUDA') and not(self.cfg['disable_cuda'])):
+            self.cfg.update('configopts', '--with-cuda')
+
+            cuda_cc = build_option('cuda_compute_capabilities') or self.cfg['cuda_compute_capabilities']
+            if not cuda_cc:
+                raise EasyBuildError('List of CUDA compute capabilities must be specified, either via '
+                                     'cuda_compute_capabilities easyconfig parameter or via '
+                                     '--cuda-compute-capabilities')
+
+            cuda_cc_string = ' '.join([x.replace('.', '') for x in cuda_cc])
+            self.cfg.update('configopts', '--with-gpu-arch="%s"' % cuda_cc_string)
+        else:
+            self.cfg.update('configopts', '--with-cuda=NO')
+
+
+        super(EB_Hypre, self).configure_step()
+
+    def sanity_check_step(self):
+        """Custom sanity check for Hypre."""
+
+        # Add static and shared libs depending on configopts
+        hypre_libs = list()
+        if self.config_shared:
+            shlib_ext = get_shared_lib_ext()
+            hypre_libs.append(os.path.join('lib', 'libHYPRE.%s' % shlib_ext))
+        if self.config_static:
+            hypre_libs.append(os.path.join('lib', 'libHYPRE.a'))
+
+        custom_paths = {
+            'files': hypre_libs,
+            'dirs': ['include']
+        }
+
+        super(EB_Hypre, self).sanity_check_step(custom_paths=custom_paths) 
-- 
GitLab