From ccd9ee746883da050d6432053d48449447a8ed5d Mon Sep 17 00:00:00 2001 From: Christian Feld <c.feld@fz-juelich.de> Date: Wed, 11 Jan 2023 10:07:33 +0100 Subject: [PATCH] Copy upstream Score-P EasyBlock without changes https://github.com/easybuilders/easybuild-easyblocks/blob/91ff295486150af9532c55250569d4df37481eb7/easybuild/easyblocks/s/score_p.py --- Custom_EasyBlocks/score_p.py | 140 +++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 Custom_EasyBlocks/score_p.py diff --git a/Custom_EasyBlocks/score_p.py b/Custom_EasyBlocks/score_p.py new file mode 100644 index 000000000..410fea4cb --- /dev/null +++ b/Custom_EasyBlocks/score_p.py @@ -0,0 +1,140 @@ +## +# Copyright 2013-2023 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 software using the Score-P configuration style (e.g., Cube, OTF2, Scalasca, and Score-P), +implemented as an easyblock. + +@author: Kenneth Hoste (Ghent University) +@author: Bernd Mohr (Juelich Supercomputing Centre) +@author: Markus Geimer (Juelich Supercomputing Centre) +@author: Alexander Grund (TU Dresden) +""" +import easybuild.tools.toolchain as toolchain +from easybuild.easyblocks.generic.configuremake import ConfigureMake +from easybuild.tools.build_log import EasyBuildError +from easybuild.tools.modules import get_software_root, get_software_libdir + + +class EB_Score_minus_P(ConfigureMake): + """ + Support for building and installing software using the Score-P configuration style (e.g., Cube, OTF2, Scalasca, + and Score-P). + """ + + def configure_step(self, *args, **kwargs): + """Configure the build, set configure options for compiler, MPI and dependencies.""" + # On non-cross-compile platforms, specify compiler and MPI suite explicitly. This is much quicker and safer + # than autodetection. In Score-P build-system terms, the following platforms are considered cross-compile + # architectures: + # + # - Cray XT/XE/XK/XC series + # - Fujitsu FX10, FX100 & K computer + # - IBM Blue Gene series + # + # Of those, only Cray is supported right now. + tc_fam = self.toolchain.toolchain_family() + if tc_fam != toolchain.CRAYPE: + # --with-nocross-compiler-suite=(gcc|ibm|intel|pgi|studio) + comp_opts = { + # assume that system toolchain uses a system-provided GCC + toolchain.SYSTEM: 'gcc', + toolchain.GCC: 'gcc', + toolchain.IBMCOMP: 'ibm', + toolchain.INTELCOMP: 'intel', + toolchain.NVHPC: 'pgi', + toolchain.PGI: 'pgi', + } + comp_fam = self.toolchain.comp_family() + if comp_fam in comp_opts: + self.cfg.update('configopts', "--with-nocross-compiler-suite=%s" % comp_opts[comp_fam]) + else: + raise EasyBuildError("Compiler family %s not supported yet (only: %s)", + comp_fam, ', '.join(comp_opts.keys())) + + # --with-mpi=(bullxmpi|hp|ibmpoe|intel|intel2|intelpoe|lam|mpibull2|mpich|mpich2|mpich3|openmpi| + # platform|scali|sgimpt|sun) + # + # Notes: + # - intel: Intel MPI v1.x (ancient & unsupported) + # - intel2: Intel MPI v2.x and higher + # - intelpoe: IBM POE MPI for Intel platforms + # - mpich: MPICH v1.x (ancient & unsupported) + # - mpich2: MPICH2 v1.x + # - mpich3: MPICH v3.x & MVAPICH2 + # This setting actually only affects options passed to the MPI (Fortran) compiler wrappers. + # And since MPICH v3.x-compatible options were already supported in MVAPICH2 v1.7, it is + # safe to use 'mpich3' for all supported versions although MVAPICH2 is based on MPICH v3.x + # only since v1.9b. + # + # With minimal toolchains, packages using this easyblock may be built with a non-MPI toolchain (e.g., OTF2). + # In this case, skip passing the '--with-mpi' option. + mpi_opts = { + toolchain.INTELMPI: 'intel2', + toolchain.OPENMPI: 'openmpi', + toolchain.MPICH: 'mpich3', # In EB terms, MPICH means MPICH 3.x + toolchain.MPICH2: 'mpich2', + toolchain.MVAPICH2: 'mpich3', + } + mpi_fam = self.toolchain.mpi_family() + if mpi_fam is not None: + if mpi_fam in mpi_opts: + self.cfg.update('configopts', "--with-mpi=%s" % mpi_opts[mpi_fam]) + else: + raise EasyBuildError("MPI family %s not supported yet (only: %s)", + mpi_fam, ', '.join(mpi_opts.keys())) + + # Auto-detection for dependencies mostly works fine, but hard specify paths anyway to have full control + # + # Notes: + # - binutils: Pass include/lib directories separately, as different directory layouts may break Score-P's + # configure, see https://github.com/geimer/easybuild-easyblocks/pull/4#issuecomment-219284755 + deps = { + 'binutils': ['--with-libbfd-include=%s/include', + '--with-libbfd-lib=%%s/%s' % get_software_libdir('binutils', fs=['libbfd.a'])], + 'libunwind': ['--with-libunwind=%s'], + # Older versions use Cube + 'Cube': ['--with-cube=%s/bin'], + # Recent versions of Cube are split into CubeLib and CubeW(riter) + 'CubeLib': ['--with-cubelib=%s/bin'], + 'CubeWriter': ['--with-cubew=%s/bin'], + 'CUDA': ['--enable-cuda', '--with-libcudart=%s'], + 'OTF2': ['--with-otf2=%s/bin'], + 'OPARI2': ['--with-opari2=%s/bin'], + 'PAPI': ['--with-papi-header=%s/include', '--with-papi-lib=%%s/%s' % get_software_libdir('PAPI')], + 'PDT': ['--with-pdt=%s/bin'], + 'Qt': ['--with-qt=%s'], + 'SIONlib': ['--with-sionlib=%s/bin'], + } + for (dep_name, dep_opts) in deps.items(): + dep_root = get_software_root(dep_name) + if dep_root: + for dep_opt in dep_opts: + try: + dep_opt = dep_opt % dep_root + except TypeError: + pass # Ignore subtitution error when there is nothing to substitute + self.cfg.update('configopts', dep_opt) + + super(EB_Score_minus_P, self).configure_step(*args, **kwargs) -- GitLab