xref: /petsc/config/PETSc/Configure.py (revision 3e336fdf4e375df90ef4b65b0f00c0c010d980fd)
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', 'nanosleep', '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        includes.extend(i.include)
235        self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include))
236    if self.framework.argDB['with-single-library']:
237      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)
238    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)
239    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
240    self.addMakeMacro('PETSC_CC_INCLUDES',self.headers.toStringNoDupes(includes))
241    self.PETSC_CC_INCLUDES = self.headers.toStringNoDupes(includes)
242    if hasattr(self.compilers, 'FC'):
243      if self.compilers.fortranIsF90:
244        self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes))
245      else:
246        self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes))
247
248    self.addMakeMacro('DESTDIR',self.installdir)
249    self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"')
250
251    if self.framework.argDB['with-single-library']:
252      # overrides the values set in conf/variables
253      self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}')
254      self.addMakeMacro('SHLIBS','libpetsc')
255      self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc')
256      self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc')
257      self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc')
258      self.addDefine('USE_SINGLE_LIBRARY', '1')
259      if self.sharedlibraries.useShared:
260        self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
261        self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
262        self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
263        self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
264        self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
265        self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
266        self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
267        self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
268        self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
269        self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}')
270      else:
271        self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}')
272        self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}')
273        self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}')
274        self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}')
275        self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}')
276        self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}')
277        self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}')
278        self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}')
279        self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}')
280        self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}')
281
282    if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')):
283      os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib'))
284
285    # add a makefile entry for configure options
286    self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"'))
287    return
288
289  def dumpConfigInfo(self):
290    import time
291    fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w')
292    fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n')
293    fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n')
294    fd.close()
295    return
296
297  def dumpMachineInfo(self):
298    import platform
299    import time
300    import script
301    fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w')
302    fd.write('static const char *petscmachineinfo = \"\\n\"\n')
303    fd.write('\"-----------------------------------------\\n\"\n')
304    fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node()))
305    fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform()))
306    fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir))
307    fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch))
308    fd.write('\"-----------------------------------------\\n\";\n')
309    fd.write('static const char *petsccompilerinfo = \"\\n\"\n')
310    self.setCompilers.pushLanguage(self.languages.clanguage)
311    fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags()))
312    self.setCompilers.popLanguage()
313    if hasattr(self.compilers, 'FC'):
314      self.setCompilers.pushLanguage('FC')
315      fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS))
316      self.setCompilers.popLanguage()
317    fd.write('\"-----------------------------------------\\n\";\n')
318    fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n')
319    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('\\ ','\\\\ ')))
320    fd.write('\"-----------------------------------------\\n\";\n')
321    fd.write('static const char *petsclinkerinfo = \"\\n\"\n')
322    self.setCompilers.pushLanguage(self.languages.clanguage)
323    fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker()))
324    self.setCompilers.popLanguage()
325    if hasattr(self.compilers, 'FC'):
326      self.setCompilers.pushLanguage('FC')
327      fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker()))
328      self.setCompilers.popLanguage()
329    if self.framework.argDB['with-single-library']:
330      petsclib = '-lpetsc'
331    else:
332      petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys'
333    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('\\ ','\\\\ ')))
334    fd.write('\"-----------------------------------------\\n\";\n')
335    fd.close()
336    return
337
338  def dumpCMakeConfig(self):
339    '''
340    Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake.
341    This file is private to PETSc and should not be included by third parties
342    (a suitable file can be produced later by CMake, but this is not it).
343    '''
344    def cmakeset(fd,key,val=True):
345      if val == True: val = 'YES'
346      if val == False: val = 'NO'
347      fd.write('set (' + key + ' ' + val + ')\n')
348    def ensurelist(a):
349      if isinstance(a,list):
350        return a
351      else:
352        return [a]
353    def libpath(lib):
354      'Returns a search path if that is what this item provides, else "" which will be cleaned out later'
355      if not isinstance(lib,str): return ''
356      if lib.startswith('-L'): return lib[2:]
357      if lib.startswith('-R'): return lib[2:]
358      if lib.startswith('-Wl,-rpath,'):
359        # This case occurs when an external package needs a specific system library that is normally provided by the compiler.
360        # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the
361        # corresponding library.
362        return lib[len('-Wl,-rpath,'):]
363      if lib.startswith('-'): return ''
364      return os.path.dirname(lib)
365    def cleanlib(lib):
366      'Returns a library name if that is what this item provides, else "" which will be cleaned out later'
367      if not isinstance(lib,str): return ''
368      if lib.startswith('-l'):  return lib[2:]
369      if lib.startswith('-Wl') or lib.startswith('-L'): return ''
370      lib = os.path.splitext(os.path.basename(lib))[0]
371      if lib.startswith('lib'): return lib[3:]
372      return lib
373    def nub(lst):
374      'Return a list containing the first occurrence of each unique element'
375      unique = []
376      for elem in lst:
377        if elem not in unique and elem != '':
378          unique.append(elem)
379      return unique
380    try: reversed # reversed was added in Python-2.4
381    except NameError:
382      def reversed(lst): return lst[::-1]
383    def nublast(lst):
384      'Return a list containing the last occurrence of each unique entry in a list'
385      return reversed(nub(reversed(lst)))
386    def cmakeexpand(varname):
387      return r'"${' + varname + r'}"'
388    def uniqextend(lst,new):
389      for x in ensurelist(new):
390        if x not in lst:
391          lst.append(x)
392    def notstandardinclude(path):
393      return path not in '/usr/include /usr/local/include'.split()
394    def writeMacroDefinitions(fd):
395      if self.mpi.usingMPIUni:
396        cmakeset(fd,'PETSC_HAVE_MPIUNI')
397      for pkg in self.framework.packages:
398        if pkg.useddirectly:
399          cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE)
400      for name,val in self.functions.defines.items():
401        cmakeset(fd,'PETSC_'+name,val)
402      for dct in [self.defines, self.libraryoptions.defines]:
403        for k,v in dct.items():
404          if k.startswith('USE_'):
405            cmakeset(fd,'PETSC_' + k, v)
406      cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex')
407      cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper())
408      cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage)
409      if hasattr(self.compilers, 'FC'):
410        cmakeset(fd,'PETSC_HAVE_FORTRAN')
411        if self.compilers.fortranIsF90:
412          cmakeset(fd,'PETSC_USING_F90')
413      if self.sharedlibraries.useShared:
414        cmakeset(fd,'BUILD_SHARED_LIBS')
415    def writeBuildFlags(fd):
416      def extendby(lib):
417        libs = ensurelist(lib)
418        lib_paths.extend(map(libpath,libs))
419        lib_libs.extend(map(cleanlib,libs))
420        uniqextend(includes,pkg.include)
421      lib_paths = []
422      lib_libs  = []
423      includes  = []
424      libvars   = []
425      for pkg in self.framework.packages:
426        extendby(pkg.lib)
427      extendby(self.libraries.math)
428      extendby(self.libraries.rt)
429      extendby(self.compilers.flibs)
430      extendby(self.compilers.cxxlibs)
431      extendby(self.compilers.LIBS.split())
432      for libname in nublast(lib_libs):
433        libvar = 'PETSC_' + libname.upper() + '_LIB'
434        addpath = ''
435        for lpath in nublast(lib_paths):
436          addpath += '"' + str(lpath) + '" '
437        fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n')
438        libvars.append(libvar)
439      fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n')
440      fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n')
441      fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',filter(notstandardinclude,includes))) + ')\n')
442    fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w')
443    writeMacroDefinitions(fd)
444    writeBuildFlags(fd)
445    fd.close()
446    return
447
448  def dumpCMakeLists(self):
449    import sys
450    if sys.version_info >= (2,5):
451      import cmakegen
452      try:
453        cmakegen.main(self.petscdir.dir, log=self.framework.log)
454      except (OSError), e:
455        self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e))
456    else:
457      self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) )
458
459  def cmakeBoot(self):
460    import sys
461    self.cmakeboot_success = False
462    if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'):
463      try:
464        import cmakeboot
465        self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log)
466      except (OSError), e:
467        self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e))
468      except (ImportError, KeyError), e:
469        self.framework.logPrint('Importing cmakeboot failed:\n' + str(e))
470      if self.cmakeboot_success:
471        if self.framework.argDB['with-cuda']: # Our CMake build does not support CUDA at this time
472          self.framework.logPrint('CMake configured successfully, but could not be used by default because --with-cuda was used\n')
473        else:
474          self.framework.logPrint('CMake configured successfully, using as default build\n')
475          self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1)
476      else:
477        self.framework.logPrint('CMake configuration was unsuccessful\n')
478    else:
479      self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) )
480    return
481
482  def configurePrefetch(self):
483    '''Sees if there are any prefetch functions supported'''
484    if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']:
485      self.addDefine('Prefetch(a,b,c)', ' ')
486      return
487    self.pushLanguage(self.languages.clanguage)
488    if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'):
489      # The Intel Intrinsics manual [1] specifies the prototype
490      #
491      #   void _mm_prefetch(char const *a, int sel);
492      #
493      # but other vendors seem to insist on using subtly different
494      # prototypes, including void* for the pointer, and an enum for
495      # sel.  These are both reasonable changes, but negatively impact
496      # portability.
497      #
498      # [1] http://software.intel.com/file/6373
499      self.addDefine('HAVE_XMMINTRIN_H', 1)
500      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))')
501      self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA')
502      self.addDefine('PREFETCH_HINT_T0',  '_MM_HINT_T0')
503      self.addDefine('PREFETCH_HINT_T1',  '_MM_HINT_T1')
504      self.addDefine('PREFETCH_HINT_T2',  '_MM_HINT_T2')
505    elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'):
506      self.addDefine('HAVE_XMMINTRIN_H', 1)
507      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))')
508      self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA')
509      self.addDefine('PREFETCH_HINT_T0',  '_MM_HINT_T0')
510      self.addDefine('PREFETCH_HINT_T1',  '_MM_HINT_T1')
511      self.addDefine('PREFETCH_HINT_T2',  '_MM_HINT_T2')
512    elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'):
513      # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality)
514      #
515      #   The value of rw is a compile-time constant one or zero; one
516      #   means that the prefetch is preparing for a write to the memory
517      #   address and zero, the default, means that the prefetch is
518      #   preparing for a read. The value locality must be a compile-time
519      #   constant integer between zero and three. A value of zero means
520      #   that the data has no temporal locality, so it need not be left
521      #   in the cache after the access. A value of three means that the
522      #   data has a high degree of temporal locality and should be left
523      #   in all levels of cache possible. Values of one and two mean,
524      #   respectively, a low or moderate degree of temporal locality.
525      #
526      # Here we adopt Intel's x86/x86-64 naming scheme for the locality
527      # hints.  Using macros for these values in necessary since some
528      # compilers require an enum.
529      self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))')
530      self.addDefine('PREFETCH_HINT_NTA', '0')
531      self.addDefine('PREFETCH_HINT_T0',  '3')
532      self.addDefine('PREFETCH_HINT_T1',  '2')
533      self.addDefine('PREFETCH_HINT_T2',  '1')
534    else:
535      self.addDefine('Prefetch(a,b,c)', ' ')
536    self.popLanguage()
537
538  def configureFeatureTestMacros(self):
539    '''Checks if certain feature test macros are support'''
540    if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <stdlib.h>',''):
541       self.addDefine('_POSIX_C_SOURCE_200112L', '1')
542    if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''):
543       self.addDefine('_BSD_SOURCE', '1')
544
545  def configureAtoll(self):
546    '''Checks if atoll exists'''
547    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")'):
548       self.addDefine('HAVE_ATOLL', '1')
549
550  def configureUnused(self):
551    '''Sees if __attribute((unused)) is supported'''
552    if self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']:
553      self.addDefine('UNUSED', ' ')
554      return
555    self.pushLanguage(self.languages.clanguage)
556    if self.checkLink('__attribute((unused)) static int myfunc(void){ return 1;}', 'int i = myfunc();\ntypedef void* atype;\n__attribute((unused))  atype a;\n'):
557      self.addDefine('UNUSED', '__attribute((unused))')
558    else:
559      self.addDefine('UNUSED', ' ')
560    self.popLanguage()
561
562  def configureExpect(self):
563    '''Sees if the __builtin_expect directive is supported'''
564    self.pushLanguage(self.languages.clanguage)
565    if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'):
566      self.addDefine('HAVE_BUILTIN_EXPECT', 1)
567    self.popLanguage()
568
569  def configureFunctionName(self):
570    '''Sees if the compiler supports __func__ or a variant.  Falls back
571    on __FUNCT__ which PETSc source defines, but most users do not, thus
572    stack traces through user code are better when the compiler's
573    variant is used.'''
574    def getFunctionName(lang):
575      name = '__FUNCT__'
576      self.pushLanguage(lang)
577      if self.checkLink('', "if (__func__[0] != 'm') return 1;"):
578        name = '__func__'
579      elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"):
580        name = '__FUNCTION__'
581      self.popLanguage()
582      return name
583    langs = []
584
585    self.addDefine('FUNCTION_NAME_C', getFunctionName('C'))
586    if hasattr(self.compilers, 'CXX'):
587      self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx'))
588    else:
589      self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__')
590
591  def configureIntptrt(self):
592    '''Determine what to use for uintptr_t'''
593    def staticAssertSizeMatchesVoidStar(inc,typename):
594      # The declaration is an error if either array size is negative.
595      # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case
596      return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n'
597                                     + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename))
598    self.pushLanguage(self.languages.clanguage)
599    if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'):
600      self.addDefine('UINTPTR_T', 'uintptr_t')
601    elif staticAssertSizeMatchesVoidStar('','unsigned long long'):
602      self.addDefine('UINTPTR_T', 'unsigned long long')
603    elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'):
604      self.addDefine('UINTPTR_T', 'size_t')
605    elif staticAssertSizeMatchesVoidStar('','unsigned long'):
606      self.addDefine('UINTPTR_T', 'unsigned long')
607    elif staticAssertSizeMatchesVoidStar('','unsigned'):
608      self.addDefine('UINTPTR_T', 'unsigned')
609    else:
610      raise RuntimeError('Could not find any unsigned integer type matching void*')
611    self.popLanguage()
612
613  def configureInline(self):
614    '''Get a generic inline keyword, depending on the language'''
615    if self.languages.clanguage == 'C':
616      self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword)
617      self.addDefine('RESTRICT', self.compilers.cRestrict)
618    elif self.languages.clanguage == 'Cxx':
619      self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword)
620      self.addDefine('RESTRICT', self.compilers.cxxRestrict)
621
622    if self.checkCompile('#include <dlfcn.h>\n void *ptr =  RTLD_DEFAULT;'):
623      self.addDefine('RTLD_DEFAULT','1')
624    return
625
626  def configureSolaris(self):
627    '''Solaris specific stuff'''
628    if os.path.isdir(os.path.join('/usr','ucblib')):
629      try:
630        flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag')
631      except AttributeError:
632        flag = None
633      if flag is None:
634        self.compilers.LIBS += ' -L/usr/ucblib'
635      else:
636        self.compilers.LIBS += ' '+flag+'/usr/ucblib'
637    return
638
639  def configureLinux(self):
640    '''Linux specific stuff'''
641    # TODO: Test for this by mallocing an odd number of floats and checking the address
642    self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1)
643    return
644
645  def configureWin32(self):
646    '''Win32 non-cygwin specific stuff'''
647    kernel32=0
648    if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
649      self.addDefine('HAVE_WINDOWS_H',1)
650      self.addDefine('HAVE_GETCOMPUTERNAME',1)
651      kernel32=1
652    elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
653      self.addDefine('HAVE_WINDOWS_H',1)
654      self.addDefine('HAVE_GETCOMPUTERNAME',1)
655      kernel32=1
656    if kernel32:
657      if self.framework.argDB['with-windows-graphics']:
658        self.addDefine('USE_WINDOWS_GRAPHICS',1)
659      if self.checkLink('#include <Windows.h>','LoadLibrary(0)'):
660        self.addDefine('HAVE_LOADLIBRARY',1)
661      if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'):
662        self.addDefine('HAVE_GETPROCADDRESS',1)
663      if self.checkLink('#include <Windows.h>','FreeLibrary(0)'):
664        self.addDefine('HAVE_FREELIBRARY',1)
665      if self.checkLink('#include <Windows.h>','GetLastError()'):
666        self.addDefine('HAVE_GETLASTERROR',1)
667      if self.checkLink('#include <Windows.h>','SetLastError(0)'):
668        self.addDefine('HAVE_SETLASTERROR',1)
669      if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'):
670        self.addDefine('USE_NT_TIME',1)
671    if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
672      self.addDefine('HAVE_GET_USER_NAME',1)
673    elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
674      self.addDefine('HAVE_GET_USER_NAME',1)
675
676    if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'):
677      self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);')
678    if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'):
679      self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);')
680
681    self.types.check('int32_t', 'int')
682    if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'):
683      self.addTypedef('int', 'uid_t')
684      self.addTypedef('int', 'gid_t')
685    if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'):
686      self.framework.addDefine('R_OK', '04')
687      self.framework.addDefine('W_OK', '02')
688      self.framework.addDefine('X_OK', '01')
689    if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'):
690      self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)')
691      self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)')
692    if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'):
693      self.addDefine('HAVE_LARGE_INTEGER_U',1)
694
695    # Windows requires a Binary file creation flag when creating/opening binary files.  Is a better test in order?
696    if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'):
697      self.addDefine('HAVE_O_BINARY',1)
698
699    if self.compilers.CC.find('win32fe') >= 0:
700      self.addDefine('PATH_SEPARATOR','\';\'')
701      self.addDefine('DIR_SEPARATOR','\'\\\\\'')
702      self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'')
703      self.addDefine('CANNOT_START_DEBUGGER',1)
704    else:
705      self.addDefine('PATH_SEPARATOR','\':\'')
706      self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'')
707      self.addDefine('DIR_SEPARATOR','\'/\'')
708
709    return
710
711#-----------------------------------------------------------------------------------------------------
712  def configureDefaultArch(self):
713    conffile = os.path.join('conf', 'petscvariables')
714    if self.framework.argDB['with-default-arch']:
715      fd = file(conffile, 'w')
716      fd.write('PETSC_ARCH='+self.arch.arch+'\n')
717      fd.write('PETSC_DIR='+self.petscdir.dir+'\n')
718      fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n')
719      fd.close()
720      self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile)
721    elif os.path.isfile(conffile):
722      try:
723        os.unlink(conffile)
724      except:
725        raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?')
726    return
727
728#-----------------------------------------------------------------------------------------------------
729  def configureScript(self):
730    '''Output a script in the conf directory which will reproduce the configuration'''
731    import nargs
732    import sys
733    scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py')
734    args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs])
735    if 'configModules' in args:
736      if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure':
737        del args['configModules']
738    if 'optionsModule' in args:
739      if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions':
740        del args['optionsModule']
741    if not 'PETSC_ARCH' in args:
742      args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch)
743    f = file(scriptName, 'w')
744    f.write('#!'+sys.executable+'\n')
745    f.write('if __name__ == \'__main__\':\n')
746    f.write('  import sys\n')
747    f.write('  import os\n')
748    f.write('  sys.path.insert(0, os.path.abspath(\'config\'))\n')
749    f.write('  import configure\n')
750    # pretty print repr(args.values())
751    f.write('  configure_options = [\n')
752    for itm in sorted(args.values()):
753      f.write('    \''+str(itm)+'\',\n')
754    f.write('  ]\n')
755    f.write('  configure.petsc_configure(configure_options)\n')
756    f.close()
757    try:
758      os.chmod(scriptName, 0775)
759    except OSError, e:
760      self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e))
761    self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration')
762    return
763
764  def configureInstall(self):
765    '''Setup the directories for installation'''
766    if self.framework.argDB['prefix']:
767      self.installdir = self.framework.argDB['prefix']
768      self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\
769                                              '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\
770                                              '-@echo "========================================="'])
771    else:
772      self.installdir = os.path.join(self.petscdir.dir,self.arch.arch)
773      self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\
774                                              '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\
775                                              '-@echo "========================================="'])
776      return
777
778  def configureGCOV(self):
779    if self.framework.argDB['with-gcov']:
780      self.addDefine('USE_GCOV','1')
781    return
782
783  def configureFortranFlush(self):
784    if hasattr(self.compilers, 'FC'):
785      for baseName in ['flush','flush_']:
786        if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1):
787          self.addDefine('HAVE_'+baseName.upper(), 1)
788          return
789
790  def postProcessPackages(self):
791    postPackages=[]
792    for i in self.framework.packages:
793      if hasattr(i,'postProcess'): postPackages.append(i)
794    if postPackages:
795      # prometheus needs petsc conf files. so attempt to create them early
796      self.framework.dumpConfFiles()
797      for i in postPackages: i.postProcess()
798    return
799
800  def configure(self):
801    if not os.path.samefile(self.petscdir.dir, os.getcwd()):
802      raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n  Configure invoked in: '+os.path.realpath(os.getcwd()))
803    if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir):
804      raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!')
805    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)):
806      raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!')
807    self.framework.header          = os.path.join(self.arch.arch,'include','petscconf.h')
808    self.framework.cHeader         = os.path.join(self.arch.arch,'include','petscfix.h')
809    self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables')
810    self.framework.makeRuleHeader  = os.path.join(self.arch.arch,'conf','petscrules')
811    if self.libraries.math is None:
812      raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.')
813    if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'):
814      raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.')
815    self.executeTest(self.configureInline)
816    self.executeTest(self.configurePrefetch)
817    self.executeTest(self.configureUnused)
818    self.executeTest(self.configureExpect);
819    self.executeTest(self.configureFunctionName);
820    self.executeTest(self.configureIntptrt);
821    self.executeTest(self.configureSolaris)
822    self.executeTest(self.configureLinux)
823    self.executeTest(self.configureWin32)
824    self.executeTest(self.configureDefaultArch)
825    self.executeTest(self.configureScript)
826    self.executeTest(self.configureInstall)
827    self.executeTest(self.configureGCOV)
828    self.executeTest(self.configureFortranFlush)
829    self.executeTest(self.configureFeatureTestMacros)
830    self.executeTest(self.configureAtoll)
831    # dummy rules, always needed except for remote builds
832    self.addMakeRule('remote','')
833    self.addMakeRule('remoteclean','')
834
835    self.Dump()
836    self.dumpConfigInfo()
837    self.dumpMachineInfo()
838    self.postProcessPackages()
839    self.dumpCMakeConfig()
840    self.dumpCMakeLists()
841    self.cmakeBoot()
842    self.framework.log.write('================================================================================\n')
843    self.logClear()
844    return
845