# 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) from spack import * class Fftx(CMakePackage, CudaPackage, ROCmPackage): """FFTX is the exascale follow-on to the FFTW open source discrete FFT package for executing the Fast Fourier Transform as well as higher-level operations composed of linear operations combined with DFT transforms.""" homepage = "https://spiral.net" url = "https://github.com/spiral-software/fftx/archive/refs/tags/1.0.3.tar.gz" git = "https://github.com/spiral-software/fftx.git" maintainers = ['spiralgen'] version('develop', branch='develop') version('main', branch='main') version('1.0.3', sha256='b5ff275facce4a2fbabd0aecc65dd55b744794f2e07cd8cfa91363001c664896') variant('build_type', default='Release', values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel'), description='The build type to build') depends_on('spiral-software') depends_on('spiral-package-fftx') depends_on('spiral-package-simt') # depends_on('spiral-package-mpi') conflicts('+rocm', when='+cuda', msg='FFTX only supports one GPU backend at a time') @run_before('cmake') def create_lib_source_code(self): # What config should be built -- driven by spec spec = self.spec backend = 'CPU' if '+cuda' in spec: backend = 'CUDA' if '+rocm' in spec: backend = 'HIP' self.build_config = '-D_codegen=%s' % backend # From directory examples/library run the build-lib-code.sh script with working_dir(join_path(self.stage.source_path, 'src', 'library')): bash = which('bash') bash('./build-lib-code.sh', backend) def cmake_args(self): spec = self.spec args = [ '-DSPIRAL_HOME:STRING={0}'.format(spec['spiral-software'].prefix) ] args.append('-DCMAKE_INSTALL_PREFIX:PATH={0}'.format(self.stage.source_path)) args.append(self.build_config) print('Args = ' + str(args)) return args @property def build_targets(self): return ['-j1', 'install'] def install(self, spec, prefix): mkdirp(prefix.bin) mkdirp(prefix.CMakeIncludes) mkdirp(prefix.examples) mkdirp(prefix.include) mkdirp(prefix.lib) with working_dir(self.stage.source_path): files = ('License.txt', 'README.md', 'ReleaseNotes.md') for fil in files: install(fil, prefix) with working_dir(self.stage.source_path): install_tree('bin', prefix.bin) install_tree('CMakeIncludes', prefix.CMakeIncludes) install_tree('examples', prefix.examples) install_tree('include', prefix.include) install_tree('lib', prefix.lib) def setup_dependent_build_environment(self, env, dependent_spec): env.set('FFTX_HOME', self.prefix) def setup_dependent_run_environment(self, env, dependent_spec): env.set('FFTX_HOME', self.prefix) def setup_run_environment(self, env): env.set('FFTX_HOME', self.prefix)