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 = 'ee0890bb2ce96bdd878fc2b628602640027eaa85' 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.h \ 46 $(INCDIR)/egadsInternals_lite.h $(INCDIR)/egadsTris_lite.h $(INCDIR)/egadsTypes.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 -IEGADS/util/uvmap -IEGADSlite/include '''+self.headers.toStringNoDupes(self.oce.include)+'/opencascade'+ 109''' 110 111INCDIR = EGADS/include 112ELIDIR = EGADSlite/include 113SRCDIR = EGADS/src 114UTLDIR = EGADS/util 115UVLDIR = EGADS/util/uvmap 116LIBBASE = libegads 117LIBNAME = ${LIBBASE}.${AR_LIB_SUFFIX} 118LIBSRC.h = $(INCDIR)/egads.h $(INCDIR)/egads_dot.h $(INCDIR)/egadsErrors.h \ 119 $(INCDIR)/egadsTypes.h $(INCDIR)/emp.h $(INCDIR)/prm.h $(INCDIR)/wsserver.h $(INCDIR)/wsss.h \ 120 $(SRCDIR)/Surreal/SurrealD.h $(SRCDIR)/Surreal/SurrealD_Lazy.h $(SRCDIR)/Surreal/SurrealD_Trad.h \ 121 $(SRCDIR)/Surreal/SurrealS.h $(SRCDIR)/Surreal/SurrealS_Lazy.h $(SRCDIR)/Surreal/SurrealS_Trad.h \ 122 $(SRCDIR)/Surreal/always_inline.h $(UTLDIR)/regQuads.h $(SRCDIR)/BRepLib_FuseEdges.h \ 123 $(SRCDIR)/egadsInternals.h $(SRCDIR)/egadsStack.h $(SRCDIR)/egadsTris.h $(SRCDIR)/egadsOCC.h \ 124 $(SRCDIR)/egadsClasses.h $(SRCDIR)/egadsSplineFit.h $(INCDIR)/egads.inc $(INCDIR)/wsserver.inc \ 125 $(SRCDIR)/egadsSplineVels.h $(INCDIR)/egadsf90.inc \ 126 $(UVLDIR)/EG_uvmapFindUV.h $(UVLDIR)/EG_uvmapGen.h $(UVLDIR)/EG_uvmapStructFree.h \ 127 $(UVLDIR)/EG_uvmap_Read.h $(UVLDIR)/EG_uvmap_Write.h $(UVLDIR)/EG_uvmapTest.h \ 128 $(UVLDIR)/uvmap_add.h $(UVLDIR)/uvmap_bnd_adj.h $(UVLDIR)/uvmap_chk_area_uv.h \ 129 $(UVLDIR)/uvmap_chk_edge_ratio.h $(UVLDIR)/uvmap_cpu_message.h $(UVLDIR)/uvmap_find_uv.h \ 130 $(UVLDIR)/uvmap_from_egads.h $(UVLDIR)/uvmap_gen.h $(UVLDIR)/uvmap_gen_uv.h \ 131 $(UVLDIR)/uvmap_ibeibe.h $(UVLDIR)/uvmap_ibfibf.h $(UVLDIR)/uvmap_ibfin.h \ 132 $(UVLDIR)/uvmap_iccibe.h $(UVLDIR)/uvmap_iccin.h $(UVLDIR)/uvmap_idibe.h \ 133 $(UVLDIR)/uvmap_inibe.h $(UVLDIR)/uvmap_inl_uv_bnd.h $(UVLDIR)/uvmap_malloc.h \ 134 $(UVLDIR)/uvmap_mben_disc.h $(UVLDIR)/uvmap_message.h $(UVLDIR)/uvmap_norm_uv.h \ 135 $(UVLDIR)/uvmap_read.h $(UVLDIR)/uvmap_solve.h $(UVLDIR)/uvmap_struct.h \ 136 $(UVLDIR)/uvmap_struct_tasks.h $(UVLDIR)/uvmap_test.h $(UVLDIR)/uvmap_to_egads.h \ 137 $(UVLDIR)/uvmap_version.h $(UVLDIR)/uvmap_write.h \ 138 $(UVLDIR)/UVMAP_LIB.h $(UVLDIR)/UVMAP_LIB_INC.h \ 139 $(ELIDIR)/liteString.h $(ELIDIR)/liteClasses.h 140 141LIBSRC.c = $(SRCDIR)/egadsAttrs.c $(SRCDIR)/egadsBase.c $(SRCDIR)/egadsCopy.c $(SRCDIR)/egadsExport.c \ 142 $(SRCDIR)/egadsFit.c $(SRCDIR)/egadsGeom.c $(SRCDIR)/egadsHLevel.c $(SRCDIR)/egadsIO.c \ 143 $(SRCDIR)/egadsMemory.c $(SRCDIR)/egadsQuads.c $(SRCDIR)/egadsRobust.c $(SRCDIR)/egadsSBO.c \ 144 $(SRCDIR)/egadsSkinning.c $(SRCDIR)/egadsSolids.c $(SRCDIR)/egadsSpline.c $(SRCDIR)/egadsSplineFit.c \ 145 $(SRCDIR)/egadsTess.c $(SRCDIR)/egadsTessInp.c $(SRCDIR)/egadsTessSens.c $(SRCDIR)/egadsTopo.c \ 146 $(SRCDIR)/egadsTris.c $(UTLDIR)/emp.c $(SRCDIR)/prmCfit.c $(SRCDIR)/prmGrid.c \ 147 $(SRCDIR)/prmUV.c $(UTLDIR)/regQuads.c $(SRCDIR)/egadsEffect.c $(SRCDIR)/fgadsBase.c \ 148 $(SRCDIR)/fgadsMemory.c $(SRCDIR)/fgadsAttrs.c $(SRCDIR)/fgadsTess.c $(SRCDIR)/fgadsHLevel.c \ 149 $(SRCDIR)/fgadsGeom.c $(SRCDIR)/fgadsTopo.c \ 150 $(UVLDIR)/main/uvmap.c $(UVLDIR)/EG_uvmapFindUV.c $(UVLDIR)/EG_uvmapGen.c \ 151 $(UVLDIR)/EG_uvmap_Read.c $(UVLDIR)/EG_uvmapStructFree.c $(UVLDIR)/EG_uvmapTest.c \ 152 $(UVLDIR)/EG_uvmap_Write.c $(UVLDIR)/uvmap_add.c $(UVLDIR)/uvmap_bnd_adj.c \ 153 $(UVLDIR)/uvmap_chk_area_uv.c $(UVLDIR)/uvmap_chk_area_uv.c $(UVLDIR)/uvmap_chk_edge_ratio.c \ 154 $(UVLDIR)/uvmap_cpu_message.c $(UVLDIR)/uvmap_find_uv.c $(UVLDIR)/uvmap_from_egads.c \ 155 $(UVLDIR)/uvmap_gen.c $(UVLDIR)/uvmap_gen_uv.c $(UVLDIR)/uvmap_ibeibe.c \ 156 $(UVLDIR)/uvmap_ibfibf.c $(UVLDIR)/uvmap_ibfin.c $(UVLDIR)/uvmap_iccibe.c \ 157 $(UVLDIR)/uvmap_iccin.c $(UVLDIR)/uvmap_idibe.c $(UVLDIR)/uvmap_inibe.c \ 158 $(UVLDIR)/uvmap_inl_uv_bnd.c $(UVLDIR)/uvmap_malloc.c $(UVLDIR)/uvmap_mben_disc.c \ 159 $(UVLDIR)/uvmap_message.c $(UVLDIR)/uvmap_norm_uv.c $(UVLDIR)/uvmap_read.c \ 160 $(UVLDIR)/uvmap_solve.c $(UVLDIR)/uvmap_struct_tasks.c $(UVLDIR)/uvmap_to_egads.c \ 161 $(UVLDIR)/uvmap_test.c $(UVLDIR)/uvmap_version.c $(UVLDIR)/uvmap_write.c \ 162 $(UTLDIR)/egadsHOtess.c $(UTLDIR)/egadsUVmap.c \ 163 $(UTLDIR)/extractTess.c $(UTLDIR)/limitTessBody.c $(UTLDIR)/retessFaces.c \ 164 $(UTLDIR)/ThreadTest.c $(UTLDIR)/triServer.c $(UTLDIR)/vHOtess.c 165LIBSRC.cpp = $(UTLDIR)/evaluate.cpp $(UTLDIR)/rational.cpp $(SRCDIR)/BRepLib_FuseEdges.cpp \ 166 $(UTLDIR)/SurrealD1_btest.cpp $(UTLDIR)/SurrealD4_btest.cpp $(UTLDIR)/SurrealS1_btest.cpp \ 167 $(UTLDIR)/SurrealS4_btest.cpp $(SRCDIR)/egadsCopy.cpp $(SRCDIR)/egadsGeom.cpp \ 168 $(SRCDIR)/egadsHLevel.cpp $(SRCDIR)/egadsIO.cpp $(SRCDIR)/egadsSkinning.cpp \ 169 $(SRCDIR)/egadsSpline.cpp $(SRCDIR)/egadsSplineFit.cpp $(SRCDIR)/egadsTessSens.cpp \ 170 $(SRCDIR)/egadsTopo.cpp 171LIBSRC.o = $(LIBSRC.c:%.c=%.o) $(LIBSRC.cpp:%.cpp=%.o) 172 173lib : $(LIBNAME) ; 174 175$(LIBSRC.o) : $(LIBSRC.h) 176 177define ARCHIVE_RECIPE_WIN32FE_LIB 178 @$(RM) $@ $@.args 179 @cygpath -w $^ > $@.args 180 $(AR) $(AR_FLAGS) $@ @$@.args 181 @$(RM) $@.args 182endef 183 184define ARCHIVE_RECIPE_DEFAULT 185 @$(RM) $@ 186 $(AR) $(AR_FLAGS) $@ $^ 187 $(RANLIB) $@ 188endef 189 190$(LIBNAME) : $(LIBSRC.o) 191 $(if $(findstring win32fe lib,$(AR)),$(ARCHIVE_RECIPE_WIN32FE_LIB),$(ARCHIVE_RECIPE_DEFAULT)) 192 193COMPILE.c = $(CC) $(CC_FLAGS) $(FLAGS) $(CPPFLAGS) $(EGADSFLAGS) $(TARGET_ARCH) -c 194COMPILE.cpp = $(CXX) $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(EGADSFLAGS) $(TARGET_ARCH) -c 195 196# This is unusual; usually prefix would default to /usr/local 197prefix ?= $(PETSC_DIR)/$(PETSC_ARCH) 198libdir = $(prefix)/lib 199includedir = $(prefix)/include 200INSTALL = install 201INSTALL_DATA = $(INSTALL) -m644 202MKDIR_P = mkdir -p 203 204install-egads: $(LIBNAME) 205 $(MKDIR_P) "$(DESTDIR)$(includedir)" "$(DESTDIR)$(libdir)" 206 $(INSTALL_DATA) $(LIBSRC.h) "$(DESTDIR)$(includedir)/" 207 $(INSTALL_DATA) $(LIBNAME) "$(DESTDIR)$(libdir)/" 208 209clean: 210 $(RM) $(LIBNAME) $(LIBSRC.o) 211 212.PHONY: lib clean install-egads 213 ''') 214 g.close() 215 return 216 217 # the install is delayed until postProcess() since egads install requires PETSc to have created its build/makefiles before installing 218 # note that egads can (and is) built before PETSc is built. 219 def Install(self): 220 self.createEGADSMakefile() 221 self.createEGADSLiteMakefile() 222 return self.installDir 223 224 def configureLibrary(self): 225 ''' Since egads cannot be built until after PETSc configure is complete we need to just assume the downloaded library will work''' 226 if 'with-egads' in self.framework.clArgDB: 227 raise RuntimeError('egads does not support --with-egads; only --download-egads') 228 if 'with-egads-dir' in self.framework.clArgDB: 229 self.egadsDir = self.framework.argDB['with-egads-dir'] 230 if 'with-egads-shared' in self.framework.clArgDB: 231 raise RuntimeError('egads does not support --with-egads-shared') 232 233 self.hasegads = self.framework.argDB['egads-full'] 234 if self.hasegads and not self.oce.found: 235 raise RuntimeError('egads requires open cascade if doing a full install\nReconfigure using --download-opencascade') 236 237 if not hasattr(self,'egadsDir'): 238 self.checkDownload() 239 self.egadsDir = self.installDir 240 self.include = [os.path.join(self.egadsDir,'include')] 241 self.lib = [] 242 if self.hasegadslite: self.lib.append(os.path.join(self.egadsDir,'lib','libegadslite.a')) 243 if self.hasegads: self.lib.append(os.path.join(self.egadsDir,'lib','libegads.a')) 244 self.found = 1 245 self.dlib = self.lib 246 if not hasattr(self.framework, 'packages'): 247 self.framework.packages = [] 248 self.framework.packages.append(self) 249 250 def buildEGADS(self): 251 self.logPrintBox('Compiling egads; this may take several minutes') 252 # uses the regular PETSc library builder and then moves result 253 # turn off any compiler optimizations as they may break egads 254 self.pushLanguage('C') 255 cflags = self.checkNoOptFlag()+' '+self.getSharedFlag(self.getCompilerFlags())+' '+self.getPointerSizeFlag(self.getCompilerFlags())+' '+self.getWindowsNonOptFlags(self.getCompilerFlags())+' '+self.getDebugFlags(self.getCompilerFlags()) 256 self.popLanguage() 257 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) 258 self.log.write(output+err) 259 self.logPrintBox('Installing egads; this may take several minutes') 260 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) 261 self.log.write(output+err) 262 return 263 264 def buildEGADSLite(self): 265 self.logPrintBox('Compiling egads lite; this may take several minutes') 266 # uses the regular PETSc library builder and then moves result 267 # turn off any compiler optimizations as they may break egads 268 self.pushLanguage('C') 269 cflags = self.checkNoOptFlag()+' '+self.getSharedFlag(self.getCompilerFlags())+' '+self.getPointerSizeFlag(self.getCompilerFlags())+' '+self.getWindowsNonOptFlags(self.getCompilerFlags())+' '+self.getDebugFlags(self.getCompilerFlags()) 270 self.popLanguage() 271 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) 272 self.log.write(output+err) 273 self.logPrintBox('Installing egads lite; this may take several minutes') 274 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) 275 self.log.write(output+err) 276 return 277 278 def postProcess(self): 279 if not hasattr(self,'installDir'): 280 return 281 try: 282 self.buildEGADSLite() 283 except RuntimeError as e: 284 raise RuntimeError('Error running make on egads lite: '+str(e)) 285 try: 286 self.buildEGADS() 287 except RuntimeError as e: 288 raise RuntimeError('Error running make on egads: '+str(e)) 289