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