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.gitcommit = 'v1.3-p2' 8 self.download = ['git://https://bitbucket.org/petsc/pkg-triangle','https://bitbucket.org/petsc/pkg-triangle/get/'+self.gitcommit+'.tar.gz'] 9 self.downloaddirnames = ['petsc-pkg-triangle','Triangle'] 10 self.functions = ['triangulate'] 11 self.includes = ['triangle.h'] 12 self.liblist = [['libtriangle.a']] 13 self.precisions = ['single', 'double', '__float128'] 14 self.hastests = 1 15 self.brokengnu23 = 1 16 return 17 18 def setupHelp(self, help): 19 import nargs 20 config.package.Package.setupHelp(self, help) 21 help.addArgument('TRIANGLE', '-download-triangle-build-exec=<bool>', nargs.ArgBool(None, False, 'Build and install the triangle executable in addition to the library')) 22 return 23 24 def setupDependencies(self, framework): 25 config.package.Package.setupDependencies(self, framework) 26 self.x = framework.require('config.packages.X', self) 27 self.mathlib = framework.require('config.packages.mathlib',self) 28 self.deps = [self.mathlib] 29 return 30 31 def Install(self): 32 import os, sys 33 import config.base 34 35 libDir = os.path.join(self.installDir, 'lib') 36 includeDir = os.path.join(self.installDir, 'include') 37 makeinc = os.path.join(self.packageDir, 'make.inc') 38 installmakeinc = os.path.join(self.installDir, 'make.inc') 39 40 g = open(makeinc,'w') 41 g.write('SHELL = '+self.programs.SHELL+'\n') 42 g.write('CP = '+self.programs.cp+'\n') 43 g.write('RM = '+self.programs.RM+'\n') 44 g.write('MKDIR = '+self.programs.mkdir+'\n') 45 g.write('OMAKE = '+self.make.make+' '+self.make.noprintdirflag+'\n') 46 47 g.write('CLINKER = '+self.getLinker()+'\n') 48 g.write('AR = '+self.setCompilers.AR+'\n') 49 g.write('ARFLAGS = '+self.setCompilers.AR_FLAGS+'\n') 50 g.write('AR_LIB_SUFFIX = '+self.setCompilers.AR_LIB_SUFFIX+'\n') 51 g.write('RANLIB = '+self.setCompilers.RANLIB+'\n') 52 g.write('SL_LINKER_SUFFIX = '+self.setCompilers.sharedLibraryExt+'\n') 53 54 g.write('TRIANGLE_ROOT = '+self.packageDir+'\n') 55 g.write('PREFIX = '+self.installDir+'\n') 56 g.write('LIBDIR = '+libDir+'\n') 57 g.write('INSTALL_LIB_DIR = '+libDir+'\n') 58 g.write('TRIANGLELIB = libtriangle.$(AR_LIB_SUFFIX)\n') 59 g.write('SHLIB = libtriangle\n') 60 61 self.pushLanguage('C') 62 cflags = self.updatePackageCFlags(self.getCompilerFlags()) 63 cflags += ' '+self.headers.toString('.') 64 cflags += ' -fPIC' 65 cflags += ' -DNO_TIMER' 66 67 g.write('CC = '+self.getCompiler()+'\n') 68 g.write('CFLAGS = '+cflags+'\n') 69 self.popLanguage() 70 71 if self.checkSharedLibrariesEnabled(): 72 import config.setCompilers 73 74 g.write('BUILDSHAREDLIB = yes\n') 75 if config.setCompilers.Configure.isSolaris(self.log) and config.setCompilers.Configure.isGNU(self.getCompiler(), self.log): 76 g.write('shared_arch: shared_'+sys.platform+'gnu\n') 77 else: 78 g.write('shared_arch: shared_'+sys.platform+'\n') 79 g.write(''' 80triangle_shared: 81 -@if [ "${BUILDSHAREDLIB}" = "no" ]; then \\ 82 echo "Shared libraries disabled"; \\ 83 else \ 84 echo "making shared libraries in ${INSTALL_LIB_DIR}"; \\ 85 ${RM} -rf ${INSTALL_LIB_DIR}/tmp-triangle-shlib; \\ 86 mkdir ${INSTALL_LIB_DIR}/tmp-triangle-shlib; \\ 87 cwd=`pwd`; \\ 88 for LIBNAME in ${SHLIB}; \\ 89 do \\ 90 if test -f ${INSTALL_LIB_DIR}/$$LIBNAME.${AR_LIB_SUFFIX} -o -f ${INSTALL_LIB_DIR}/lt_$$LIBNAME.${AR_LIB_SUFFIX}; then \\ 91 if test -f ${INSTALL_LIB_DIR}/$$LIBNAME.${SL_LINKER_SUFFIX}; then \\ 92 flag=`find ${INSTALL_LIB_DIR} -type f -name $$LIBNAME.${AR_LIB_SUFFIX} -newer ${INSTALL_LIB_DIR}/$$LIBNAME.${SL_LINKER_SUFFIX} -print`; \\ 93 if [ "$$flag" = "" ]; then \\ 94 flag=`find ${INSTALL_LIB_DIR} -type f -name lt_$$LIBNAME.${AR_LIB_SUFFIX} -newer ${INSTALL_LIB_DIR}/$$LIBNAME.${SL_LINKER_SUFFIX} -print`; \\ 95 fi; \\ 96 else \\ 97 flag="build"; \\ 98 fi; \\ 99 if [ "$$flag" != "" ]; then \\ 100 echo "building $$LIBNAME.${SL_LINKER_SUFFIX}"; \\ 101 ${RM} ${INSTALL_LIB_DIR}/tmp-triangle-shlib/*; \\ 102 cd ${INSTALL_LIB_DIR}/tmp-triangle-shlib; \\ 103 ${AR} x ${INSTALL_LIB_DIR}/$$LIBNAME.${AR_LIB_SUFFIX}; \\ 104 ${RANLIB} ${INSTALL_LIB_DIR}/$$LIBNAME.${AR_LIB_SUFFIX}; \\ 105 cd $$cwd;\\ 106 ${OMAKE} LIBNAME=$$LIBNAME SHARED_LIBRARY_TMPDIR=${INSTALL_LIB_DIR}/tmp-triangle-shlib shared_arch; \\ 107 fi; \\ 108 fi; \\ 109 done; \\ 110 ${RM} -rf ${INSTALL_LIB_DIR}/tmp-triangle-shlib; \\ 111 fi\n''') 112 else: 113 g.write('BUILDSHAREDLIB = no\n') 114 g.write('shared_arch:\n') 115 g.write('shared:\n') 116 g.close() 117 118 # Now compile & install 119 if self.installNeeded('make.inc'): 120 try: 121 self.logPrintBox('Compiling Triangle; this may take several minutes') 122 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.log) 123 except RuntimeError as e: 124 raise RuntimeError('Error running make on Triangle: '+str(e)) 125 self.logPrintBox('Installing Triangle; this may take several minutes') 126 output,err,ret = config.package.Package.executeShellCommand('mkdir -p '+os.path.join(self.installDir,'lib'), timeout=2500, log=self.log) 127 output,err,ret = config.package.Package.executeShellCommand('mkdir -p '+os.path.join(self.installDir,'include'), timeout=2500, log=self.log) 128 output,err,ret = config.package.Package.executeShellCommand('mkdir -p '+os.path.join(self.installDir,'bin'), timeout=2500, log=self.log) 129 output2,err2,ret2 = config.package.Package.executeShellCommand('cp -f '+os.path.join(self.packageDir,'libtriangle.'+self.setCompilers.AR_LIB_SUFFIX)+' '+os.path.join(self.installDir,'lib'), timeout=60, log = self.log) 130 output2,err2,ret2 = config.package.Package.executeShellCommand('cp -f '+os.path.join(self.packageDir, 'src', 'triangle.h')+' '+includeDir, timeout=60, log = self.log) 131 if self.argDB['download-triangle-build-exec']: 132 try: 133 output3,err3,ret3 = config.package.Package.executeShellCommand('cd '+self.packageDir+' && make clean && '+self.getCompiler()+' '+cflags+' -DNO_PETSC_MALLOC src/triangle.c -o triangle -lm && make clean', timeout=2500, log = self.log) 134 except RuntimeError as e: 135 raise RuntimeError('Error building Triangle executable: '+str(e)) 136 output3,err3,ret3 = config.package.Package.executeShellCommand('cp -f '+os.path.join(self.packageDir,'triangle')+' '+os.path.join(self.installDir,'bin'), timeout=60, log = self.log) 137 self.postInstall(output1+err1+output2+err2,'make.inc') 138 return self.installDir 139 140 def configureLibrary(self): 141 config.package.Package.configureLibrary(self) 142 return 143