# 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.package 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)

250a90363b8a551a30c6c712500696620df8ab98
<mask token>


class Fftx(CMakePackage, CudaPackage, ROCmPackage):
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    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')
    conflicts('+rocm', when='+cuda', msg=
        'FFTX only supports one GPU backend at a time')

    @run_before('cmake')
    def create_lib_source_code(self):
        spec = self.spec
        backend = 'CPU'
        if '+cuda' in spec:
            backend = 'CUDA'
        if '+rocm' in spec:
            backend = 'HIP'
        self.build_config = '-D_codegen=%s' % backend
        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)
    <mask token>

    def setup_run_environment(self, env):
        env.set('FFTX_HOME', self.prefix)

<mask token>


class Fftx(CMakePackage, CudaPackage, ROCmPackage):
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    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')
    conflicts('+rocm', when='+cuda', msg=
        'FFTX only supports one GPU backend at a time')

    @run_before('cmake')
    def create_lib_source_code(self):
        spec = self.spec
        backend = 'CPU'
        if '+cuda' in spec:
            backend = 'CUDA'
        if '+rocm' in spec:
            backend = 'HIP'
        self.build_config = '-D_codegen=%s' % backend
        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)

<mask token>


class Fftx(CMakePackage, CudaPackage, ROCmPackage):
    <mask token>
    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')
    conflicts('+rocm', when='+cuda', msg=
        'FFTX only supports one GPU backend at a time')

    @run_before('cmake')
    def create_lib_source_code(self):
        spec = self.spec
        backend = 'CPU'
        if '+cuda' in spec:
            backend = 'CUDA'
        if '+rocm' in spec:
            backend = 'HIP'
        self.build_config = '-D_codegen=%s' % backend
        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)

<mask token>


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')
    conflicts('+rocm', when='+cuda', msg=
        'FFTX only supports one GPU backend at a time')

    @run_before('cmake')
    def create_lib_source_code(self):
        spec = self.spec
        backend = 'CPU'
        if '+cuda' in spec:
            backend = 'CUDA'
        if '+rocm' in spec:
            backend = 'HIP'
        self.build_config = '-D_codegen=%s' % backend
        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)

# 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.package 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)
