summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/wannier90/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'var/spack/repos/builtin/packages/wannier90/package.py')
-rw-r--r--var/spack/repos/builtin/packages/wannier90/package.py135
1 files changed, 116 insertions, 19 deletions
diff --git a/var/spack/repos/builtin/packages/wannier90/package.py b/var/spack/repos/builtin/packages/wannier90/package.py
index 5be0134141..e4aa1017c7 100644
--- a/var/spack/repos/builtin/packages/wannier90/package.py
+++ b/var/spack/repos/builtin/packages/wannier90/package.py
@@ -15,8 +15,10 @@ class Wannier90(MakefilePackage):
Wannier90 is released under the GNU General Public License.
"""
homepage = 'http://wannier.org'
- url = 'http://wannier.org/code/wannier90-2.0.1.tar.gz'
+ url = 'https://github.com/wannier-developers/wannier90/archive/v3.1.0.tar.gz'
+ version('3.1.0', sha256='40651a9832eb93dec20a8360dd535262c261c34e13c41b6755fa6915c936b254')
+ version('3.0.0', sha256='f196e441dcd7b67159a1d09d2d7de2893b011a9f03aab6b30c4703ecbf20fe5b')
version('2.1.0', sha256='ee90108d4bc4aa6a1cf16d72abebcb3087cf6c1007d22dda269eb7e7076bddca')
version('2.0.1', sha256='05ea7cd421a219ce19d379ad6ae3d9b1a84be4ffb367506ffdfab1e729309e94')
@@ -26,17 +28,40 @@ class Wannier90(MakefilePackage):
parallel = False
- build_targets = [
- 'wannier', 'post', 'lib', 'w90chk2chk', 'w90vdw', 'w90pov'
- ]
+ variant(
+ 'shared',
+ default=True,
+ description='Builds a shared version of the library'
+ )
@property
- def makefile_name(self):
- # Older versions use 'make.sys'
- filename = 'make.sys'
+ def build_targets(self):
+ targets = []
+ if '@:2' in self.spec:
+ targets = [
+ 'lib', 'wannier', 'post', 'w90chk2chk', 'w90vdw', 'w90pov'
+ ]
+ if '@3:' in self.spec:
+ targets = ['wannier', 'post', 'lib', 'w90chk2chk', 'w90vdw']
+ if '+shared' in self.spec:
+ targets.append('dynlib')
+
+ return targets
+
+ def url_for_version(self, version):
+ if (version > Version('2')):
+ url = 'https://github.com/wannier-developers/wannier90/archive/v{0}.tar.gz'
+ else:
+ url = 'http://wannier.org/code/wannier90-{0}.tar.gz'
+ return url.format(version)
- # While newer search for 'make.inc'
- if self.spec.satisfies('@2.1.0:'):
+ @property
+ def makefile_name(self):
+ # Version 2.0.1 uses make.sys,
+ # other verions use make.inc
+ if self.spec.satisfies('@2.0.1'):
+ filename = 'make.sys'
+ else:
filename = 'make.inc'
abspath = join_path(self.stage.source_path, filename)
@@ -46,10 +71,12 @@ class Wannier90(MakefilePackage):
lapack = self.spec['lapack'].libs
blas = self.spec['blas'].libs
+ mpi = self.spec['mpi'].libs
+
substitutions = {
'@F90': spack_fc,
'@MPIF90': self.spec['mpi'].mpifc,
- '@LIBS': (lapack + blas).joined()
+ '@LIBS': (lapack + blas + mpi).joined()
}
template = join_path(
@@ -61,10 +88,67 @@ class Wannier90(MakefilePackage):
for key, value in substitutions.items():
filter_file(key, value, self.makefile_name)
- def install(self, spec, prefix):
+ if '@:2 +shared' in self.spec:
+ # this is to build a .shared wannier90 library
+ filter_file('LIBRARY = ../../libwannier.a',
+ 'LIBRARY = ../../libwannier.' + dso_suffix,
+ join_path(self.stage.source_path, 'src/Makefile.2'))
+ filter_file('parameters.o kmesh.o io.o comms.o '
+ 'utility.o get_oper.o constants.o '
+ 'postw90_common.o wan_ham.o spin.o '
+ 'dos.o berry.o kpath.o kslice.o '
+ 'boltzwann.o geninterp.o',
+ 'comms.o get_oper.o postw90_common.o '
+ 'wan_ham.o spin.o dos.o berry.o '
+ 'kpath.o kslice.o boltzwann.o geninterp.o',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'))
+ filter_file('../../wannier90.x: .*',
+ '../../wannier90.x: $(OBJS) '
+ '../wannier_prog.F90 $(LIBRARY)',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'))
+ filter_file('../../postw90.x: $(OBJS_POST) '
+ '$(POSTDIR)postw90.F90',
+ '../../postw90.x: $(OBJS_POST) '
+ '$(POSTDIR)postw90.F90 $(LIBRARY)',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'), string=True)
+ filter_file(
+ '$(COMPILER) ../wannier_prog.F90 '
+ '$(LDOPTS) $(OBJS) $(LIBS) '
+ '-o ../../wannier90.x',
+ '$(COMPILER) -I../obj ../wannier_prog.F90 '
+ '$(LDOPTS) -L../.. -lwannier '
+ '-o ../../wannier90.x',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'), string=True)
+ filter_file(
+ '$(COMPILER) $(POSTDIR)postw90.F90 '
+ '$(POSTOPTS) $(LDOPTS) '
+ '$(OBJS_POST) '
+ '$(LIBS) -o ../../postw90.x',
+ '$(COMPILER) -I../obj $(POSTDIR)postw90.F90 '
+ '$(POSTOPTS) $(LDOPTS) $(OBJS_POST) '
+ '-L../.. -lwannier $(LIBS) -o ../../postw90.x',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'), string=True)
+ filter_file(
+ '$(AR) $(ARFLAGS) '
+ '$(LIBRARY) $(OBJS2) $(OBJS)',
+ '$(MPIF90) $(FCOPTS) -shared -o '
+ '$(LIBRARY) $(OBJS2) $(OBJS) $(LIBS)',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'), string=True)
+
+ def setup_build_environment(self, env):
+ env.set('MPIFC', self.prefix.bin.mpifc)
+ def install(self, spec, prefix):
mkdirp(self.prefix.bin)
mkdirp(self.prefix.lib)
+ if '+shared' in spec:
+ mkdirp(self.prefix.modules)
install(
join_path(self.stage.source_path, 'wannier90.x'),
@@ -76,10 +160,17 @@ class Wannier90(MakefilePackage):
join_path(self.prefix.bin, 'postw90.x')
)
- install(
- join_path(self.stage.source_path, 'libwannier.a'),
- join_path(self.prefix.lib, 'libwannier.a')
- )
+ inst = []
+ if '+shared' in spec:
+ inst.append('libwannier.' + dso_suffix)
+ # version 3 or 2 without the shared variant
+ # also has a .a version of the library
+ if '@3:' in spec or '~shared' in spec:
+ inst.append('libwannier.a')
+
+ for file in inst:
+ install(join_path(self.stage.source_path, file),
+ join_path(self.prefix.lib, file))
install(
join_path(self.stage.source_path, 'w90chk2chk.x'),
@@ -91,12 +182,18 @@ class Wannier90(MakefilePackage):
join_path(self.prefix.bin, 'w90vdw.x')
)
- install(
- join_path(self.stage.source_path, 'utility', 'w90pov', 'w90pov'),
- join_path(self.prefix.bin, 'w90pov')
- )
+ if spec.satisfies('@:2'):
+ install(
+ join_path(self.stage.source_path,
+ 'utility', 'w90pov', 'w90pov'),
+ join_path(self.prefix.bin, 'w90pov')
+ )
install_tree(
join_path(self.stage.source_path, 'pseudo'),
join_path(self.prefix.bin, 'pseudo')
)
+
+ for file in find(join_path(self.stage.source_path, 'src/obj'),
+ '*.mod'):
+ install(file, self.prefix.modules)