text: # Copyright 2013-2019 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)
  
  from spack import *
  
  
  class Chai(CMakePackage, CudaPackage, ROCmPackage):
      """
      Copy-hiding array interface for data migration between memory spaces
      """
  
      homepage = "https://github.com/LLNL/CHAI"
      git      = "https://github.com/LLNL/CHAI.git"
  
      version('develop', branch='develop', submodules='True')
      version('master', branch='main', submodules='True')
      version('2.1.1', tag='v2.1.1', submodules='True')
      version('2.1.0', tag='v2.1.0', submodules='True')
      version('2.0.0', tag='v2.0.0', submodules='True')
      version('1.2.0', tag='v1.2.0', submodules='True')
      version('1.1.0', tag='v1.1.0', submodules='True')
      version('1.0', tag='v1.0', submodules='True')
  
      variant('enable_pick', default=False, description='Enable pick method')
      variant('shared', default=True, description='Build Shared Libs')
      variant('raja', default=False, description='Build plugin for RAJA')
      variant('benchmarks', default=True, description='Build benchmarks.')
      variant('examples', default=True, description='Build examples.')
      # TODO: figure out gtest dependency and then set this default True
      # and remove the +tests conflict below.
      variant('tests', default=False, description='Build tests')
  
      depends_on('cmake@3.8:', type='build')
      depends_on('cmake@3.9:', type='build', when="+cuda")
      depends_on('blt', type='build')
      depends_on('blt@0.3.7:', type='build', when='+rocm')
      depends_on('umpire')
      depends_on('raja', when="+raja")
  
      depends_on('umpire+cuda', when="+cuda")
      depends_on('raja+cuda', when="+raja+cuda")
  
      # variants +rocm and amdgpu_targets are not automatically passed to
      # dependencies, so do it manually.
      depends_on('umpire+rocm', when='+rocm')
      depends_on('raja+rocm', when="+raja+rocm")
      for val in ROCmPackage.amdgpu_targets:
          depends_on('umpire amdgpu_target=%s' % val, when='amdgpu_target=%s' % val)
          depends_on('raja amdgpu_target=%s' % val, when='+raja amdgpu_target=%s' % val)
  
      conflicts('+benchmarks', when='~tests')
  
      def cmake_args(self):
          spec = self.spec
  
          options = []
          options.append('-DBLT_SOURCE_DIR={0}'.format(spec['blt'].prefix))
  
          if '+cuda' in spec:
              options.extend([
                  '-DENABLE_CUDA=ON',
                  '-DCUDA_TOOLKIT_ROOT_DIR=' + spec['cuda'].prefix])
  
              if not spec.satisfies('cuda_arch=none'):
                  cuda_arch = spec.variants['cuda_arch'].value
                  options.append('-DCUDA_ARCH=sm_{0}'.format(cuda_arch[0]))
                  flag = '-arch sm_{0}'.format(cuda_arch[0])
                  options.append('-DCMAKE_CUDA_FLAGS:STRING={0}'.format(flag))
          else:
              options.append('-DENABLE_CUDA=OFF')
  
          if '+rocm' in spec:
              options.extend([
                  '-DENABLE_HIP=ON',
                  '-DHIP_ROOT_DIR={0}'.format(spec['hip'].prefix)
              ])
              archs = self.spec.variants['amdgpu_target'].value
              if archs != 'none':
                  arch_str = ",".join(archs)
                  options.append(
                      '-DHIP_HIPCC_FLAGS=--amdgpu-target={0}'.format(arch_str)
                  )
          else:
              options.append('-DENABLE_HIP=OFF')
  
          if '+raja' in spec:
              options.extend(['-DENABLE_RAJA_PLUGIN=ON',
                              '-DRAJA_DIR=' + spec['raja'].prefix])
  
          options.append('-DENABLE_PICK={0}'.format(
              'ON' if '+enable_pick' in spec else 'OFF'))
  
          options.append('-Dumpire_DIR:PATH='
                         + spec['umpire'].prefix.share.umpire.cmake)
  
          options.append('-DENABLE_TESTS={0}'.format(
              'ON' if '+tests' in spec  else 'OFF'))
  
          options.append('-DENABLE_BENCHMARKS={0}'.format(
              'ON' if '+benchmarks' in spec else 'OFF'))
  
          options.append('-DENABLE_EXAMPLES={0}'.format(
              'ON' if '+examples' in spec else 'OFF'))
  
          return options
  