xref: /petsc/config/PETSc/Configure.py (revision 4e269d778a4980f937dbf53e8c867b2c3b45d02b)
1import config.base
2
3import os
4import re
5
6# The sorted() builtin is not available with python-2.3
7try: sorted
8except NameError:
9  def sorted(lst):
10    lst.sort()
11    return lst
12
13class Configure(config.base.Configure):
14  def __init__(self, framework):
15    config.base.Configure.__init__(self, framework)
16    self.headerPrefix = 'PETSC'
17    self.substPrefix  = 'PETSC'
18    return
19
20  def __str2__(self):
21    desc = []
22    desc.append('xxx=========================================================================xxx')
23    if self.getMakeMacro('PETSC_BUILD_USING_CMAKE'):
24      build_type = 'cmake build'
25    else:
26      build_type = 'legacy build'
27    desc.append(' Configure stage complete. Now build PETSc libraries with (%s):' % build_type)
28    desc.append('   make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all')
29    desc.append(' or (experimental with python):')
30    desc.append('   PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' ./config/builder.py')
31    desc.append('xxx=========================================================================xxx')
32    return '\n'.join(desc)+'\n'
33
34  def setupHelp(self, help):
35    import nargs
36    help.addArgument('PETSc',  '-prefix=<dir>',                  nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)'))
37    help.addArgument('Windows','-with-windows-graphics=<bool>',   nargs.ArgBool(None, 1,'Enable check for Windows Graphics'))
38    help.addArgument('PETSc', '-with-default-arch=<bool>',        nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH'))
39    help.addArgument('PETSc','-with-single-library=<bool>',       nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library'))
40    help.addArgument('PETSc', '-with-iphone=<bool>',              nargs.ArgBool(None, 0, 'Build an iPhone version of PETSc'))
41    return
42
43  def setupDependencies(self, framework):
44    config.base.Configure.setupDependencies(self, framework)
45    self.setCompilers  = framework.require('config.setCompilers',      self)
46    self.arch          = framework.require('PETSc.utilities.arch',     self.setCompilers)
47    self.petscdir      = framework.require('PETSc.utilities.petscdir', self.setCompilers)
48    self.languages     = framework.require('PETSc.utilities.languages',self.setCompilers)
49    self.debugging     = framework.require('PETSc.utilities.debugging',self.setCompilers)
50    self.CHUD          = framework.require('PETSc.utilities.CHUD',     self)
51    self.compilers     = framework.require('config.compilers',         self)
52    self.types         = framework.require('config.types',             self)
53    self.headers       = framework.require('config.headers',           self)
54    self.functions     = framework.require('config.functions',         self)
55    self.libraries     = framework.require('config.libraries',         self)
56    if os.path.isdir(os.path.join('config', 'PETSc')):
57      for d in ['utilities', 'packages']:
58        for utility in os.listdir(os.path.join('config', 'PETSc', d)):
59          (utilityName, ext) = os.path.splitext(utility)
60          if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__':
61            utilityObj                    = self.framework.require('PETSc.'+d+'.'+utilityName, self)
62            utilityObj.headerPrefix       = self.headerPrefix
63            utilityObj.archProvider       = self.arch
64            utilityObj.languageProvider   = self.languages
65            utilityObj.installDirProvider = self.petscdir
66            setattr(self, utilityName.lower(), utilityObj)
67
68    for package in config.packages.all:
69      if not package == 'PETSc':
70        packageObj                    = framework.require('config.packages.'+package, self)
71        packageObj.archProvider       = self.arch
72        packageObj.languageProvider   = self.languages
73        packageObj.installDirProvider = self.petscdir
74        setattr(self, package.lower(), packageObj)
75    # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built
76    framework.require('PETSc.utilities.scalarTypes', self.f2cblaslapack)
77    self.f2cblaslapack.precisionProvider = self.scalartypes
78    framework.require('PETSc.utilities.scalarTypes', self.blaslapack)
79    self.blaslapack.precisionProvider = self.scalartypes
80
81    self.compilers.headerPrefix  = self.headerPrefix
82    self.types.headerPrefix      = self.headerPrefix
83    self.headers.headerPrefix    = self.headerPrefix
84    self.functions.headerPrefix  = self.headerPrefix
85    self.libraries.headerPrefix  = self.headerPrefix
86    self.blaslapack.headerPrefix = self.headerPrefix
87    self.mpi.headerPrefix        = self.headerPrefix
88    headersC = map(lambda name: name+'.h', ['dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings',
89                                            'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource',
90                                            'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory',
91                                            'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types',
92                                            'WindowsX', 'cxxabi','float','ieeefp','stdint','fenv','sched','pthread'])
93    functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid',
94                 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize',
95                 'readlink', 'realpath',  'sigaction', 'signal', 'sigset', 'usleep', 'sleep', '_sleep', 'socket',
96                 'times', 'gethostbyname', 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp',
97                 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror',
98                 '_intel_fast_memcpy','_intel_fast_memset']
99    libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')]
100    self.headers.headers.extend(headersC)
101    self.functions.functions.extend(functions)
102    self.libraries.libraries.extend(libraries1)
103
104    return
105
106  def Dump(self):
107    ''' Actually put the values into the configuration files '''
108    # eventually everything between -- should be gone
109#-----------------------------------------------------------------------------------------------------
110
111    # Sometimes we need C compiler, even if built with C++
112    self.setCompilers.pushLanguage('C')
113    self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags())
114    self.setCompilers.popLanguage()
115
116    # C preprocessor values
117    self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS)
118
119    # compiler values
120    self.setCompilers.pushLanguage(self.languages.clanguage)
121    self.addMakeMacro('PCC',self.setCompilers.getCompiler())
122    self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags())
123    self.setCompilers.popLanguage()
124    # .o or .obj
125    self.addMakeMacro('CC_SUFFIX','o')
126
127    # executable linker values
128    self.setCompilers.pushLanguage(self.languages.clanguage)
129    pcc_linker = self.setCompilers.getLinker()
130    self.addMakeMacro('PCC_LINKER',pcc_linker)
131    self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags())
132    self.setCompilers.popLanguage()
133    # '' for Unix, .exe for Windows
134    self.addMakeMacro('CC_LINKER_SUFFIX','')
135
136    if hasattr(self.compilers, 'FC'):
137      self.setCompilers.pushLanguage('FC')
138      # need FPPFLAGS in config/setCompilers
139      self.addDefine('HAVE_FORTRAN','1')
140      self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS)
141
142      # compiler values
143      self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags())
144      self.setCompilers.popLanguage()
145      # .o or .obj
146      self.addMakeMacro('FC_SUFFIX','o')
147
148      # executable linker values
149      self.setCompilers.pushLanguage('FC')
150      # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker
151      fc_linker = self.setCompilers.getLinker()
152      if config.setCompilers.Configure.isNAG(fc_linker):
153        self.addMakeMacro('FC_LINKER',pcc_linker)
154      else:
155        self.addMakeMacro('FC_LINKER',fc_linker)
156      self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags())
157      # apple requires this shared library linker flag on SOME versions of the os
158      if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1:
159        self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ')
160      self.setCompilers.popLanguage()
161
162      # F90 Modules
163      if self.setCompilers.fortranModuleIncludeFlag:
164        self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag)
165      else: # for non-f90 compilers like g77
166        self.addMakeMacro('FC_MODULE_FLAG', '-I')
167      if self.setCompilers.fortranModuleIncludeFlag:
168        self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag)
169    else:
170      self.addMakeMacro('FC','')
171
172    if hasattr(self.compilers, 'CUDAC'):
173      self.setCompilers.pushLanguage('CUDA')
174      self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags())
175      self.setCompilers.popLanguage()
176
177    # shared library linker values
178    self.setCompilers.pushLanguage(self.languages.clanguage)
179    # need to fix BuildSystem to collect these separately
180    self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker())
181    self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}')
182    self.setCompilers.popLanguage()
183    # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture
184    # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX
185    if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX:
186      self.addMakeMacro('SL_LINKER_SUFFIX', '')
187      self.addDefine('SLSUFFIX','""')
188    else:
189      self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt)
190      self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"')
191
192    self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}')
193
194#-----------------------------------------------------------------------------------------------------
195
196    # CONLY or CPP. We should change the PETSc makefiles to do this better
197    if self.languages.clanguage == 'C': lang = 'CONLY'
198    else: lang = 'CXXONLY'
199    self.addMakeMacro('PETSC_LANGUAGE',lang)
200
201    # real or complex
202    self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype)
203    # double or float
204    self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision)
205
206    if self.framework.argDB['with-batch']:
207      self.addMakeMacro('PETSC_WITH_BATCH','1')
208
209    # Test for compiler-specific macros that need to be defined.
210    if self.setCompilers.isCrayVector('CC'):
211      self.addDefine('HAVE_CRAY_VECTOR','1')
212
213#-----------------------------------------------------------------------------------------------------
214    if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'):
215      self.addDefine('USE_SOCKET_VIEWER','1')
216      if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'):
217        self.addDefine('HAVE_SO_REUSEADDR','1')
218
219#-----------------------------------------------------------------------------------------------------
220    # print include and lib for makefiles
221    self.framework.packages.reverse()
222    includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')]
223    libs = []
224    for i in self.framework.packages:
225      if i.useddirectly:
226        self.addDefine('HAVE_'+i.PACKAGE, 1)  # ONLY list package if it is used directly by PETSc (and not only by another package)
227      if not isinstance(i.lib, list):
228        i.lib = [i.lib]
229      libs.extend(i.lib)
230      self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib))
231      if hasattr(i,'include'):
232        if not isinstance(i.include,list):
233          i.include = [i.include]
234        if not i.PACKAGE.lower() == 'valgrind':
235          includes.extend(i.include)
236        self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include))
237    if self.framework.argDB['with-single-library']:
238      self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.libraries.toStringNoDupes(['-L'+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),' -lpetsc']+libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS)
239    self.addMakeMacro('PETSC_EXTERNAL_LIB_BASIC',self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS)
240    self.PETSC_EXTERNAL_LIB_BASIC = self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS
241    self.addMakeMacro('PETSC_CC_INCLUDES',self.headers.toStringNoDupes(includes))
242    self.PETSC_CC_INCLUDES = self.headers.toStringNoDupes(includes)
243    if hasattr(self.compilers, 'FC'):
244      if self.compilers.fortranIsF90:
245        self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes))
246      else:
247        self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes))
248
249    self.addMakeMacro('DESTDIR',self.installdir)
250    self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"')
251
252    if self.framework.argDB['with-single-library']:
253      # overrides the values set in conf/variables
254      self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}')
255      self.addMakeMacro('SHLIBS','libpetsc')
256      self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc')
257      self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc')
258      self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc')
259      self.addDefine('USE_SINGLE_LIBRARY', '1')
260      if self.sharedlibraries.useShared:
261        self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
262        self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
263        self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
264        self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
265        self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
266        self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
267        self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
268        self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
269        self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
270        self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
271      else:
272        self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}')
273        self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}')
274        self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}')
275        self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}')
276        self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}')
277        self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}')
278        self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}')
279        self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}')
280        self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}')
281        self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}')
282
283    if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')):
284      os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib'))
285
286    # add a makefile entry for configure options
287    self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"'))
288    return
289
290  def dumpConfigInfo(self):
291    import time
292    fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w')
293    fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n')
294    fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n')
295    fd.close()
296    return
297
298  def dumpMachineInfo(self):
299    import platform
300    import time
301    import script
302    fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w')
303    fd.write('static const char *petscmachineinfo = \"\\n\"\n')
304    fd.write('\"-----------------------------------------\\n\"\n')
305    fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node()))
306    fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform()))
307    fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir))
308    fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch))
309    fd.write('\"-----------------------------------------\\n\";\n')
310    fd.write('static const char *petsccompilerinfo = \"\\n\"\n')
311    self.setCompilers.pushLanguage(self.languages.clanguage)
312    fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags()))
313    self.setCompilers.popLanguage()
314    if hasattr(self.compilers, 'FC'):
315      self.setCompilers.pushLanguage('FC')
316      fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS))
317      self.setCompilers.popLanguage()
318    fd.write('\"-----------------------------------------\\n\";\n')
319    fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n')
320    fd.write('\"Using include paths: %s %s %s\\n\"\n' % ('-I'+os.path.join(self.petscdir.dir, self.arch.arch, 'include'), '-I'+os.path.join(self.petscdir.dir, 'include'), self.PETSC_CC_INCLUDES.replace('\\ ','\\\\ ')))
321    fd.write('\"-----------------------------------------\\n\";\n')
322    fd.write('static const char *petsclinkerinfo = \"\\n\"\n')
323    self.setCompilers.pushLanguage(self.languages.clanguage)
324    fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker()))
325    self.setCompilers.popLanguage()
326    if hasattr(self.compilers, 'FC'):
327      self.setCompilers.pushLanguage('FC')
328      fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker()))
329      self.setCompilers.popLanguage()
330    if self.framework.argDB['with-single-library']:
331      petsclib = '-lpetsc'
332    else:
333      petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys'
334    fd.write('\"Using libraries: %s%s -L%s %s %s\\n\"\n' % (self.setCompilers.CSharedLinkerFlag, os.path.join(self.petscdir.dir, self.arch.arch, 'lib'), os.path.join(self.petscdir.dir, self.arch.arch, 'lib'), petsclib, self.PETSC_EXTERNAL_LIB_BASIC.replace('\\ ','\\\\ ')))
335    fd.write('\"-----------------------------------------\\n\";\n')
336    fd.close()
337    return
338
339  def dumpCMakeConfig(self):
340    '''
341    Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake.
342    This file is private to PETSc and should not be included by third parties
343    (a suitable file can be produced later by CMake, but this is not it).
344    '''
345    def cmakeset(fd,key,val=True):
346      if val == True: val = 'YES'
347      if val == False: val = 'NO'
348      fd.write('set (' + key + ' ' + val + ')\n')
349    def ensurelist(a):
350      if isinstance(a,list):
351        return a
352      else:
353        return [a]
354    def libpath(lib):
355      'Returns a search path if that is what this item provides, else "" which will be cleaned out later'
356      if not isinstance(lib,str): return ''
357      if lib.startswith('-L'): return lib[2:]
358      if lib.startswith('-R'): return lib[2:]
359      if lib.startswith('-Wl,-rpath,'):
360        # This case occurs when an external package needs a specific system library that is normally provided by the compiler.
361        # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the
362        # corresponding library.
363        return lib[len('-Wl,-rpath,'):]
364      if lib.startswith('-'): return ''
365      return os.path.dirname(lib)
366    def cleanlib(lib):
367      'Returns a library name if that is what this item provides, else "" which will be cleaned out later'
368      if not isinstance(lib,str): return ''
369      if lib.startswith('-l'):  return lib[2:]
370      if lib.startswith('-Wl') or lib.startswith('-L'): return ''
371      lib = os.path.splitext(os.path.basename(lib))[0]
372      if lib.startswith('lib'): return lib[3:]
373      return lib
374    def nub(lst):
375      'Return a list containing the first occurrence of each unique element'
376      unique = []
377      for elem in lst:
378        if elem not in unique and elem != '':
379          unique.append(elem)
380      return unique
381    try: reversed # reversed was added in Python-2.4
382    except NameError:
383      def reversed(lst): return lst[::-1]
384    def nublast(lst):
385      'Return a list containing the last occurrence of each unique entry in a list'
386      return reversed(nub(reversed(lst)))
387    def cmakeexpand(varname):
388      return r'"${' + varname + r'}"'
389    def uniqextend(lst,new):
390      for x in ensurelist(new):
391        if x not in lst:
392          lst.append(x)
393    def notstandardinclude(path):
394      return path not in '/usr/include'.split() # /usr/local/include is not automatically included on FreeBSD
395    def writeMacroDefinitions(fd):
396      if self.mpi.usingMPIUni:
397        cmakeset(fd,'PETSC_HAVE_MPIUNI')
398      for pkg in self.framework.packages:
399        if pkg.useddirectly:
400          cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE)
401        for pair in pkg.defines.items():
402          if pair[0].startswith('HAVE_') and pair[1]:
403            cmakeset(fd, self.framework.getFullDefineName(pkg, pair[0]), pair[1])
404      for name,val in self.functions.defines.items():
405        cmakeset(fd,'PETSC_'+name,val)
406      for dct in [self.defines, self.libraryoptions.defines]:
407        for k,v in dct.items():
408          if k.startswith('USE_'):
409            cmakeset(fd,'PETSC_' + k, v)
410      cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex')
411      cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper())
412      cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage)
413      if hasattr(self.compilers, 'FC'):
414        cmakeset(fd,'PETSC_HAVE_FORTRAN')
415        if self.compilers.fortranIsF90:
416          cmakeset(fd,'PETSC_USING_F90')
417        if self.compilers.fortranIsF2003:
418          cmakeset(fd,'PETSC_USING_F2003')
419      if self.sharedlibraries.useShared:
420        cmakeset(fd,'BUILD_SHARED_LIBS')
421    def writeBuildFlags(fd):
422      def extendby(lib):
423        libs = ensurelist(lib)
424        lib_paths.extend(map(libpath,libs))
425        lib_libs.extend(map(cleanlib,libs))
426      lib_paths = []
427      lib_libs  = []
428      includes  = []
429      libvars   = []
430      for pkg in self.framework.packages:
431        extendby(pkg.lib)
432        uniqextend(includes,pkg.include)
433      extendby(self.libraries.math)
434      extendby(self.libraries.rt)
435      extendby(self.compilers.flibs)
436      extendby(self.compilers.cxxlibs)
437      extendby(self.compilers.LIBS.split())
438      for libname in nublast(lib_libs):
439        libvar = 'PETSC_' + libname.upper() + '_LIB'
440        addpath = ''
441        for lpath in nublast(lib_paths):
442          addpath += '"' + str(lpath) + '" '
443        fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n')
444        libvars.append(libvar)
445      fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n')
446      fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n')
447      includes = filter(notstandardinclude,includes)
448      fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',includes)) + ')\n')
449    fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w')
450    writeMacroDefinitions(fd)
451    writeBuildFlags(fd)
452    fd.close()
453    return
454
455  def dumpCMakeLists(self):
456    import sys
457    if sys.version_info >= (2,5):
458      import cmakegen
459      try:
460        cmakegen.main(self.petscdir.dir, log=self.framework.log)
461      except (OSError), e:
462        self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e))
463    else:
464      self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) )
465
466  def cmakeBoot(self):
467    import sys
468    self.cmakeboot_success = False
469    if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'):
470      try:
471        import cmakeboot
472        self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log)
473      except (OSError), e:
474        self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e))
475      except (ImportError, KeyError), e:
476        self.framework.logPrint('Importing cmakeboot failed:\n' + str(e))
477      if self.cmakeboot_success:
478        if self.framework.argDB['with-cuda']: # Our CMake build does not support CUDA at this time
479          self.framework.logPrint('CMake configured successfully, but could not be used by default because --with-cuda was used\n')
480        elif hasattr(self.compilers, 'FC') and self.compilers.fortranIsF90 and not self.setCompilers.fortranModuleOutputFlag:
481          self.framework.logPrint('CMake configured successfully, but could not be used by default because of missing fortranModuleOutputFlag\n')
482        else:
483          self.framework.logPrint('CMake configured successfully, using as default build\n')
484          self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1)
485      else:
486        self.framework.logPrint('CMake configuration was unsuccessful\n')
487    else:
488      self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) )
489    return
490
491  def configurePrefetch(self):
492    '''Sees if there are any prefetch functions supported'''
493    if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-iphone']:
494      self.addDefine('Prefetch(a,b,c)', ' ')
495      return
496    self.pushLanguage(self.languages.clanguage)
497    if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'):
498      # The Intel Intrinsics manual [1] specifies the prototype
499      #
500      #   void _mm_prefetch(char const *a, int sel);
501      #
502      # but other vendors seem to insist on using subtly different
503      # prototypes, including void* for the pointer, and an enum for
504      # sel.  These are both reasonable changes, but negatively impact
505      # portability.
506      #
507      # [1] http://software.intel.com/file/6373
508      self.addDefine('HAVE_XMMINTRIN_H', 1)
509      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))')
510      self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA')
511      self.addDefine('PREFETCH_HINT_T0',  '_MM_HINT_T0')
512      self.addDefine('PREFETCH_HINT_T1',  '_MM_HINT_T1')
513      self.addDefine('PREFETCH_HINT_T2',  '_MM_HINT_T2')
514    elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'):
515      self.addDefine('HAVE_XMMINTRIN_H', 1)
516      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))')
517      self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA')
518      self.addDefine('PREFETCH_HINT_T0',  '_MM_HINT_T0')
519      self.addDefine('PREFETCH_HINT_T1',  '_MM_HINT_T1')
520      self.addDefine('PREFETCH_HINT_T2',  '_MM_HINT_T2')
521    elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'):
522      # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality)
523      #
524      #   The value of rw is a compile-time constant one or zero; one
525      #   means that the prefetch is preparing for a write to the memory
526      #   address and zero, the default, means that the prefetch is
527      #   preparing for a read. The value locality must be a compile-time
528      #   constant integer between zero and three. A value of zero means
529      #   that the data has no temporal locality, so it need not be left
530      #   in the cache after the access. A value of three means that the
531      #   data has a high degree of temporal locality and should be left
532      #   in all levels of cache possible. Values of one and two mean,
533      #   respectively, a low or moderate degree of temporal locality.
534      #
535      # Here we adopt Intel's x86/x86-64 naming scheme for the locality
536      # hints.  Using macros for these values in necessary since some
537      # compilers require an enum.
538      self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))')
539      self.addDefine('PREFETCH_HINT_NTA', '0')
540      self.addDefine('PREFETCH_HINT_T0',  '3')
541      self.addDefine('PREFETCH_HINT_T1',  '2')
542      self.addDefine('PREFETCH_HINT_T2',  '1')
543    else:
544      self.addDefine('Prefetch(a,b,c)', ' ')
545    self.popLanguage()
546
547  def configureFeatureTestMacros(self):
548    '''Checks if certain feature test macros are support'''
549    if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <sysctl.h>',''):
550       self.addDefine('_POSIX_C_SOURCE_200112L', '1')
551    if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''):
552       self.addDefine('_BSD_SOURCE', '1')
553    if self.checkCompile('#define _GNU_SOURCE\n#include <sched.h>','cpu_set_t mset;\nCPU_ZERO(&mset);'):
554       self.addDefine('_GNU_SOURCE', '1')
555
556  def configureAtoll(self):
557    '''Checks if atoll exists'''
558    if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <stdlib.h>','long v = atoll("25")') or self.checkCompile ('#include <stdlib.h>','long v = atoll("25")'):
559       self.addDefine('HAVE_ATOLL', '1')
560
561  def configureUnused(self):
562    '''Sees if __attribute((unused)) is supported'''
563    if self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']:
564      self.addDefine('UNUSED', ' ')
565      return
566    self.pushLanguage(self.languages.clanguage)
567    if self.checkLink('__attribute((unused)) static int myfunc(void){ return 1;}', 'int i = myfunc();\ntypedef void* atype;\n__attribute((unused))  atype a;\n'):
568      self.addDefine('UNUSED', '__attribute((unused))')
569    else:
570      self.addDefine('UNUSED', ' ')
571    self.popLanguage()
572
573  def configureExpect(self):
574    '''Sees if the __builtin_expect directive is supported'''
575    self.pushLanguage(self.languages.clanguage)
576    if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'):
577      self.addDefine('HAVE_BUILTIN_EXPECT', 1)
578    self.popLanguage()
579
580  def configureFunctionName(self):
581    '''Sees if the compiler supports __func__ or a variant.  Falls back
582    on __FUNCT__ which PETSc source defines, but most users do not, thus
583    stack traces through user code are better when the compiler's
584    variant is used.'''
585    def getFunctionName(lang):
586      name = '__FUNCT__'
587      self.pushLanguage(lang)
588      if self.checkLink('', "if (__func__[0] != 'm') return 1;"):
589        name = '__func__'
590      elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"):
591        name = '__FUNCTION__'
592      self.popLanguage()
593      return name
594    langs = []
595
596    self.addDefine('FUNCTION_NAME_C', getFunctionName('C'))
597    if hasattr(self.compilers, 'CXX'):
598      self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx'))
599    else:
600      self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__')
601
602  def configureIntptrt(self):
603    '''Determine what to use for uintptr_t'''
604    def staticAssertSizeMatchesVoidStar(inc,typename):
605      # The declaration is an error if either array size is negative.
606      # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case
607      return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n'
608                                     + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename))
609    self.pushLanguage(self.languages.clanguage)
610    if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'):
611      self.addDefine('UINTPTR_T', 'uintptr_t')
612    elif staticAssertSizeMatchesVoidStar('','unsigned long long'):
613      self.addDefine('UINTPTR_T', 'unsigned long long')
614    elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'):
615      self.addDefine('UINTPTR_T', 'size_t')
616    elif staticAssertSizeMatchesVoidStar('','unsigned long'):
617      self.addDefine('UINTPTR_T', 'unsigned long')
618    elif staticAssertSizeMatchesVoidStar('','unsigned'):
619      self.addDefine('UINTPTR_T', 'unsigned')
620    else:
621      raise RuntimeError('Could not find any unsigned integer type matching void*')
622    self.popLanguage()
623
624  def configureInline(self):
625    '''Get a generic inline keyword, depending on the language'''
626    if self.languages.clanguage == 'C':
627      self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword)
628      self.addDefine('RESTRICT', self.compilers.cRestrict)
629    elif self.languages.clanguage == 'Cxx':
630      self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword)
631      self.addDefine('RESTRICT', self.compilers.cxxRestrict)
632
633    if self.checkCompile('#include <dlfcn.h>\n void *ptr =  RTLD_DEFAULT;'):
634      self.addDefine('RTLD_DEFAULT','1')
635    return
636
637  def configureSolaris(self):
638    '''Solaris specific stuff'''
639    if os.path.isdir(os.path.join('/usr','ucblib')):
640      try:
641        flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag')
642      except AttributeError:
643        flag = None
644      if flag is None:
645        self.compilers.LIBS += ' -L/usr/ucblib'
646      else:
647        self.compilers.LIBS += ' '+flag+'/usr/ucblib'
648    return
649
650  def configureLinux(self):
651    '''Linux specific stuff'''
652    # TODO: Test for this by mallocing an odd number of floats and checking the address
653    self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1)
654    return
655
656  def configureWin32(self):
657    '''Win32 non-cygwin specific stuff'''
658    kernel32=0
659    if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
660      self.addDefine('HAVE_WINDOWS_H',1)
661      self.addDefine('HAVE_GETCOMPUTERNAME',1)
662      kernel32=1
663    elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
664      self.addDefine('HAVE_WINDOWS_H',1)
665      self.addDefine('HAVE_GETCOMPUTERNAME',1)
666      kernel32=1
667    if kernel32:
668      if self.framework.argDB['with-windows-graphics']:
669        self.addDefine('USE_WINDOWS_GRAPHICS',1)
670      if self.checkLink('#include <Windows.h>','LoadLibrary(0)'):
671        self.addDefine('HAVE_LOADLIBRARY',1)
672      if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'):
673        self.addDefine('HAVE_GETPROCADDRESS',1)
674      if self.checkLink('#include <Windows.h>','FreeLibrary(0)'):
675        self.addDefine('HAVE_FREELIBRARY',1)
676      if self.checkLink('#include <Windows.h>','GetLastError()'):
677        self.addDefine('HAVE_GETLASTERROR',1)
678      if self.checkLink('#include <Windows.h>','SetLastError(0)'):
679        self.addDefine('HAVE_SETLASTERROR',1)
680      if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'):
681        self.addDefine('USE_NT_TIME',1)
682    if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
683      self.addDefine('HAVE_GET_USER_NAME',1)
684    elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
685      self.addDefine('HAVE_GET_USER_NAME',1)
686
687    if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'):
688      self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);')
689    if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'):
690      self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);')
691
692    self.types.check('int32_t', 'int')
693    if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'):
694      self.addTypedef('int', 'uid_t')
695      self.addTypedef('int', 'gid_t')
696    if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'):
697      self.framework.addDefine('R_OK', '04')
698      self.framework.addDefine('W_OK', '02')
699      self.framework.addDefine('X_OK', '01')
700    if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'):
701      self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)')
702      self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)')
703    if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'):
704      self.addDefine('HAVE_LARGE_INTEGER_U',1)
705
706    # Windows requires a Binary file creation flag when creating/opening binary files.  Is a better test in order?
707    if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'):
708      self.addDefine('HAVE_O_BINARY',1)
709
710    if self.compilers.CC.find('win32fe') >= 0:
711      self.addDefine('PATH_SEPARATOR','\';\'')
712      self.addDefine('DIR_SEPARATOR','\'\\\\\'')
713      self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'')
714      self.addDefine('CANNOT_START_DEBUGGER',1)
715    else:
716      self.addDefine('PATH_SEPARATOR','\':\'')
717      self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'')
718      self.addDefine('DIR_SEPARATOR','\'/\'')
719
720    return
721
722#-----------------------------------------------------------------------------------------------------
723  def configureDefaultArch(self):
724    conffile = os.path.join('conf', 'petscvariables')
725    if self.framework.argDB['with-default-arch']:
726      fd = file(conffile, 'w')
727      fd.write('PETSC_ARCH='+self.arch.arch+'\n')
728      fd.write('PETSC_DIR='+self.petscdir.dir+'\n')
729      fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n')
730      fd.close()
731      self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile)
732    elif os.path.isfile(conffile):
733      try:
734        os.unlink(conffile)
735      except:
736        raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?')
737    return
738
739#-----------------------------------------------------------------------------------------------------
740  def configureScript(self):
741    '''Output a script in the conf directory which will reproduce the configuration'''
742    import nargs
743    import sys
744    scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py')
745    args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs])
746    if 'configModules' in args:
747      if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure':
748        del args['configModules']
749    if 'optionsModule' in args:
750      if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions':
751        del args['optionsModule']
752    if not 'PETSC_ARCH' in args:
753      args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch)
754    f = file(scriptName, 'w')
755    f.write('#!'+sys.executable+'\n')
756    f.write('if __name__ == \'__main__\':\n')
757    f.write('  import sys\n')
758    f.write('  import os\n')
759    f.write('  sys.path.insert(0, os.path.abspath(\'config\'))\n')
760    f.write('  import configure\n')
761    # pretty print repr(args.values())
762    f.write('  configure_options = [\n')
763    for itm in sorted(args.values()):
764      f.write('    \''+str(itm)+'\',\n')
765    f.write('  ]\n')
766    f.write('  configure.petsc_configure(configure_options)\n')
767    f.close()
768    try:
769      os.chmod(scriptName, 0775)
770    except OSError, e:
771      self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e))
772    self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration')
773    return
774
775  def configureInstall(self):
776    '''Setup the directories for installation'''
777    if self.framework.argDB['prefix']:
778      self.installdir = self.framework.argDB['prefix']
779      self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\
780                                              '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\
781                                              '-@echo "========================================="'])
782    else:
783      self.installdir = os.path.join(self.petscdir.dir,self.arch.arch)
784      self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\
785                                              '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\
786                                              '-@echo "========================================="'])
787      return
788
789  def configureGCOV(self):
790    if self.framework.argDB['with-gcov']:
791      self.addDefine('USE_GCOV','1')
792    return
793
794  def configureFortranFlush(self):
795    if hasattr(self.compilers, 'FC'):
796      for baseName in ['flush','flush_']:
797        if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1):
798          self.addDefine('HAVE_'+baseName.upper(), 1)
799          return
800
801  def postProcessPackages(self):
802    postPackages=[]
803    for i in self.framework.packages:
804      if hasattr(i,'postProcess'): postPackages.append(i)
805    if postPackages:
806      # prometheus needs petsc conf files. so attempt to create them early
807      self.framework.dumpConfFiles()
808      for i in postPackages: i.postProcess()
809    return
810
811  def configure(self):
812    if not os.path.samefile(self.petscdir.dir, os.getcwd()):
813      raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n  Configure invoked in: '+os.path.realpath(os.getcwd()))
814    if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir):
815      raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!')
816    if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],os.path.join(self.petscdir.dir,self.arch.arch)):
817      raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!')
818    self.framework.header          = os.path.join(self.arch.arch,'include','petscconf.h')
819    self.framework.cHeader         = os.path.join(self.arch.arch,'include','petscfix.h')
820    self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables')
821    self.framework.makeRuleHeader  = os.path.join(self.arch.arch,'conf','petscrules')
822    if self.libraries.math is None:
823      raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.')
824    if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'):
825      raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.')
826    self.executeTest(self.configureInline)
827    self.executeTest(self.configurePrefetch)
828    self.executeTest(self.configureUnused)
829    self.executeTest(self.configureExpect);
830    self.executeTest(self.configureFunctionName);
831    self.executeTest(self.configureIntptrt);
832    self.executeTest(self.configureSolaris)
833    self.executeTest(self.configureLinux)
834    self.executeTest(self.configureWin32)
835    self.executeTest(self.configureDefaultArch)
836    self.executeTest(self.configureScript)
837    self.executeTest(self.configureInstall)
838    self.executeTest(self.configureGCOV)
839    self.executeTest(self.configureFortranFlush)
840    self.executeTest(self.configureFeatureTestMacros)
841    self.executeTest(self.configureAtoll)
842    # dummy rules, always needed except for remote builds
843    self.addMakeRule('remote','')
844    self.addMakeRule('remoteclean','')
845
846    self.Dump()
847    self.dumpConfigInfo()
848    self.dumpMachineInfo()
849    self.postProcessPackages()
850    self.dumpCMakeConfig()
851    self.dumpCMakeLists()
852    self.cmakeBoot()
853    self.framework.log.write('================================================================================\n')
854    self.logClear()
855    return
856