diff --git a/var/spack/repos/builtin/packages/fujitsu-fftw/package.py b/var/spack/repos/builtin/packages/fujitsu-fftw/package.py new file mode 100644 index 0000000000..67a7b04aee --- /dev/null +++ b/var/spack/repos/builtin/packages/fujitsu-fftw/package.py @@ -0,0 +1,112 @@ +# Copyright 2013-2021 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 * +from spack.pkg.builtin.fftw import FftwBase +from spack.error import SpackError + + +def target_check(spec): + if spec.target != "a64fx": + error_msg = ("It can only be built on an A64FX machine.\n") + raise SpackError(error_msg) + + +class FujitsuFftw(FftwBase): + """FFTW (Fujitsu Optimized version) is a comprehensive collection of + fast C routines for computing the Discrete Fourier Transform (DFT) + and various special cases thereof. + + It is an open-source implementation of the Fast Fourier transform + algorithm. It can compute transforms of real and complex-values + arrays of arbitrary size and dimension. + Fujitsu Optimized FFTW is the optimized FFTW implementation targeted + for A64FX CPUs. + + For single precision build, please use precision value as float. + Example : spack install fujitsufftw precision=float + """ + + _name = 'fujitsu-fftw' + homepage = "https://github.com/fujitsu/fftw3" + + version('master', branch='fj_master', git='https://github.com/fujitsu/fftw3.git') + + variant('shared', default=True, description='Builds a shared version of the library') + variant('openmp', default=True, description="Enable OpenMP support") + variant('debug', default=False, description='Builds a debug version of the library') + + depends_on('texinfo') + + provides('fftw-api@3', when='@2:') + + conflicts('precision=quad', when='%fj', msg="Fujitsu Compiler doesn't support quad precision") + conflicts('precision=long_double', when='%fj', msg="ARM-SVE vector instructions only works in single or double precision") + conflicts('%arm') + conflicts('%cce') + conflicts('%apple-clang') + conflicts('%clang') + conflicts('%gcc') + conflicts('%intel') + conflicts('%nag') + conflicts('%pgi') + conflicts('%xl') + conflicts('%xl_r') + + def autoreconf(self, spec, prefix): + if spec.target != "a64fx": + target_check(spec) + + touch = which('touch') + touch('ChangeLog') + autoreconf = which('autoreconf') + autoreconf('-ifv') + + def configure(self, spec, prefix): + """Configure function""" + # Base options + options = [ + 'CFLAGS=-Ofast', + 'FFLAGS=-Kfast', + '--enable-sve', + '--enable-armv8-cntvct-el0', + '--enable-fma', + '--enable-fortran', + '--prefix={0}'.format(prefix), + 'ac_cv_prog_f77_v=-###' + ] + + if '+shared' in spec: + options.append('--enable-shared') + else: + options.append('--disable-shared') + + if '+openmp' in spec: + options.append('--enable-openmp') + options.append('OPENMP_CFLAGS=-Kopenmp') + else: + options.append('--disable-openmp') + + if '+mpi' in spec: + options.append('--enable-mpi') + else: + options.append('--disable-mpi') + + # Double is the default precision, for all the others we need + # to enable the corresponding option. + enable_precision = { + 'float': ['--enable-float'], + 'double': None, + 'long_double': ['--enable-long-double'], + 'quad': ['--enable-quad-precision'] + } + + # Different precisions must be configured and compiled one at a time + configure = Executable('../configure') + for precision in self.selected_precisions: + + opts = (enable_precision[precision] or []) + options[:] + with working_dir(precision, create=True): + configure(*opts)