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