text: # Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
  # Spack Project Developers. See the top-level COPYRIGHT file for details.
  #
  # SPDX-License-Identifier: (Apache-2.0 OR MIT)
  
  import os
  import platform
  
  from spack import *
  
  
  class Hpcg(AutotoolsPackage):
      """HPCG is a software package that performs a fixed number of multigrid
      preconditioned (using a symmetric Gauss-Seidel smoother) conjugate gradient
      (PCG) iterations using double precision (64 bit) floating point values."""
  
      homepage = "https://www.hpcg-benchmark.org"
      url = "https://www.hpcg-benchmark.org/downloads/hpcg-3.1.tar.gz"
      git = "https://github.com/hpcg-benchmark/hpcg.git"
  
      version('develop', branch='master')
      version('3.1', sha256='33a434e716b79e59e745f77ff72639c32623e7f928eeb7977655ffcaade0f4a4')
  
      variant('openmp', default=True, description='Enable OpenMP support')
  
      patch('https://github.com/hpcg-benchmark/hpcg/commit/e9e0b7e6cae23e1f30dd983c2ce2d3bd34d56f75.patch?full_index=1', sha256='722c13837b287e979442f8372274aa5910a290aa39f1ed1ff646116be08dcae9', when='%gcc@9:')
      patch('https://github.com/hpcg-benchmark/hpcg/commit/e9e0b7e6cae23e1f30dd983c2ce2d3bd34d56f75.patch?full_index=1', sha256='722c13837b287e979442f8372274aa5910a290aa39f1ed1ff646116be08dcae9', when='%aocc')
  
      depends_on('mpi@1.1:')
  
      arch = '{0}-{1}'.format(platform.system(), platform.processor())
      build_targets = ['arch={0}'.format(arch)]
  
      def configure(self, spec, prefix):
          CXXFLAGS = '-O3 -ffast-math -ftree-vectorize '
          if not spec.satisfies('%aocc') and not spec.satisfies('%cce'):
              CXXFLAGS += ' -ftree-vectorizer-verbose=0 '
          if spec.satisfies('%cce'):
              CXXFLAGS += ' -Rpass=loop-vectorize'
              CXXFLAGS += ' -Rpass-missed=loop-vectorize'
              CXXFLAGS += ' -Rpass-analysis=loop-vectorize '
          if '+openmp' in self.spec:
              CXXFLAGS += self.compiler.openmp_flag
          config = [
              # Shell
              'SHELL         = /bin/sh',
              'CD            = cd',
              'CP            = cp',
              'LN_S          = ln -fs',
              'MKDIR         = mkdir -p',
              'RM            = /bin/rm -f',
              'TOUCH         = touch',
              # Platform identifier
              'ARCH          = {0}'.format(self.arch),
              # HPCG Directory Structure / HPCG library
              'TOPdir        = {0}'.format(os.getcwd()),
              'SRCdir        = $(TOPdir)/src',
              'INCdir        = $(TOPdir)/src',
              'BINdir        = $(TOPdir)/bin',
              # Message Passing library (MPI)
              'MPinc         = -I{0}'.format(spec['mpi'].prefix.include),
              'MPlib         = -L{0}'.format(spec['mpi'].prefix.lib),
              # HPCG includes / libraries / specifics
              'HPCG_INCLUDES = -I$(INCdir) -I$(INCdir)/$(arch) $(MPinc)',
              'HPCG_LIBS     =',
              'HPCG_OPTS     =',
              'HPCG_DEFS     = $(HPCG_OPTS) $(HPCG_INCLUDES)',
              # Compilers / linkers - Optimization flags
              'CXX           = {0}'.format(spec['mpi'].mpicxx),
              'CXXFLAGS      = $(HPCG_DEFS) {0}'.format(CXXFLAGS),
              'LINKER        = $(CXX)',
              'LINKFLAGS     = $(CXXFLAGS)',
              'ARCHIVER      = ar',
              'ARFLAGS       = r',
              'RANLIB        = echo',
          ]
  
          # Write configuration options to include file
          with open('setup/Make.{0}'.format(self.arch), 'w') as makefile:
              for var in config:
                  makefile.write('{0}\n'.format(var))
  
      def install(self, spec, prefix):
          # Manual installation
          install_tree('bin', prefix.bin)
  