1import config.package 2import os 3 4class Configure(config.package.GNUPackage): 5 def __init__(self, framework): 6 config.package.GNUPackage.__init__(self, framework) 7 self.gitcommit = '77798aeb67bf38054bfa7b3065e308d1b2914445' 8 self.download = ['git://https://github.com/bldenton/EGADSlite.git'] 9 self.functions = ['EG_open'] 10 self.includes = ['egads.h'] 11 self.hastests = 1 12 self.buildLanguages = ['Cxx'] 13 self.hasegadslite = 1 14 self.hasegads = 1 15 self.skippackagelibincludedirs = 1 16 return 17 18 def setupDependencies(self, framework): 19 config.package.GNUPackage.setupDependencies(self, framework) 20 self.pthread = self.framework.require('config.packages.pthread',self) 21 self.oce = self.framework.require('config.packages.opencascade',self) 22 self.deps = [self.pthread] 23 self.odeps = [self.oce] 24 return 25 26 def setupHelp(self, help): 27 config.package.GNUPackage.setupHelp(self,help) 28 import nargs 29 help.addArgument('EGADS', '-egads-full', nargs.ArgBool(None, 1, 'Install EGADS in addition to EGADSLite')) 30 return 31 32 def createEGADSLiteMakefile(self): 33 if not self.hasegadslite: return 34 makeinc = os.path.join(self.packageDir, 'make_lite.inc') 35 g = open(makeinc,'w') 36 g.write(''' 37include $(PETSC_DIR)/lib/petsc/conf/variables 38 39EGADSFLAGS = -DLITE -IEGADSlite/include 40 41INCDIR = EGADSlite/include 42SRCDIR = EGADSlite/src 43LIBBASE = libegadslite 44LIBNAME = ${LIBBASE}.${AR_LIB_SUFFIX} 45LIBSRC.h = $(INCDIR)/egads_lite.h $(INCDIR)/egadsErrors_lite.h \ 46 $(INCDIR)/egadsInternals_lite.h $(INCDIR)/egadsTris_lite.h $(INCDIR)/egadsTypes_lite.h \ 47 $(INCDIR)/emp_lite.h $(INCDIR)/liteClasses.h $(INCDIR)/liteString.h \ 48 $(INCDIR)/regQuads_lite.h 49LIBSRC.c = $(SRCDIR)/liteAttrs.c $(SRCDIR)/liteBase.c $(SRCDIR)/liteGeom.c $(SRCDIR)/liteImport.c \ 50 $(SRCDIR)/liteMemory.c $(SRCDIR)/liteString.c $(SRCDIR)/egadsTess_lite.c $(SRCDIR)/egadsTessInp_lite.c \ 51 $(SRCDIR)/egadsTris_lite.c $(SRCDIR)/liteTopo.c $(SRCDIR)/egadsQuads_lite.c $(SRCDIR)/regQuads_lite.c \ 52 $(SRCDIR)/egadsRobust_lite.c $(SRCDIR)/emp_lite.c $(SRCDIR)/evaluate_lite.c $(SRCDIR)/rational_lite.c \ 53 $(SRCDIR)/limitTessBody_lite.c $(SRCDIR)/liteTest.c \ 54 $(SRCDIR)/retessFaces_lite.c 55LIBSRC.o = $(LIBSRC.c:%.c=%.o) 56 57lib : $(LIBNAME) ; 58 59$(LIBSRC.o) : $(LIBSRC.h) 60 61define ARCHIVE_RECIPE_WIN32FE_LIB 62 @$(RM) $@ $@.args 63 @cygpath -w $^ > $@.args 64 $(AR) $(AR_FLAGS) $@ @$@.args 65 @$(RM) $@.args 66endef 67 68define ARCHIVE_RECIPE_DEFAULT 69 @$(RM) $@ 70 $(AR) $(AR_FLAGS) $@ $^ 71 $(RANLIB) $@ 72endef 73 74$(LIBNAME) : $(LIBSRC.o) 75 $(if $(findstring win32fe lib,$(AR)),$(ARCHIVE_RECIPE_WIN32FE_LIB),$(ARCHIVE_RECIPE_DEFAULT)) 76 77COMPILE.c = $(CC) $(CC_FLAGS) $(FLAGS) $(CPPFLAGS) $(EGADSFLAGS) $(TARGET_ARCH) -c 78COMPILE.cpp = $(CXX) $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(EGADSFLAGS) $(TARGET_ARCH) -c 79 80# This is unusual; usually prefix would default to /usr/local 81prefix ?= $(PETSC_DIR)/$(PETSC_ARCH) 82libdir = $(prefix)/lib 83includedir = $(prefix)/include 84INSTALL = install 85INSTALL_DATA = $(INSTALL) -m644 86MKDIR_P = mkdir -p 87 88install-egads: $(LIBNAME) 89 $(MKDIR_P) "$(DESTDIR)$(includedir)" "$(DESTDIR)$(libdir)" 90 $(INSTALL_DATA) $(LIBSRC.h) "$(DESTDIR)$(includedir)/" 91 $(INSTALL_DATA) $(LIBNAME) "$(DESTDIR)$(libdir)/" 92 93clean: 94 $(RM) $(LIBNAME) $(LIBSRC.o) 95 96.PHONY: lib clean install-egads 97 ''') 98 g.close() 99 return 100 101 def createEGADSMakefile(self): 102 if not self.hasegads: return 103 makeinc = os.path.join(self.packageDir, 'make.inc') 104 g = open(makeinc,'w') 105 g.write(''' 106include $(PETSC_DIR)/lib/petsc/conf/variables 107 108EGADSFLAGS = -IEGADS/include -IEGADS/src -IEGADS/util '''+self.headers.toStringNoDupes(self.oce.include)+'/opencascade'+ 109''' 110 111INCDIR = EGADS/include 112SRCDIR = EGADS/src 113UTLDIR = EGADS/util 114LIBBASE = libegads 115LIBNAME = ${LIBBASE}.${AR_LIB_SUFFIX} 116LIBSRC.h = $(INCDIR)/egads.h $(INCDIR)/egads_dot.h $(INCDIR)/egadsErrors.h \ 117 $(INCDIR)/egadsTypes.h $(INCDIR)/emp.h $(INCDIR)/prm.h $(INCDIR)/wsserver.h $(INCDIR)/wsss.h \ 118 $(SRCDIR)/Surreal/SurrealD.h $(SRCDIR)/Surreal/SurrealD_Lazy.h $(SRCDIR)/Surreal/SurrealD_Trad.h \ 119 $(SRCDIR)/Surreal/SurrealS.h $(SRCDIR)/Surreal/SurrealS_Lazy.h $(SRCDIR)/Surreal/SurrealS_Trad.h \ 120 $(SRCDIR)/Surreal/always_inline.h $(UTLDIR)/regQuads.h 121 122LIBSRC.c = $(SRCDIR)/egadsAttrs.c $(SRCDIR)/egadsBase.c $(SRCDIR)/egadsCopy.c $(SRCDIR)/egadsExport.c \ 123 $(SRCDIR)/egadsFit.c $(SRCDIR)/egadsGeom.c $(SRCDIR)/egadsHLevel.c $(SRCDIR)/egadsIO.c \ 124 $(SRCDIR)/egadsMemory.c $(SRCDIR)/egadsQuads.c $(SRCDIR)/egadsRobust.c $(SRCDIR)/egadsSBO.c \ 125 $(SRCDIR)/egadsSkinning.c $(SRCDIR)/egadsSolids.c $(SRCDIR)/egadsSpline.c $(SRCDIR)/egadsSplineFit.c \ 126 $(SRCDIR)/egadsTess.c $(SRCDIR)/egadsTessInp.c $(SRCDIR)/egadsTessSens.c $(SRCDIR)/egadsTopo.c \ 127 $(SRCDIR)/egadsTris.c $(UTLDIR)/emp.c $(SRCDIR)/prmCfit.c $(SRCDIR)/prmGrid.c \ 128 $(SRCDIR)/prmUV.c $(UTLDIR)/regQuads.c 129LIBSRC.cpp = $(UTLDIR)/evaluate.cpp $(UTLDIR)/rational.cpp 130LIBSRC.o = $(LIBSRC.c:%.c=%.o) $(LIBSRC.cpp:%.cpp=%.o) 131 132lib : $(LIBNAME) ; 133 134$(LIBSRC.o) : $(LIBSRC.h) 135 136define ARCHIVE_RECIPE_WIN32FE_LIB 137 @$(RM) $@ $@.args 138 @cygpath -w $^ > $@.args 139 $(AR) $(AR_FLAGS) $@ @$@.args 140 @$(RM) $@.args 141endef 142 143define ARCHIVE_RECIPE_DEFAULT 144 @$(RM) $@ 145 $(AR) $(AR_FLAGS) $@ $^ 146 $(RANLIB) $@ 147endef 148 149$(LIBNAME) : $(LIBSRC.o) 150 $(if $(findstring win32fe lib,$(AR)),$(ARCHIVE_RECIPE_WIN32FE_LIB),$(ARCHIVE_RECIPE_DEFAULT)) 151 152COMPILE.c = $(CC) $(CC_FLAGS) $(FLAGS) $(CPPFLAGS) $(EGADSFLAGS) $(TARGET_ARCH) -c 153COMPILE.cpp = $(CXX) $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(EGADSFLAGS) $(TARGET_ARCH) -c 154 155# This is unusual; usually prefix would default to /usr/local 156prefix ?= $(PETSC_DIR)/$(PETSC_ARCH) 157libdir = $(prefix)/lib 158includedir = $(prefix)/include 159INSTALL = install 160INSTALL_DATA = $(INSTALL) -m644 161MKDIR_P = mkdir -p 162 163install-egads: $(LIBNAME) 164 $(MKDIR_P) "$(DESTDIR)$(includedir)" "$(DESTDIR)$(libdir)" 165 $(INSTALL_DATA) $(LIBSRC.h) "$(DESTDIR)$(includedir)/" 166 $(INSTALL_DATA) $(LIBNAME) "$(DESTDIR)$(libdir)/" 167 168clean: 169 $(RM) $(LIBNAME) $(LIBSRC.o) 170 171.PHONY: lib clean install-egads 172 ''') 173 g.close() 174 return 175 176 # the install is delayed until postProcess() since egads install requires PETSc to have created its build/makefiles before installing 177 # note that egads can (and is) built before PETSc is built. 178 def Install(self): 179 self.createEGADSMakefile() 180 self.createEGADSLiteMakefile() 181 return self.installDir 182 183 def configureLibrary(self): 184 ''' Since egads cannot be built until after PETSc configure is complete we need to just assume the downloaded library will work''' 185 if 'with-egads' in self.framework.clArgDB: 186 raise RuntimeError('egads does not support --with-egads; only --download-egads') 187 if 'with-egads-dir' in self.framework.clArgDB: 188 self.egadsDir = self.framework.argDB['with-egads-dir'] 189 if 'with-egads-shared' in self.framework.clArgDB: 190 raise RuntimeError('egads does not support --with-egads-shared') 191 192 self.hasegads = self.framework.argDB['egads-full'] 193 if self.hasegads and not self.oce.found: 194 raise RuntimeError('egads requires open cascade if doing a full install\nReconfigure using --download-opencascade') 195 196 if not hasattr(self,'egadsDir'): 197 self.checkDownload() 198 self.egadsDir = self.installDir 199 self.include = [os.path.join(self.egadsDir,'include')] 200 self.lib = [] 201 if self.hasegadslite: self.lib.append(os.path.join(self.egadsDir,'lib','libegadslite.a')) 202 if self.hasegads: self.lib.append(os.path.join(self.egadsDir,'lib','libegads.a')) 203 self.found = 1 204 self.dlib = self.lib 205 if not hasattr(self.framework, 'packages'): 206 self.framework.packages = [] 207 self.framework.packages.append(self) 208 209 def buildEGADS(self): 210 self.logPrintBox('Compiling egads; this may take several minutes') 211 # uses the regular PETSc library builder and then moves result 212 # turn off any compiler optimizations as they may break egads 213 self.pushLanguage('C') 214 cflags = self.checkNoOptFlag()+' '+self.getSharedFlag(self.getCompilerFlags())+' '+self.getPointerSizeFlag(self.getCompilerFlags())+' '+self.getWindowsNonOptFlags(self.getCompilerFlags())+' '+self.getDebugFlags(self.getCompilerFlags()) 215 self.popLanguage() 216 output,err,ret = config.package.GNUPackage.executeShellCommand(self.make.make+' -f make.inc PETSC_DIR=' + self.petscdir.dir + ' clean lib PCC_FLAGS="' + cflags + '"', timeout=1000, log = self.log, cwd=self.packageDir) 217 self.log.write(output+err) 218 self.logPrintBox('Installing egads; this may take several minutes') 219 output,err,ret = config.package.GNUPackage.executeShellCommand(self.make.make+' -f make.inc PETSC_DIR='+self.petscdir.dir+' prefix='+self.installDir+' install-egads',timeout=1000, log = self.log, cwd=self.packageDir) 220 self.log.write(output+err) 221 return 222 223 def buildEGADSLite(self): 224 self.logPrintBox('Compiling egads lite; this may take several minutes') 225 # uses the regular PETSc library builder and then moves result 226 # turn off any compiler optimizations as they may break egads 227 self.pushLanguage('C') 228 cflags = self.checkNoOptFlag()+' '+self.getSharedFlag(self.getCompilerFlags())+' '+self.getPointerSizeFlag(self.getCompilerFlags())+' '+self.getWindowsNonOptFlags(self.getCompilerFlags())+' '+self.getDebugFlags(self.getCompilerFlags()) 229 self.popLanguage() 230 output,err,ret = config.package.GNUPackage.executeShellCommand(self.make.make+' -f make_lite.inc PETSC_DIR=' + self.petscdir.dir + ' clean lib PCC_FLAGS="' + cflags + '"', timeout=1000, log = self.log, cwd=self.packageDir) 231 self.log.write(output+err) 232 self.logPrintBox('Installing egads lite; this may take several minutes') 233 output,err,ret = config.package.GNUPackage.executeShellCommand(self.make.make+' -f make_lite.inc PETSC_DIR='+self.petscdir.dir+' prefix='+self.installDir+' install-egads',timeout=1000, log = self.log, cwd=self.packageDir) 234 self.log.write(output+err) 235 return 236 237 def postProcess(self): 238 if not hasattr(self,'installDir'): 239 return 240 try: 241 self.buildEGADSLite() 242 except RuntimeError as e: 243 raise RuntimeError('Error running make on egads lite: '+str(e)) 244 try: 245 self.buildEGADS() 246 except RuntimeError as e: 247 raise RuntimeError('Error running make on egads: '+str(e)) 248