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