1import config.package
2import os
3
4class Configure(config.package.CMakePackage):
5  def __init__(self, framework):
6    config.package.CMakePackage.__init__(self, framework)
7    self.gitcommit         = 'xsdk-0.2.0-rc1'
8    self.download          = ['https://github.com/LBL-EESA/alquimia-dev/archive/'+self.gitcommit+'.tar.gz','git://https://github.com/LBL-EESA/alquimia-dev.git']
9    self.functions         = []
10    self.includes          = []
11    self.hastests          = 1
12    self.fc                = 1    # 1 means requires fortran
13    self.cxx               = 1    # 1 means requires C++
14    self.linkedbypetsc     = 0
15    self.makerulename      = 'alquimia'    # make on the alquimia directory tries to build executables that will fail so force only building the libraries
16    self.useddirectly      = 0
17    return
18
19  def setupDependencies(self, framework):
20    config.package.CMakePackage.setupDependencies(self, framework)
21    self.compilerFlags = framework.require('config.compilerFlags', self)
22    self.mpi           = framework.require('config.packages.MPI', self)
23    self.hdf5          = framework.require('config.packages.hdf5', self)
24    self.pflotran      = framework.require('config.packages.pflotran', self)
25    self.deps          = [self.mpi, self.hdf5, self.pflotran]
26    return
27
28  # the install is delayed until postProcess() since alquima install requires PETSc to be installed before alquima can be built.
29  def Install(self):
30    return self.installDir
31
32  def configureLibrary(self):
33    ''' Since alquimia cannot be built until after PETSc is compiled we need to just assume the downloaded library will work'''
34    if 'with-alquimia' in self.framework.clArgDB:
35      raise RuntimeError('Alquimia does not support --with-alquimia; only --download-alquimia')
36    if 'with-alquimia-dir' in self.framework.clArgDB:
37      raise RuntimeError('Alquimia does not support --with-alquimia-dir; only --download-alquimia')
38    if 'with-alquimia-include' in self.framework.clArgDB:
39      raise RuntimeError('Alquimia does not support --with-alquimia-include; only --download-alquimia')
40    if 'with-alquimia-lib' in self.framework.clArgDB:
41      raise RuntimeError('Alquimia does not support --with-alquimia-lib; only --download-alquimia')
42
43    self.checkDownload()
44    self.include = [os.path.join(self.installDir,'include')]
45    self.lib     = [os.path.join(self.installDir,'lib','libalquimia.a')]
46    self.found   = 1
47    self.dlib    = self.lib
48    if not hasattr(self.framework, 'packages'):
49      self.framework.packages = []
50    self.framework.packages.append(self)
51
52  def formCMakeConfigureArgs(self):
53    args = config.package.CMakePackage.formCMakeConfigureArgs(self)
54    args.append('-DUSE_XSDK_DEFAULTS=YES')
55    if self.compilerFlags.debugging:
56      args.append('-DCMAKE_BUILD_TYPE=DEBUG')
57      args.append('-DXSDK_ENABLE_DEBUG=YES')
58    else:
59      args.append('-DCMAKE_BUILD_TYPE=RELEASE')
60      args.append('-DXSDK_ENABLE_DEBUG=NO')
61
62
63    plibs = self.hdf5.lib
64    if self.framework.argDB['prefix']:
65       idir = os.path.join(self.getDefaultInstallDir(),'lib')
66    else:
67       idir = os.path.join(self.petscdir.dir,self.arch,'lib')
68    if self.framework.argDB['with-single-library']:
69      plibs = self.libraries.toStringNoDupes(['-L'+idir,' -lpetsc']+plibs)
70    else:
71      plibs = self.libraries.toStringNoDupes(['-L'+idir,'-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys']+plibs)
72
73    args.append('-DTPL_PETSC_LDFLAGS="'+plibs+'"')
74    args.append('-DTPL_PETSC_INCLUDE_DIRS="'+os.path.join(self.petscdir.dir,'include')+';'+';'.join(self.hdf5.include)+'"')
75
76    args.append('-DXSDK_WITH_PFLOTRAN=ON')
77    args.append('-DTPL_PFLOTRAN_LIBRARIES='+self.pflotran.lib[0])
78    args.append('-DTPL_PFLOTRAN_INCLUDE_DIRS='+self.pflotran.include[0])
79    return args
80
81  def postProcess(self):
82    # since we know that pflotran was built before alquimia we know that self.compilePETSc() has already run and installed PETSc
83    #alquimia cmake requires PETSc environmental variables
84    os.environ['PETSC_DIR']  = self.petscdir.dir
85    os.environ['PETSC_ARCH'] = self.arch
86    config.package.CMakePackage.Install(self)
87    if not self.argDB['with-batch']:
88      try:
89        self.logPrintBox('Testing Alquimia; this may take several minutes')
90        output,err,ret  = config.package.CMakePackage.executeShellCommand('cd '+os.path.join(self.packageDir,'petsc-build')+' && '+self.make.make+' test_install',timeout=60, log = self.log)
91        output = output+err
92        self.log.write(output)
93        if output.find('Failure') > -1:
94          raise RuntimeError('Error running make test on Alquimia: '+output)
95      except RuntimeError as e:
96        raise RuntimeError('Error running make test on Alquimia: '+str(e))
97
98
99