1import config.package 2import os 3 4class Configure(config.package.Package): 5 def __init__(self, framework): 6 config.package.Package.__init__(self, framework) 7 self.download = ['http://ftp.mcs.anl.gov/pub/petsc/externalpackages/Triangle.tar.gz'] 8 self.functions = ['triangulate'] 9 self.includes = ['triangle.h'] 10 self.liblist = [['libtriangle.a']] 11 self.needsMath = 1 12 return 13 14 def setupDependencies(self, framework): 15 config.package.Package.setupDependencies(self, framework) 16 self.sharedLibraries = framework.require('PETSc.options.sharedLibraries', self) 17 self.x = framework.require('config.packages.X', self) 18 self.deps = [] 19 return 20 21 def Install(self): 22 import os, sys 23 import config.base 24 25 libDir = os.path.join(self.installDir, 'lib') 26 includeDir = os.path.join(self.installDir, 'include') 27 makeinc = os.path.join(self.packageDir, 'make.inc') 28 installmakeinc = os.path.join(self.installDir, 'make.inc') 29 30 g = open(makeinc,'w') 31 g.write('SHELL = '+self.programs.SHELL+'\n') 32 g.write('CP = '+self.programs.cp+'\n') 33 g.write('RM = '+self.programs.RM+'\n') 34 g.write('MKDIR = '+self.programs.mkdir+'\n') 35 g.write('OMAKE = '+self.make.make+' '+self.make.noprintdirflag+'\n') 36 37 g.write('CLINKER = '+self.setCompilers.getLinker()+'\n') 38 g.write('AR = '+self.setCompilers.AR+'\n') 39 g.write('ARFLAGS = '+self.setCompilers.AR_FLAGS+'\n') 40 g.write('AR_LIB_SUFFIX = '+self.setCompilers.AR_LIB_SUFFIX+'\n') 41 g.write('RANLIB = '+self.setCompilers.RANLIB+'\n') 42 g.write('SL_LINKER_SUFFIX = '+self.setCompilers.sharedLibraryExt+'\n') 43 44 g.write('TRIANGLE_ROOT = '+self.packageDir+'\n') 45 g.write('PREFIX = '+self.installDir+'\n') 46 g.write('LIBDIR = '+libDir+'\n') 47 g.write('INSTALL_LIB_DIR = '+libDir+'\n') 48 g.write('TRIANGLELIB = libtriangle.$(AR_LIB_SUFFIX)\n') 49 g.write('SHLIB = libtriangle\n') 50 51 self.setCompilers.pushLanguage('C') 52 cflags = self.setCompilers.getCompilerFlags().replace('-Wall','').replace('-Wshadow','') 53 cflags += ' '+self.headers.toString('.') 54 cflags += ' -fPIC' 55 56 g.write('CC = '+self.setCompilers.getCompiler()+'\n') 57 g.write('CFLAGS = '+cflags+'\n') 58 self.setCompilers.popLanguage() 59 60 if self.sharedLibraries.useShared: 61 import config.setCompilers 62 63 g.write('BUILDSHAREDLIB = yes\n') 64 if config.setCompilers.Configure.isSolaris() and config.setCompilers.Configure.isGNU(self.framework.getCompiler()): 65 g.write('shared_arch: shared_'+sys.platform+'gnu\n') 66 else: 67 g.write('shared_arch: shared_'+sys.platform+'\n') 68 g.write(''' 69triangle_shared: 70 -@if [ "${BUILDSHAREDLIB}" = "no" ]; then \\ 71 echo "Shared libraries disabled"; \\ 72 else \ 73 echo "making shared libraries in ${INSTALL_LIB_DIR}"; \\ 74 ${RM} -rf ${INSTALL_LIB_DIR}/tmp-triangle-shlib; \\ 75 mkdir ${INSTALL_LIB_DIR}/tmp-triangle-shlib; \\ 76 cwd=`pwd`; \\ 77 for LIBNAME in ${SHLIB}; \\ 78 do \\ 79 if test -f ${INSTALL_LIB_DIR}/$$LIBNAME.${AR_LIB_SUFFIX} -o -f ${INSTALL_LIB_DIR}/lt_$$LIBNAME.${AR_LIB_SUFFIX}; then \\ 80 if test -f ${INSTALL_LIB_DIR}/$$LIBNAME.${SL_LINKER_SUFFIX}; then \\ 81 flag=`find ${INSTALL_LIB_DIR} -type f -name $$LIBNAME.${AR_LIB_SUFFIX} -newer ${INSTALL_LIB_DIR}/$$LIBNAME.${SL_LINKER_SUFFIX} -print`; \\ 82 if [ "$$flag" = "" ]; then \\ 83 flag=`find ${INSTALL_LIB_DIR} -type f -name lt_$$LIBNAME.${AR_LIB_SUFFIX} -newer ${INSTALL_LIB_DIR}/$$LIBNAME.${SL_LINKER_SUFFIX} -print`; \\ 84 fi; \\ 85 else \\ 86 flag="build"; \\ 87 fi; \\ 88 if [ "$$flag" != "" ]; then \\ 89 echo "building $$LIBNAME.${SL_LINKER_SUFFIX}"; \\ 90 ${RM} -f ${INSTALL_LIB_DIR}/tmp-triangle-shlib/*; \\ 91 cd ${INSTALL_LIB_DIR}/tmp-triangle-shlib; \\ 92 ${AR} x ${INSTALL_LIB_DIR}/$$LIBNAME.${AR_LIB_SUFFIX}; \\ 93 ${RANLIB} ${INSTALL_LIB_DIR}/$$LIBNAME.${AR_LIB_SUFFIX}; \\ 94 cd $$cwd;\\ 95 ${OMAKE} LIBNAME=$$LIBNAME SHARED_LIBRARY_TMPDIR=${INSTALL_LIB_DIR}/tmp-triangle-shlib shared_arch; \\ 96 fi; \\ 97 fi; \\ 98 done; \\ 99 ${RM} -rf ${INSTALL_LIB_DIR}/tmp-triangle-shlib; \\ 100 fi\n''') 101 else: 102 g.write('BUILDSHAREDLIB = no\n') 103 g.write('shared_arch:\n') 104 g.write('shared:\n') 105 g.close() 106 107 # Now compile & install 108 if self.installNeeded('make.inc'): 109 try: 110 self.logPrintBox('Compiling Triangle; this may take several minutes') 111 output1,err1,ret1 = config.package.Package.executeShellCommand('cd '+self.packageDir+' && make clean && make libtriangle.'+self.setCompilers.AR_LIB_SUFFIX+' && make clean', timeout=2500, log = self.framework.log) 112 except RuntimeError, e: 113 raise RuntimeError('Error running make on Triangle: '+str(e)) 114 self.logPrintBox('Installing Triangle; this may take several minutes') 115 self.installDirProvider.printSudoPasswordMessage() 116 output,err,ret = config.package.Package.executeShellCommand(self.installSudo+'mkdir -p '+os.path.join(self.installDir,'lib'), timeout=2500, log=self.framework.log) 117 output,err,ret = config.package.Package.executeShellCommand(self.installSudo+'mkdir -p '+os.path.join(self.installDir,'include'), timeout=2500, log=self.framework.log) 118 output2,err2,ret2 = config.package.Package.executeShellCommand(self.installSudo+'cp -f '+os.path.join(self.packageDir,'libtriangle.'+self.setCompilers.AR_LIB_SUFFIX)+' '+os.path.join(self.installDir,'lib'), timeout=5, log = self.framework.log) 119 output2,err2,ret2 = config.package.Package.executeShellCommand(self.installSudo+'cp -f '+os.path.join(self.packageDir, 'src', 'triangle.h')+' '+includeDir, timeout=5, log = self.framework.log) 120 self.postInstall(output1+err1+output2+err2,'make.inc') 121 return self.installDir 122 123 def configureLibrary(self): 124 config.package.Package.configureLibrary(self) 125 if self.found: 126 self.framework.addDefine('ANSI_DECLARATORS', 1) 127 return 128