xref: /petsc/config/BuildSystem/config/packages/Triangle.py (revision 0d821f603638cf319655b464fce8824689c6444b)
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