1import config.package
2import os
3
4class Configure(config.package.GNUPackage):
5  def __init__(self, framework):
6    config.package.GNUPackage.__init__(self, framework)
7    self.download  = ['http://ftp.mcs.anl.gov/pub/petsc/externalpackages/zoltan_distrib_v3.83.tar.gz']
8    self.functions = ['Zoltan_LB_Partition']
9    self.includes  = ['zoltan.h']
10    self.liblist   = [['libzoltan.a']]
11    self.license   = 'http://www.cs.sandia.gov/Zoltan/Zoltan.html'
12
13  def setupDependencies(self, framework):
14    config.package.GNUPackage.setupDependencies(self, framework)
15    self.parmetis = framework.require('config.packages.parmetis',self)
16    self.ptscotch = framework.require('config.packages.PTScotch',self)
17    self.mpi      = framework.require('config.packages.MPI',self)
18    self.mathlib  = framework.require('config.packages.mathlib',self)
19    self.deps     = [self.mpi,self.mathlib]
20    self.odeps    = [self.parmetis, self.ptscotch]
21
22  def formGNUConfigureArgs(self):
23    args = config.package.GNUPackage.formGNUConfigureArgs(self)
24    if self.getDefaultIndexSize() == 64:
25      args.append('--with-id-type=ullong')
26    args.append('--enable-mpi')
27    if not hasattr(self.compilers, 'CXX'):
28      raise RuntimeError('Error: Zoltan requires C++ compiler. None specified')
29
30    args.append('CPPFLAGS="'+self.headers.toStringNoDupes(self.dinclude)+'"')
31    args.append('LIBS="'+self.libraries.toStringNoDupes(self.dlib)+'"')
32    if hasattr(self.compilers, 'FC'):
33      args.append('--enable-f90interface')
34      args.append('FCFLAGS="'+self.headers.toStringNoDupes(self.dinclude)+'"')
35    if self.parmetis.found:
36      args.append('--with-parmetis')
37    if self.ptscotch.found:
38      args.append('--with-scotch')
39    return args
40
41  def Install(self):
42    '''Zoltan does not have a make clean'''
43    packageDir = os.path.join(self.packageDir,'petsc-build')
44    args = self.formGNUConfigureArgs()
45    args = ' '.join(args)
46    conffile = os.path.join(self.packageDir,self.package+'.petscconf')
47    fd = open(conffile, 'w')
48    fd.write(args)
49    fd.close()
50
51    if not self.installNeeded(conffile):
52      return self.installDir
53
54    output1,err1,ret1  = config.base.Configure.executeShellCommand('rm -rf '+packageDir+' &&  mkdir '+packageDir, timeout=2000, log = self.log)
55    try:
56      self.logPrintBox('Running configure on ' +self.PACKAGE+'; this may take several minutes')
57      output1,err1,ret1  = config.base.Configure.executeShellCommand('cd '+packageDir+' && ../configure '+args, timeout=2000, log = self.log)
58    except RuntimeError as e:
59      raise RuntimeError('Error running configure on ' + self.PACKAGE+': '+str(e))
60    try:
61      self.logPrintBox('Running make on '+self.PACKAGE+'; this may take several minutes')
62
63      output2,err2,ret2  = config.base.Configure.executeShellCommand('cd '+packageDir+' && '+self.make.make+' everything', timeout=6000, log = self.log)
64      self.logPrintBox('Running make install on '+self.PACKAGE+'; this may take several minutes')
65      self.installDirProvider.printSudoPasswordMessage(self.installSudo)
66      output3,err3,ret3  = config.base.Configure.executeShellCommand('cd '+packageDir+' && '+self.installSudo+self.make.make+' install', timeout=300, log = self.log)
67    except RuntimeError as e:
68      raise RuntimeError('Error running make; make install on '+self.PACKAGE+': '+str(e))
69    self.postInstall(output1+err1+output2+err2+output3+err3, conffile)
70    return self.installDir
71
72