xref: /petsc/config/PETSc/Configure.py (revision 5edf65166e22df6feda2ed6bd8a6e348419dee17)
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-ios=<bool>',              nargs.ArgBool(None, 0, 'Build an iPhone/iPad version of PETSc library'))
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    self.atomics       = framework.require('config.atomics',           self)
57    if os.path.isdir(os.path.join('config', 'PETSc')):
58      for d in ['utilities', 'packages']:
59        for utility in os.listdir(os.path.join('config', 'PETSc', d)):
60          (utilityName, ext) = os.path.splitext(utility)
61          if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__':
62            utilityObj                    = self.framework.require('PETSc.'+d+'.'+utilityName, self)
63            utilityObj.headerPrefix       = self.headerPrefix
64            utilityObj.archProvider       = self.arch
65            utilityObj.languageProvider   = self.languages
66            utilityObj.installDirProvider = self.petscdir
67            setattr(self, utilityName.lower(), utilityObj)
68
69    for package in config.packages.all:
70      if not package == 'PETSc':
71        packageObj                    = framework.require('config.packages.'+package, self)
72        packageObj.archProvider       = self.arch
73        packageObj.languageProvider   = self.languages
74        packageObj.installDirProvider = self.petscdir
75        setattr(self, package.lower(), packageObj)
76    # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built
77    framework.require('PETSc.utilities.scalarTypes', self.f2cblaslapack)
78    self.f2cblaslapack.precisionProvider = self.scalartypes
79    framework.require('PETSc.utilities.scalarTypes', self.blaslapack)
80    self.blaslapack.precisionProvider = self.scalartypes
81
82    self.compilers.headerPrefix  = self.headerPrefix
83    self.types.headerPrefix      = self.headerPrefix
84    self.headers.headerPrefix    = self.headerPrefix
85    self.functions.headerPrefix  = self.headerPrefix
86    self.libraries.headerPrefix  = self.headerPrefix
87    self.blaslapack.headerPrefix = self.headerPrefix
88    self.mpi.headerPrefix        = self.headerPrefix
89    headersC = map(lambda name: name+'.h', ['setjmp','dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings',
90                                            'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource',
91                                            'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory',
92                                            'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types',
93                                            'WindowsX', 'cxxabi','float','ieeefp','stdint','fenv','sched','pthread'])
94    functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid',
95                 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize',
96                 'readlink', 'realpath',  'sigaction', 'signal', 'sigset', 'usleep', 'sleep', '_sleep', 'socket',
97                 'times', 'gethostbyname', 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp',
98                 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror',
99                 '_intel_fast_memcpy','_intel_fast_memset']
100    libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')]
101    self.headers.headers.extend(headersC)
102    self.functions.functions.extend(functions)
103    self.libraries.libraries.extend(libraries1)
104
105    return
106
107  def Dump(self):
108    ''' Actually put the values into the configuration files '''
109    # eventually everything between -- should be gone
110#-----------------------------------------------------------------------------------------------------
111
112    # Sometimes we need C compiler, even if built with C++
113    self.setCompilers.pushLanguage('C')
114    self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags())
115    self.setCompilers.popLanguage()
116
117    # C preprocessor values
118    self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS)
119
120    # compiler values
121    self.setCompilers.pushLanguage(self.languages.clanguage)
122    self.addMakeMacro('PCC',self.setCompilers.getCompiler())
123    self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags())
124    self.setCompilers.popLanguage()
125    # .o or .obj
126    self.addMakeMacro('CC_SUFFIX','o')
127
128    # executable linker values
129    self.setCompilers.pushLanguage(self.languages.clanguage)
130    pcc_linker = self.setCompilers.getLinker()
131    self.addMakeMacro('PCC_LINKER',pcc_linker)
132    self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags())
133    self.setCompilers.popLanguage()
134    # '' for Unix, .exe for Windows
135    self.addMakeMacro('CC_LINKER_SUFFIX','')
136
137    if hasattr(self.compilers, 'FC'):
138      self.setCompilers.pushLanguage('FC')
139      # need FPPFLAGS in config/setCompilers
140      self.addDefine('HAVE_FORTRAN','1')
141      self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS)
142
143      # compiler values
144      self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags())
145      self.setCompilers.popLanguage()
146      # .o or .obj
147      self.addMakeMacro('FC_SUFFIX','o')
148
149      # executable linker values
150      self.setCompilers.pushLanguage('FC')
151      # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker
152      fc_linker = self.setCompilers.getLinker()
153      if config.setCompilers.Configure.isNAG(fc_linker):
154        self.addMakeMacro('FC_LINKER',pcc_linker)
155      else:
156        self.addMakeMacro('FC_LINKER',fc_linker)
157      self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags())
158      # apple requires this shared library linker flag on SOME versions of the os
159      if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1:
160        self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ')
161      self.setCompilers.popLanguage()
162
163      # F90 Modules
164      if self.setCompilers.fortranModuleIncludeFlag:
165        self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag)
166      else: # for non-f90 compilers like g77
167        self.addMakeMacro('FC_MODULE_FLAG', '-I')
168      if self.setCompilers.fortranModuleIncludeFlag:
169        self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag)
170    else:
171      self.addMakeMacro('FC','')
172
173    if hasattr(self.compilers, 'CUDAC'):
174      self.setCompilers.pushLanguage('CUDA')
175      self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags())
176      self.setCompilers.popLanguage()
177
178    # shared library linker values
179    self.setCompilers.pushLanguage(self.languages.clanguage)
180    # need to fix BuildSystem to collect these separately
181    self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker())
182    self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}')
183    self.setCompilers.popLanguage()
184    # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture
185    # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX
186    if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX:
187      self.addMakeMacro('SL_LINKER_SUFFIX', '')
188      self.addDefine('SLSUFFIX','""')
189    else:
190      self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt)
191      self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"')
192
193    self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}')
194
195#-----------------------------------------------------------------------------------------------------
196
197    # CONLY or CPP. We should change the PETSc makefiles to do this better
198    if self.languages.clanguage == 'C': lang = 'CONLY'
199    else: lang = 'CXXONLY'
200    self.addMakeMacro('PETSC_LANGUAGE',lang)
201
202    # real or complex
203    self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype)
204    # double or float
205    self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision)
206
207    if self.framework.argDB['with-batch']:
208      self.addMakeMacro('PETSC_WITH_BATCH','1')
209
210    # Test for compiler-specific macros that need to be defined.
211    if self.setCompilers.isCrayVector('CC'):
212      self.addDefine('HAVE_CRAY_VECTOR','1')
213
214#-----------------------------------------------------------------------------------------------------
215    if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'):
216      self.addDefine('USE_SOCKET_VIEWER','1')
217      if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'):
218        self.addDefine('HAVE_SO_REUSEADDR','1')
219
220#-----------------------------------------------------------------------------------------------------
221    # print include and lib for makefiles
222    self.framework.packages.reverse()
223    includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')]
224    libs = []
225    for i in self.framework.packages:
226      if i.useddirectly:
227        self.addDefine('HAVE_'+i.PACKAGE, 1)  # ONLY list package if it is used directly by PETSc (and not only by another package)
228      if not isinstance(i.lib, list):
229        i.lib = [i.lib]
230      libs.extend(i.lib)
231      self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib))
232      if hasattr(i,'include'):
233        if not isinstance(i.include,list):
234          i.include = [i.include]
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 hasattr(self.compilers, 'CXX'):
420        cmakeset(fd,'PETSC_HAVE_CXX')
421      if self.sharedlibraries.useShared:
422        cmakeset(fd,'BUILD_SHARED_LIBS')
423    def writeBuildFlags(fd):
424      def extendby(lib):
425        libs = ensurelist(lib)
426        lib_paths.extend(map(libpath,libs))
427        lib_libs.extend(map(cleanlib,libs))
428      lib_paths = []
429      lib_libs  = []
430      includes  = []
431      libvars   = []
432      for pkg in self.framework.packages:
433        extendby(pkg.lib)
434        uniqextend(includes,pkg.include)
435      extendby(self.libraries.math)
436      extendby(self.libraries.rt)
437      extendby(self.compilers.flibs)
438      extendby(self.compilers.cxxlibs)
439      extendby(self.compilers.LIBS.split())
440      for libname in nublast(lib_libs):
441        libvar = 'PETSC_' + libname.upper() + '_LIB'
442        addpath = ''
443        for lpath in nublast(lib_paths):
444          addpath += '"' + str(lpath) + '" '
445        fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n')
446        libvars.append(libvar)
447      fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n')
448      fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n')
449      includes = filter(notstandardinclude,includes)
450      fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',includes)) + ')\n')
451    fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w')
452    writeMacroDefinitions(fd)
453    writeBuildFlags(fd)
454    fd.close()
455    return
456
457  def dumpCMakeLists(self):
458    import sys
459    if sys.version_info >= (2,5):
460      import cmakegen
461      try:
462        cmakegen.main(self.petscdir.dir, log=self.framework.log)
463      except (OSError), e:
464        self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e))
465    else:
466      self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) )
467
468  def cmakeBoot(self):
469    import sys
470    self.cmakeboot_success = False
471    if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'):
472      try:
473        import cmakeboot
474        self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log)
475      except (OSError), e:
476        self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e))
477      except (ImportError, KeyError), e:
478        self.framework.logPrint('Importing cmakeboot failed:\n' + str(e))
479      if self.cmakeboot_success:
480        if self.framework.argDB['with-cuda']: # Our CMake build does not support CUDA at this time
481          self.framework.logPrint('CMake configured successfully, but could not be used by default because --with-cuda was used\n')
482        elif hasattr(self.compilers, 'FC') and self.compilers.fortranIsF90 and not self.setCompilers.fortranModuleOutputFlag:
483          self.framework.logPrint('CMake configured successfully, but could not be used by default because of missing fortranModuleOutputFlag\n')
484        else:
485          self.framework.logPrint('CMake configured successfully, using as default build\n')
486          self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1)
487      else:
488        self.framework.logPrint('CMake configuration was unsuccessful\n')
489    else:
490      self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) )
491    return
492
493  def configurePrefetch(self):
494    '''Sees if there are any prefetch functions supported'''
495    if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-ios']:
496      self.addDefine('Prefetch(a,b,c)', ' ')
497      return
498    self.pushLanguage(self.languages.clanguage)
499    if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'):
500      # The Intel Intrinsics manual [1] specifies the prototype
501      #
502      #   void _mm_prefetch(char const *a, int sel);
503      #
504      # but other vendors seem to insist on using subtly different
505      # prototypes, including void* for the pointer, and an enum for
506      # sel.  These are both reasonable changes, but negatively impact
507      # portability.
508      #
509      # [1] http://software.intel.com/file/6373
510      self.addDefine('HAVE_XMMINTRIN_H', 1)
511      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))')
512      self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA')
513      self.addDefine('PREFETCH_HINT_T0',  '_MM_HINT_T0')
514      self.addDefine('PREFETCH_HINT_T1',  '_MM_HINT_T1')
515      self.addDefine('PREFETCH_HINT_T2',  '_MM_HINT_T2')
516    elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'):
517      self.addDefine('HAVE_XMMINTRIN_H', 1)
518      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))')
519      self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA')
520      self.addDefine('PREFETCH_HINT_T0',  '_MM_HINT_T0')
521      self.addDefine('PREFETCH_HINT_T1',  '_MM_HINT_T1')
522      self.addDefine('PREFETCH_HINT_T2',  '_MM_HINT_T2')
523    elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'):
524      # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality)
525      #
526      #   The value of rw is a compile-time constant one or zero; one
527      #   means that the prefetch is preparing for a write to the memory
528      #   address and zero, the default, means that the prefetch is
529      #   preparing for a read. The value locality must be a compile-time
530      #   constant integer between zero and three. A value of zero means
531      #   that the data has no temporal locality, so it need not be left
532      #   in the cache after the access. A value of three means that the
533      #   data has a high degree of temporal locality and should be left
534      #   in all levels of cache possible. Values of one and two mean,
535      #   respectively, a low or moderate degree of temporal locality.
536      #
537      # Here we adopt Intel's x86/x86-64 naming scheme for the locality
538      # hints.  Using macros for these values in necessary since some
539      # compilers require an enum.
540      self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))')
541      self.addDefine('PREFETCH_HINT_NTA', '0')
542      self.addDefine('PREFETCH_HINT_T0',  '3')
543      self.addDefine('PREFETCH_HINT_T1',  '2')
544      self.addDefine('PREFETCH_HINT_T2',  '1')
545    else:
546      self.addDefine('Prefetch(a,b,c)', ' ')
547    self.popLanguage()
548
549  def configureFeatureTestMacros(self):
550    '''Checks if certain feature test macros are support'''
551    if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <sysctl.h>',''):
552       self.addDefine('_POSIX_C_SOURCE_200112L', '1')
553    if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''):
554       self.addDefine('_BSD_SOURCE', '1')
555    if self.checkCompile('#define _GNU_SOURCE\n#include <sched.h>','cpu_set_t mset;\nCPU_ZERO(&mset);'):
556       self.addDefine('_GNU_SOURCE', '1')
557
558  def configureAtoll(self):
559    '''Checks if atoll exists'''
560    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")'):
561       self.addDefine('HAVE_ATOLL', '1')
562
563  def configureUnused(self):
564    '''Sees if __attribute((unused)) is supported'''
565    if self.framework.argDB['with-ios']:
566      self.addDefine('UNUSED', ' ')
567      return
568    self.pushLanguage(self.languages.clanguage)
569    if self.checkLink('__attribute((unused)) static int myfunc(__attribute((unused)) void *name){ return 1;}', 'int i = 0;\nint j = myfunc(&i);\ntypedef void* atype;\n__attribute((unused))  atype a;\n'):
570      self.addDefine('UNUSED', '__attribute((unused))')
571    else:
572      self.addDefine('UNUSED', ' ')
573    self.popLanguage()
574
575  def configureExpect(self):
576    '''Sees if the __builtin_expect directive is supported'''
577    self.pushLanguage(self.languages.clanguage)
578    if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'):
579      self.addDefine('HAVE_BUILTIN_EXPECT', 1)
580    self.popLanguage()
581
582  def configureFunctionName(self):
583    '''Sees if the compiler supports __func__ or a variant.  Falls back
584    on __FUNCT__ which PETSc source defines, but most users do not, thus
585    stack traces through user code are better when the compiler's
586    variant is used.'''
587    def getFunctionName(lang):
588      name = '__FUNCT__'
589      self.pushLanguage(lang)
590      if self.checkLink('', "if (__func__[0] != 'm') return 1;"):
591        name = '__func__'
592      elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"):
593        name = '__FUNCTION__'
594      self.popLanguage()
595      return name
596    langs = []
597
598    self.addDefine('FUNCTION_NAME_C', getFunctionName('C'))
599    if hasattr(self.compilers, 'CXX'):
600      self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx'))
601    else:
602      self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__')
603
604  def configureIntptrt(self):
605    '''Determine what to use for uintptr_t'''
606    def staticAssertSizeMatchesVoidStar(inc,typename):
607      # The declaration is an error if either array size is negative.
608      # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case
609      return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n'
610                                     + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename))
611    self.pushLanguage(self.languages.clanguage)
612    if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'):
613      self.addDefine('UINTPTR_T', 'uintptr_t')
614    elif staticAssertSizeMatchesVoidStar('','unsigned long long'):
615      self.addDefine('UINTPTR_T', 'unsigned long long')
616    elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'):
617      self.addDefine('UINTPTR_T', 'size_t')
618    elif staticAssertSizeMatchesVoidStar('','unsigned long'):
619      self.addDefine('UINTPTR_T', 'unsigned long')
620    elif staticAssertSizeMatchesVoidStar('','unsigned'):
621      self.addDefine('UINTPTR_T', 'unsigned')
622    else:
623      raise RuntimeError('Could not find any unsigned integer type matching void*')
624    self.popLanguage()
625
626  def configureInline(self):
627    '''Get a generic inline keyword, depending on the language'''
628    if self.languages.clanguage == 'C':
629      self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword)
630      self.addDefine('RESTRICT', self.compilers.cRestrict)
631    elif self.languages.clanguage == 'Cxx':
632      self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword)
633      self.addDefine('RESTRICT', self.compilers.cxxRestrict)
634
635    if self.checkCompile('#include <dlfcn.h>\n void *ptr =  RTLD_DEFAULT;'):
636      self.addDefine('RTLD_DEFAULT','1')
637    return
638
639  def configureSolaris(self):
640    '''Solaris specific stuff'''
641    if os.path.isdir(os.path.join('/usr','ucblib')):
642      try:
643        flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag')
644      except AttributeError:
645        flag = None
646      if flag is None:
647        self.compilers.LIBS += ' -L/usr/ucblib'
648      else:
649        self.compilers.LIBS += ' '+flag+'/usr/ucblib'
650    return
651
652  def configureLinux(self):
653    '''Linux specific stuff'''
654    # TODO: Test for this by mallocing an odd number of floats and checking the address
655    self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1)
656    return
657
658  def configureWin32(self):
659    '''Win32 non-cygwin specific stuff'''
660    kernel32=0
661    if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
662      self.addDefine('HAVE_WINDOWS_H',1)
663      self.addDefine('HAVE_GETCOMPUTERNAME',1)
664      kernel32=1
665    elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
666      self.addDefine('HAVE_WINDOWS_H',1)
667      self.addDefine('HAVE_GETCOMPUTERNAME',1)
668      kernel32=1
669    if kernel32:
670      if self.framework.argDB['with-windows-graphics']:
671        self.addDefine('USE_WINDOWS_GRAPHICS',1)
672      if self.checkLink('#include <Windows.h>','LoadLibrary(0)'):
673        self.addDefine('HAVE_LOADLIBRARY',1)
674      if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'):
675        self.addDefine('HAVE_GETPROCADDRESS',1)
676      if self.checkLink('#include <Windows.h>','FreeLibrary(0)'):
677        self.addDefine('HAVE_FREELIBRARY',1)
678      if self.checkLink('#include <Windows.h>','GetLastError()'):
679        self.addDefine('HAVE_GETLASTERROR',1)
680      if self.checkLink('#include <Windows.h>','SetLastError(0)'):
681        self.addDefine('HAVE_SETLASTERROR',1)
682      if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'):
683        self.addDefine('USE_NT_TIME',1)
684    if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
685      self.addDefine('HAVE_GET_USER_NAME',1)
686    elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
687      self.addDefine('HAVE_GET_USER_NAME',1)
688
689    if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'):
690      self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);')
691    if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'):
692      self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);')
693
694    self.types.check('int32_t', 'int')
695    if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'):
696      self.addTypedef('int', 'uid_t')
697      self.addTypedef('int', 'gid_t')
698    if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'):
699      self.framework.addDefine('R_OK', '04')
700      self.framework.addDefine('W_OK', '02')
701      self.framework.addDefine('X_OK', '01')
702    if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'):
703      self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)')
704      self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)')
705    if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'):
706      self.addDefine('HAVE_LARGE_INTEGER_U',1)
707
708    # Windows requires a Binary file creation flag when creating/opening binary files.  Is a better test in order?
709    if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'):
710      self.addDefine('HAVE_O_BINARY',1)
711
712    if self.compilers.CC.find('win32fe') >= 0:
713      self.addDefine('PATH_SEPARATOR','\';\'')
714      self.addDefine('DIR_SEPARATOR','\'\\\\\'')
715      self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'')
716      self.addDefine('CANNOT_START_DEBUGGER',1)
717    else:
718      self.addDefine('PATH_SEPARATOR','\':\'')
719      self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'')
720      self.addDefine('DIR_SEPARATOR','\'/\'')
721
722    return
723
724#-----------------------------------------------------------------------------------------------------
725  def configureDefaultArch(self):
726    conffile = os.path.join('conf', 'petscvariables')
727    if self.framework.argDB['with-default-arch']:
728      fd = file(conffile, 'w')
729      fd.write('PETSC_ARCH='+self.arch.arch+'\n')
730      fd.write('PETSC_DIR='+self.petscdir.dir+'\n')
731      fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n')
732      fd.close()
733      self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile)
734    elif os.path.isfile(conffile):
735      try:
736        os.unlink(conffile)
737      except:
738        raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?')
739    return
740
741#-----------------------------------------------------------------------------------------------------
742  def configureScript(self):
743    '''Output a script in the conf directory which will reproduce the configuration'''
744    import nargs
745    import sys
746    scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py')
747    args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs])
748    if 'configModules' in args:
749      if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure':
750        del args['configModules']
751    if 'optionsModule' in args:
752      if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions':
753        del args['optionsModule']
754    if not 'PETSC_ARCH' in args:
755      args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch)
756    f = file(scriptName, 'w')
757    f.write('#!'+sys.executable+'\n')
758    f.write('if __name__ == \'__main__\':\n')
759    f.write('  import sys\n')
760    f.write('  import os\n')
761    f.write('  sys.path.insert(0, os.path.abspath(\'config\'))\n')
762    f.write('  import configure\n')
763    # pretty print repr(args.values())
764    f.write('  configure_options = [\n')
765    for itm in sorted(args.values()):
766      f.write('    \''+str(itm)+'\',\n')
767    f.write('  ]\n')
768    f.write('  configure.petsc_configure(configure_options)\n')
769    f.close()
770    try:
771      os.chmod(scriptName, 0775)
772    except OSError, e:
773      self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e))
774    self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration')
775    return
776
777  def configureInstall(self):
778    '''Setup the directories for installation'''
779    if self.framework.argDB['prefix']:
780      self.installdir = self.framework.argDB['prefix']
781      self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\
782                                              '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\
783                                              '-@echo "========================================="'])
784    else:
785      self.installdir = os.path.join(self.petscdir.dir,self.arch.arch)
786      self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\
787                                              '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\
788                                              '-@echo "========================================="'])
789      return
790
791  def configureGCOV(self):
792    if self.framework.argDB['with-gcov']:
793      self.addDefine('USE_GCOV','1')
794    return
795
796  def configureFortranFlush(self):
797    if hasattr(self.compilers, 'FC'):
798      for baseName in ['flush','flush_']:
799        if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1):
800          self.addDefine('HAVE_'+baseName.upper(), 1)
801          return
802
803  def postProcessPackages(self):
804    postPackages=[]
805    for i in self.framework.packages:
806      if hasattr(i,'postProcess'): postPackages.append(i)
807    if postPackages:
808      # ctetgen needs petsc conf files. so attempt to create them early
809      self.framework.dumpConfFiles()
810      for i in postPackages: i.postProcess()
811    return
812
813  def configure(self):
814    if not os.path.samefile(self.petscdir.dir, os.getcwd()):
815      raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n  Configure invoked in: '+os.path.realpath(os.getcwd()))
816    if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir):
817      raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!')
818    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)):
819      raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!')
820    self.framework.header          = os.path.join(self.arch.arch,'include','petscconf.h')
821    self.framework.cHeader         = os.path.join(self.arch.arch,'include','petscfix.h')
822    self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables')
823    self.framework.makeRuleHeader  = os.path.join(self.arch.arch,'conf','petscrules')
824    if self.libraries.math is None:
825      raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.')
826    if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'):
827      raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.')
828    self.executeTest(self.configureInline)
829    self.executeTest(self.configurePrefetch)
830    self.executeTest(self.configureUnused)
831    self.executeTest(self.configureExpect);
832    self.executeTest(self.configureFunctionName);
833    self.executeTest(self.configureIntptrt);
834    self.executeTest(self.configureSolaris)
835    self.executeTest(self.configureLinux)
836    self.executeTest(self.configureWin32)
837    self.executeTest(self.configureDefaultArch)
838    self.executeTest(self.configureScript)
839    self.executeTest(self.configureInstall)
840    self.executeTest(self.configureGCOV)
841    self.executeTest(self.configureFortranFlush)
842    self.executeTest(self.configureFeatureTestMacros)
843    self.executeTest(self.configureAtoll)
844    # dummy rules, always needed except for remote builds
845    self.addMakeRule('remote','')
846    self.addMakeRule('remoteclean','')
847
848    self.Dump()
849    self.dumpConfigInfo()
850    self.dumpMachineInfo()
851    self.postProcessPackages()
852    self.dumpCMakeConfig()
853    self.dumpCMakeLists()
854    self.cmakeBoot()
855    self.framework.log.write('================================================================================\n')
856    self.logClear()
857    return
858