xref: /petsc/config/BuildSystem/config/packages/egads.py (revision da9060c4ebf05b549ae65df4db64c7bee7b2b8a9)
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         = '11501e852fd2b647c0788bc12f7a42ce9e427934'
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    return
13
14  def setupDependencies(self, framework):
15    config.package.GNUPackage.setupDependencies(self, framework)
16    self.pthread = self.framework.require('config.packages.pthread',self)
17    self.deps    = [self.pthread]
18    return
19
20  def createMakefile(self):
21    makeinc = os.path.join(self.packageDir, 'make.inc')
22    g = open(makeinc,'w')
23    g.write('''
24include $(PETSC_DIR)/lib/petsc/conf/variables
25
26CFLAGS     = -DLITE -Iinclude
27
28INCDIR     = include
29SRCDIR     = src
30LIBBASE    = libegadslite
31LIBNAME    = ${LIBBASE}.${AR_LIB_SUFFIX}
32LIBSRC.h   = $(INCDIR)/egads.h $(INCDIR)/egadsErrors.h $(INCDIR)/egadsInternals.h $(INCDIR)/egadsTris.h \
33             $(INCDIR)/egadsTypes.h $(INCDIR)/emp.h $(INCDIR)/liteClasses.h $(INCDIR)/regQuads.h
34LIBSRC.c   = $(SRCDIR)/liteAttrs.c $(SRCDIR)/liteBase.c $(SRCDIR)/liteGeom.c $(SRCDIR)/liteImport.c \
35             $(SRCDIR)/liteMemory.c $(SRCDIR)/liteTopo.c $(SRCDIR)/egadsTess.c $(SRCDIR)/egadsTris.c \
36             $(SRCDIR)/egadsQuads.c $(SRCDIR)/egadsTessInp.c $(SRCDIR)/egadsRobust.c \
37			 		 	 $(SRCDIR)/emp.c $(SRCDIR)/evaluate.c $(SRCDIR)/rational.c $(SRCDIR)/regQuads.c
38LIBSRC.o   = $(LIBSRC.c:%.c=%.o)
39
40lib : $(LIBNAME) ;
41
42$(LIBSRC.o) : $(LIBSRC.h)
43
44define ARCHIVE_RECIPE_WIN32FE_LIB
45  @$(RM) $@ $@.args
46  @cygpath -w $^ > $@.args
47  $(AR) $(AR_FLAGS) $@ @$@.args
48  @$(RM) $@.args
49endef
50
51define ARCHIVE_RECIPE_DEFAULT
52  @$(RM) $@
53  $(AR) $(AR_FLAGS) $@ $^
54  $(RANLIB) $@
55endef
56
57$(LIBNAME) : $(LIBSRC.o)
58	$(if $(findstring win32fe lib,$(AR)),$(ARCHIVE_RECIPE_WIN32FE_LIB),$(ARCHIVE_RECIPE_DEFAULT))
59
60COMPILE.c = $(CC) $(PCC_FLAGS) $(CFLAGS) $(CCPPFLAGS) $(TARGET_ARCH) -c
61
62# This is unusual; usually prefix would default to /usr/local
63prefix ?= $(PETSC_DIR)/$(PETSC_ARCH)
64libdir = $(prefix)/lib
65includedir = $(prefix)/include
66INSTALL = install
67INSTALL_DATA = $(INSTALL) -m644
68MKDIR_P = mkdir -p
69
70install-egads: $(LIBNAME)
71	$(MKDIR_P) "$(DESTDIR)$(includedir)" "$(DESTDIR)$(libdir)"
72	$(INSTALL_DATA) $(LIBSRC.h) "$(DESTDIR)$(includedir)/"
73	$(INSTALL_DATA) $(LIBNAME) "$(DESTDIR)$(libdir)/"
74
75clean:
76	$(RM) $(LIBNAME) $(LIBSRC.o)
77
78.PHONY: lib clean install-egads
79    ''')
80    g.close()
81    return
82
83  # the install is delayed until postProcess() since egads install requires PETSc to have created its build/makefiles before installing
84  # note that egads can (and is) built before PETSc is built.
85  def Install(self):
86    self.createMakefile()
87    return self.installDir
88
89  def configureLibrary(self):
90    ''' Since egads cannot be built until after PETSc configure is complete we need to just assume the downloaded library will work'''
91    if 'with-egads' in self.framework.clArgDB:
92      raise RuntimeError('egads does not support --with-egads; only --download-egads')
93    if 'with-egads-dir' in self.framework.clArgDB:
94      self.egadsDir = self.framework.argDB['with-egads-dir']
95    if 'with-egads-include' in self.framework.clArgDB:
96      raise RuntimeError('egads does not support --with-egads-include; only --download-egads')
97    if 'with-egads-lib' in self.framework.clArgDB:
98      raise RuntimeError('egads does not support --with-egads-lib; only --download-egads')
99    if 'with-egads-shared' in self.framework.clArgDB:
100      raise RuntimeError('egads does not support --with-egads-shared')
101
102    if not hasattr(self,'egadsDir'):
103      self.checkDownload()
104      self.egadsDir = self.installDir
105    self.include = [os.path.join(self.egadsDir,'include')]
106    self.lib     = [os.path.join(self.egadsDir,'lib','libegadslite.a')]
107    self.found   = 1
108    self.dlib    = self.lib
109    if not hasattr(self.framework, 'packages'):
110      self.framework.packages = []
111    self.framework.packages.append(self)
112
113  def postProcess(self):
114    if not hasattr(self,'installDir'):
115      return
116    try:
117      self.logPrintBox('Compiling egads; this may take several minutes')
118      # uses the regular PETSc library builder and then moves result
119      # turn off any compiler optimizations as they may break egads
120      self.pushLanguage('C')
121      cflags = self.checkNoOptFlag()+' '+self.getSharedFlag(self.getCompilerFlags())+' '+self.getPointerSizeFlag(self.getCompilerFlags())+' '+self.getWindowsNonOptFlags(self.getCompilerFlags())+' '+self.getDebugFlags(self.getCompilerFlags())
122      self.popLanguage()
123      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)
124      self.log.write(output+err)
125      self.logPrintBox('Installing egads; this may take several minutes')
126      # TODO: This message should not be printed if egads is install in PETSc arch directory; need self.printSudoPasswordMessage() defined in package.py
127      self.installDirProvider.printSudoPasswordMessage(1)
128      output,err,ret  = config.package.GNUPackage.executeShellCommand(self.installSudo+self.make.make+' -f make.inc PETSC_DIR='+self.petscdir.dir+' prefix='+self.installDir+' install-egads',timeout=1000, log = self.log, cwd=self.packageDir)
129      self.log.write(output+err)
130    except RuntimeError as e:
131      raise RuntimeError('Error running make on egads: '+str(e))
132