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