From b6be3d0c0b05b1c9ecc953e4814968e558b00c1a Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Wed, 14 Apr 2021 17:42:30 +0200 Subject: q-e-sirius: migrate to CMake (#22984) --- .../repos/builtin/packages/q-e-sirius/package.py | 334 +++------------------ 1 file changed, 43 insertions(+), 291 deletions(-) (limited to 'var') diff --git a/var/spack/repos/builtin/packages/q-e-sirius/package.py b/var/spack/repos/builtin/packages/q-e-sirius/package.py index 5e7cb60d7d..304a51a6c6 100644 --- a/var/spack/repos/builtin/packages/q-e-sirius/package.py +++ b/var/spack/repos/builtin/packages/q-e-sirius/package.py @@ -5,7 +5,7 @@ # adapted from official quantum espresso package -class QESirius(Package): +class QESirius(CMakePackage): """SIRIUS enabled fork of QuantumESPRESSO. """ homepage = 'https://github.com/electronic-structure/q-e-sirius/' @@ -14,297 +14,49 @@ class QESirius(Package): maintainers = ['simonpintarelli'] - version('develop', branch='ristretto') + version('develop-ristretto', branch='ristretto') + version('6.7-rc1-sirius', tag='v6.7-rc1-sirius') - version('6.5-rc2-sirius', sha256='460b678406eec36e4ee828c027929cf8720c3965a85c20084c53398b123c9ae9') - version('6.5-rc3-sirius', sha256='1bfb8c1bba815b5ab2d733f51a8f9aa7b079f2859e6f14e4dcda708ebf172b02') - version('6.5-rc4-sirius', sha256='be5529d65e4b301d6a6d1235e8d88277171c1732768bf1cf0c7fdeae154c79f1') + variant('mpi', default=True, description='Builds with MPI support') + variant('openmp', default=True, description='Enables OpenMP support') + variant('scalapack', default=False, description='Enables SCALAPACK support') + variant('elpa', default=False, description='Uses ELPA as an eigenvalue solver') + variant('libxc', default=False, description='Support functionals through libxc') + variant('hdf5', default=False, description='Enables HDF5 support') - variant('mpi', default=True, description='Builds with mpi support') - variant('openmp', default=True, description='Enables openMP support') - variant('scalapack', default=True, description='Enables scalapack support') - variant('elpa', default=False, description='Uses elpa as an eigenvalue solver') + depends_on('sirius +fortran ~apps') + depends_on('sirius +openmp', when='+openmp') + depends_on('sirius@develop', when='@develop') - # Support for HDF5 has been added starting in version 6.1.0 and is - # still experimental, therefore we default to False for the variant - variant( - 'hdf5', default='none', description='Builds with HDF5 support', - values=('parallel', 'serial', 'none'), multi=False - ) - - # Enables building Electron-phonon Wannier 'epw.x' executable - # http://epw.org.uk/Main/About - variant('epw', default=False, - description='Builds Electron-phonon Wannier executable') - - # Apply upstream patches by default. Variant useful for 3rd party - # patches which are incompatible with upstream patches - desc = 'Apply recommended upstream patches. May need to be set ' - desc += 'to False for third party patches or plugins' - variant('patch', default=True, description=desc) - - # QMCPACK converter patch - # https://github.com/QMCPACK/qmcpack/tree/develop/external_codes/quantum_espresso - variant('qmcpack', default=False, - description='Build QE-to-QMCPACK wave function converter') - - # Dependencies - depends_on('blas') - depends_on('lapack') - depends_on('fftw-api@3') - depends_on('sirius+fortran+shared') depends_on('mpi', when='+mpi') - depends_on('scalapack', when='+scalapack+mpi') - depends_on('elpa+openmp', when='+elpa+openmp') - depends_on('elpa~openmp', when='+elpa~openmp') - # Versions of HDF5 prior to 1.8.16 lead to QE runtime errors - depends_on('hdf5@1.8.16:+fortran+hl+mpi', when='hdf5=parallel') - depends_on('hdf5@1.8.16:+fortran+hl~mpi', when='hdf5=serial') - depends_on('hdf5', when='+qmcpack') - # TODO: enable building EPW when ~mpi - depends_on('mpi', when='+epw') - - # CONFLICTS SECTION - # Omitted for now due to concretizer bug - # MKL with 64-bit integers not supported. - # conflicts( - # '^mkl+ilp64', - # msg='Quantum ESPRESSO does not support MKL 64-bit integer variant' - # ) - - # We can't ask for scalapack or elpa if we don't want MPI - conflicts( - '+scalapack', - when='~mpi', - msg='scalapack is a parallel library and needs MPI support' - ) - - conflicts( - '+elpa', - when='~mpi', - msg='elpa is a parallel library and needs MPI support' - ) - - # HDF5 support introduced in 6.1.0, but the configure had some limitations. - # In recent tests (Oct 2019), GCC and Intel work with the HDF5 Spack - # package for the default variant. This is only for hdf5=parallel variant. - # Support, for hdf5=serial was introduced in 6.4.1 but required a patch - # for the serial (no MPI) case. This patch was to work around an issue - # that only manifested itself inside the Spack environment. - conflicts( - 'hdf5=parallel', - when='@:6.0', - msg='parallel HDF5 support only in QE 6.1.0 and later' - ) - - conflicts( - 'hdf5=serial', - when='@:6.4.0', - msg='serial HDF5 support only in QE 6.4.1 and later' - ) - - conflicts( - 'hdf5=parallel', - when='~mpi', - msg='parallel HDF5 requires MPI support' - ) - - # Elpa is formally supported by @:5.4.0, but QE configure searches - # for it in the wrong folders (or tries to download it within - # the build directory). Instead of patching Elpa to provide the - # folder QE expects as a link, we issue a conflict here. - conflicts('+elpa', when='@:5.4.0') - - # Some QMCPACK converters are incompatible with upstream patches. - # HDF5 is a hard requirement. Need to do two HDF5 cases explicitly - # since Spack lacks support for expressing NOT operation. - conflicts( - '@6.4+patch', - when='+qmcpack', - msg='QE-to-QMCPACK wave function converter requires ' - 'deactivatation of upstream patches' - ) - conflicts( - '@6.3:6.4.0 hdf5=serial', - when='+qmcpack', - msg='QE-to-QMCPACK wave function converter only ' - 'supported with parallel HDF5' - ) - conflicts( - 'hdf5=none', - when='+qmcpack', - msg='QE-to-QMCPACK wave function converter requires HDF5' - ) - - # The first version of Q-E to feature integrated EPW is 6.0.0, - # as per http://epw.org.uk/Main/DownloadAndInstall . - # Complain if trying to install a version older than this. - conflicts('+epw', when='@:5', - msg='EPW only available from version 6.0.0 and on') - - # Below goes some constraints as shown in the link above. - # Constraints may be relaxed as successful reports - # of different compiler+mpi combinations arrive - - # TODO: enable building EPW when ~mpi - conflicts('+epw', when='~mpi', msg='EPW needs MPI') - - # EPW doesn't gets along well with OpenMPI 2.x.x - conflicts('+epw', when='^openmpi@2.0.0:2.999.999', - msg='OpenMPI version incompatible with EPW') - - # EPW also doesn't gets along well with PGI 17.x + OpenMPI 1.10.7 - conflicts('+epw', when='^openmpi@1.10.7%pgi@17.0:17.12', - msg='PGI+OpenMPI version combo incompatible with EPW') - - # Spurious problems running in parallel the Makefile - # generated by the configure - parallel = False - - def install(self, spec, prefix): - - prefix_path = prefix.bin if '@:5.4.0' in spec else prefix - options = ['-prefix={0}'.format(prefix_path)] - - sirius = spec['sirius'] - options.append('LIBS={0}'.format(sirius.libs[0])) - options.append('LD_LIBS={0}'.format(sirius.libs[0])) - - options.append('--disable-xml') - - # QE autoconf compiler variables has some limitations: - # 1. There is no explicit MPICC variable so we must re-purpose - # CC for the case of MPI. - # 2. F90 variable is set to be consistent with MPIF90 wrapper - # 3. If an absolute path for F90 is set, the build system breaks. - # - # Thus, due to 2. and 3. the F90 variable is not explictly set - # because it would be mostly pointless and could lead to erroneous - # behaviour. - if '+mpi' in spec: - mpi = spec['mpi'] - options.append('--enable-parallel=yes') - options.append('MPIF90={0}'.format(mpi.mpifc)) - options.append('CC={0}'.format(mpi.mpicc)) - else: - options.append('--enable-parallel=no') - options.append('CC={0}'.format(spack_cc)) - - options.append('F77={0}'.format(spack_f77)) - options.append('F90={0}'.format(spack_fc)) - - header_dir = sirius.headers.directories[0] - f90flags = 'F90FLAGS=-cpp -I {0}/sirius'.format(header_dir) - - if self.spec.satisfies('%gcc@10:'): - f90flags += ' -fallow-argument-mismatch' - - options.append(f90flags) - - if '+openmp' in spec: - options.append('--enable-openmp') - - # QE external BLAS, FFT, SCALAPACK detection is a bit tricky. - # More predictable to pass in the correct link line to QE. - # If external detection of BLAS, LAPACK and FFT fails, QE - # is supposed to revert to internal versions of these libraries - # instead -- but more likely it will pickup versions of these - # libraries found in its the system path, e.g. Red Hat or - # Ubuntu's FFTW3 package. - - # FFT - # FFT detection gets derailed if you pass into the CPPFLAGS, instead - # you need to pass it in the FFTW_INCLUDE and FFT_LIBS directory. - # QE supports an internal FFTW2, but only an external FFTW3 interface. - - if '^mkl' in spec: - # A seperate FFT library is not needed when linking against MKL - options.append( - 'FFTW_INCLUDE={0}'.format(join_path(env['MKLROOT'], - 'include/fftw'))) - if '^fftw@3:' in spec: - fftw_prefix = spec['fftw'].prefix - options.append('FFTW_INCLUDE={0}'.format(fftw_prefix.include)) - fftw_ld_flags = spec['fftw'].libs.ld_flags - options.append('FFT_LIBS={0}'.format(fftw_ld_flags)) - - # External BLAS and LAPACK requires the correct link line into - # BLAS_LIBS, do no use LAPACK_LIBS as the autoconf scripts indicate - # that this variable is largely ignored/obsolete. - - # For many Spack packages, lapack.libs = blas.libs, hence it will - # appear twice in in link line but this is harmless - lapack_blas = spec['lapack'].libs + spec['blas'].libs - - # qe-6.5 fails to detect MKL for FFT if BLAS_LIBS is set due to - # an unfortunate upsteam change in their autoconf/configure: - # - qe-6.5/install/m4/x_ac_qe_blas.m4 only sets 'have_blas' - # but no 'have_mkl' if BLAS_LIBS is set (which seems to be o.k.) - # - however, qe-6.5/install/m4/x_ac_qe_fft.m4 in 6.5 unfortunately - # relies on x_ac_qe_blas.m4 to detect MKL and set 'have_mkl' - # - qe-5.4 up to 6.4.1 had a different logic and worked fine with - # BLAS_LIBS being set - # However, MKL is correctly picked up by qe-6.5 for BLAS and FFT if - # MKLROOT is set (which SPACK does automatically for ^mkl) - if not ('quantum-espresso@6.5' in spec and '^mkl' in spec): - options.append('BLAS_LIBS={0}'.format(lapack_blas.ld_flags)) - - if '+scalapack' in spec: - scalapack_option = 'intel' if '^mkl' in spec else 'yes' - options.append('--with-scalapack={0}'.format(scalapack_option)) - - if '+elpa' in spec: - - # Spec for elpa - elpa = spec['elpa'] - - # Compute the include directory from there: versions - # of espresso prior to 6.1 requires -I in front of the directory - elpa_include = '' if '@6.1:' in spec else '-I' - elpa_include += join_path( - elpa.headers.directories[0], - 'modules' - ) - - options.extend([ - '--with-elpa-include={0}'.format(elpa_include), - '--with-elpa-lib={0}'.format(elpa.libs[0]) - ]) - - if spec.variants['hdf5'].value != 'none': - options.append('--with-hdf5={0}'.format(spec['hdf5'].prefix)) - if spec.satisfies('@6.4.1,6.5'): - options.extend([ - '--with-hdf5-include={0}'.format( - spec['hdf5'].headers.directories[0] - ), - '--with-hdf5-libs={0}'.format( - spec['hdf5:hl,fortran'].libs.ld_flags - ) - ]) - - configure(*options) - - # Filter file must be applied after configure executes - # QE 6.1.0 to QE 6.4 have `-L` missing in front of zlib library - # This issue is backported through an internal patch in 6.4.1, but - # can't be applied to the '+qmcpack' variant - if spec.variants['hdf5'].value != 'none': - if (spec.satisfies('@6.1.0:6.4.0') or - (spec.satisfies('@6.4.1') and '+qmcpack' in spec)): - make_inc = join_path(self.stage.source_path, 'make.inc') - zlib_libs = spec['zlib'].prefix.lib + ' -lz' - filter_file( - zlib_libs, format(spec['zlib'].libs.ld_flags), make_inc - ) - - if '+epw' in spec: - make('all', 'epw') - else: - make('all') - - if 'platform=darwin' in spec: - mkdirp(prefix.bin) - install('bin/*.x', prefix.bin) - else: - make('install') + depends_on('scalapack', when='+scalapack') + depends_on('elpa', when='+elpa') + depends_on('libxc', when='+libxc') + depends_on('hdf5', when='+hdf5') + + depends_on('git', type='build') + + conflicts('~mpi', when='+scalapack', msg='SCALAPACK requires MPI support') + conflicts('~scalapack', when='+elpa', msg='ELPA requires SCALAPACK support') + + def cmake_args(self): + args = [ + '-DQE_ENABLE_SIRIUS=ON', + '-DQE_ENABLE_CUDA=OFF', + '-DQE_LAPACK_INTERNAL=OFF', + '-DQE_ENABLE_DOC=OFF', + self.define_from_variant('QE_ENABLE_MPI', 'mpi'), + self.define_from_variant('QE_ENABLE_OPENMP', 'openmp'), + self.define_from_variant('QE_ENABLE_ELPA', 'elpa'), + self.define_from_variant('QE_ENABLE_LIBXC', 'libxc'), + self.define_from_variant('QE_ENABLE_HDF5', 'hdf5'), + self.define_from_variant('QE_ENABLE_SCALAPACK', 'scalapack') + ] + + # Work around spack issue #19970 where spack sets + # rpaths for MKL just during make, but cmake removes + # them during make install. + if '^mkl' in self.spec: + args.append('-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON') + + return args -- cgit v1.2.3-70-g09d2