xref: /petsc/config/PETSc/Configure.py (revision 78e224df856aa9ec3fb1842e2d0dab3c0cee0b7a)
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.cmakeboot_success and not hasattr(self.compilers, 'CUDAC'):
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'])
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 and not hasattr(self.compilers, 'CUDAC'): # Our CMake build does not support CUDA at this time
469        self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1)
470    else:
471      self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) )
472    return
473
474  def configurePrefetch(self):
475    '''Sees if there are any prefetch functions supported'''
476    if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']:
477      self.addDefine('Prefetch(a,b,c)', ' ')
478      return
479    self.pushLanguage(self.languages.clanguage)
480    if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'):
481      # The Intel Intrinsics manual [1] specifies the prototype
482      #
483      #   void _mm_prefetch(char const *a, int sel);
484      #
485      # but other vendors seem to insist on using subtly different
486      # prototypes, including void* for the pointer, and an enum for
487      # sel.  These are both reasonable changes, but negatively impact
488      # portability.
489      #
490      # [1] http://software.intel.com/file/6373
491      self.addDefine('HAVE_XMMINTRIN_H', 1)
492      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))')
493      self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA')
494      self.addDefine('PREFETCH_HINT_T0',  '_MM_HINT_T0')
495      self.addDefine('PREFETCH_HINT_T1',  '_MM_HINT_T1')
496      self.addDefine('PREFETCH_HINT_T2',  '_MM_HINT_T2')
497    elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'):
498      self.addDefine('HAVE_XMMINTRIN_H', 1)
499      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))')
500      self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA')
501      self.addDefine('PREFETCH_HINT_T0',  '_MM_HINT_T0')
502      self.addDefine('PREFETCH_HINT_T1',  '_MM_HINT_T1')
503      self.addDefine('PREFETCH_HINT_T2',  '_MM_HINT_T2')
504    elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'):
505      # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality)
506      #
507      #   The value of rw is a compile-time constant one or zero; one
508      #   means that the prefetch is preparing for a write to the memory
509      #   address and zero, the default, means that the prefetch is
510      #   preparing for a read. The value locality must be a compile-time
511      #   constant integer between zero and three. A value of zero means
512      #   that the data has no temporal locality, so it need not be left
513      #   in the cache after the access. A value of three means that the
514      #   data has a high degree of temporal locality and should be left
515      #   in all levels of cache possible. Values of one and two mean,
516      #   respectively, a low or moderate degree of temporal locality.
517      #
518      # Here we adopt Intel's x86/x86-64 naming scheme for the locality
519      # hints.  Using macros for these values in necessary since some
520      # compilers require an enum.
521      self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))')
522      self.addDefine('PREFETCH_HINT_NTA', '0')
523      self.addDefine('PREFETCH_HINT_T0',  '3')
524      self.addDefine('PREFETCH_HINT_T1',  '2')
525      self.addDefine('PREFETCH_HINT_T2',  '1')
526    else:
527      self.addDefine('Prefetch(a,b,c)', ' ')
528    self.popLanguage()
529
530  def configureFeatureTestMacros(self):
531    '''Checks if certain feature test macros are support'''
532    if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <stdlib.h>',''):
533       self.addDefine('_POSIX_C_SOURCE_200112L', '1')
534    if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''):
535       self.addDefine('_BSD_SOURCE', '1')
536
537  def configureAtoll(self):
538    '''Checks if atoll exists'''
539    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")'):
540       self.addDefine('HAVE_ATOLL', '1')
541
542  def configureUnused(self):
543    '''Sees if __attribute((unused)) is supported'''
544    if self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']:
545      self.addDefine('UNUSED', ' ')
546      return
547    self.pushLanguage(self.languages.clanguage)
548    if self.checkLink('__attribute((unused)) static int myfunc(void){ return 1;}', 'int i = myfunc();\n'):
549      self.addDefine('UNUSED', '__attribute((unused))')
550    else:
551      self.addDefine('UNUSED', ' ')
552    self.popLanguage()
553
554  def configureExpect(self):
555    '''Sees if the __builtin_expect directive is supported'''
556    self.pushLanguage(self.languages.clanguage)
557    if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'):
558      self.addDefine('HAVE_BUILTIN_EXPECT', 1)
559    self.popLanguage()
560
561  def configureFunctionName(self):
562    '''Sees if the compiler supports __func__ or a variant.  Falls back
563    on __FUNCT__ which PETSc source defines, but most users do not, thus
564    stack traces through user code are better when the compiler's
565    variant is used.'''
566    def getFunctionName(lang):
567      name = '__FUNCT__'
568      self.pushLanguage(lang)
569      if self.checkLink('', "if (__func__[0] != 'm') return 1;"):
570        name = '__func__'
571      elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"):
572        name = '__FUNCTION__'
573      self.popLanguage()
574      return name
575    langs = []
576
577    self.addDefine('FUNCTION_NAME_C', getFunctionName('C'))
578    if hasattr(self.compilers, 'CXX'):
579      self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx'))
580    else:
581      self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__')
582
583  def configureIntptrt(self):
584    '''Determine what to use for uintptr_t'''
585    def staticAssertSizeMatchesVoidStar(inc,typename):
586      # The declaration is an error if either array size is negative.
587      # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case
588      return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n'
589                                     + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename))
590    self.pushLanguage(self.languages.clanguage)
591    if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'):
592      self.addDefine('UINTPTR_T', 'uintptr_t')
593    elif staticAssertSizeMatchesVoidStar('','unsigned long long'):
594      self.addDefine('UINTPTR_T', 'unsigned long long')
595    elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'):
596      self.addDefine('UINTPTR_T', 'size_t')
597    elif staticAssertSizeMatchesVoidStar('','unsigned long'):
598      self.addDefine('UINTPTR_T', 'unsigned long')
599    elif staticAssertSizeMatchesVoidStar('','unsigned'):
600      self.addDefine('UINTPTR_T', 'unsigned')
601    else:
602      raise RuntimeError('Could not find any unsigned integer type matching void*')
603    self.popLanguage()
604
605  def configureInline(self):
606    '''Get a generic inline keyword, depending on the language'''
607    if self.languages.clanguage == 'C':
608      self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword)
609      self.addDefine('RESTRICT', self.compilers.cRestrict)
610    elif self.languages.clanguage == 'Cxx':
611      self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword)
612      self.addDefine('RESTRICT', self.compilers.cxxRestrict)
613
614    if self.checkCompile('#include <dlfcn.h>\n void *ptr =  RTLD_DEFAULT;'):
615      self.addDefine('RTLD_DEFAULT','1')
616    return
617
618  def configureSolaris(self):
619    '''Solaris specific stuff'''
620    if os.path.isdir(os.path.join('/usr','ucblib')):
621      try:
622        flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag')
623      except AttributeError:
624        flag = None
625      if flag is None:
626        self.compilers.LIBS += ' -L/usr/ucblib'
627      else:
628        self.compilers.LIBS += ' '+flag+'/usr/ucblib'
629    return
630
631  def configureLinux(self):
632    '''Linux specific stuff'''
633    # TODO: Test for this by mallocing an odd number of floats and checking the address
634    self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1)
635    return
636
637  def configureWin32(self):
638    '''Win32 non-cygwin specific stuff'''
639    kernel32=0
640    if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
641      self.addDefine('HAVE_WINDOWS_H',1)
642      self.addDefine('HAVE_GETCOMPUTERNAME',1)
643      kernel32=1
644    elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
645      self.addDefine('HAVE_WINDOWS_H',1)
646      self.addDefine('HAVE_GETCOMPUTERNAME',1)
647      kernel32=1
648    if kernel32:
649      if self.framework.argDB['with-windows-graphics']:
650        self.addDefine('USE_WINDOWS_GRAPHICS',1)
651      if self.checkLink('#include <Windows.h>','LoadLibrary(0)'):
652        self.addDefine('HAVE_LOADLIBRARY',1)
653      if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'):
654        self.addDefine('HAVE_GETPROCADDRESS',1)
655      if self.checkLink('#include <Windows.h>','FreeLibrary(0)'):
656        self.addDefine('HAVE_FREELIBRARY',1)
657      if self.checkLink('#include <Windows.h>','GetLastError()'):
658        self.addDefine('HAVE_GETLASTERROR',1)
659      if self.checkLink('#include <Windows.h>','SetLastError(0)'):
660        self.addDefine('HAVE_SETLASTERROR',1)
661      if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'):
662        self.addDefine('USE_NT_TIME',1)
663    if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
664      self.addDefine('HAVE_GET_USER_NAME',1)
665    elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
666      self.addDefine('HAVE_GET_USER_NAME',1)
667
668    if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'):
669      self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);')
670    if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'):
671      self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);')
672
673    self.types.check('int32_t', 'int')
674    if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'):
675      self.addTypedef('int', 'uid_t')
676      self.addTypedef('int', 'gid_t')
677    if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'):
678      self.framework.addDefine('R_OK', '04')
679      self.framework.addDefine('W_OK', '02')
680      self.framework.addDefine('X_OK', '01')
681    if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'):
682      self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)')
683      self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)')
684    if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'):
685      self.addDefine('HAVE_LARGE_INTEGER_U',1)
686
687    # Windows requires a Binary file creation flag when creating/opening binary files.  Is a better test in order?
688    if self.checkCompile('#include <Windows.h>\n', 'int flags = O_BINARY;'):
689      self.addDefine('HAVE_O_BINARY',1)
690
691    if self.compilers.CC.find('win32fe') >= 0:
692      self.addDefine('PATH_SEPARATOR','\';\'')
693      self.addDefine('DIR_SEPARATOR','\'\\\\\'')
694      self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'')
695      self.addDefine('CANNOT_START_DEBUGGER',1)
696    else:
697      self.addDefine('PATH_SEPARATOR','\':\'')
698      self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'')
699      self.addDefine('DIR_SEPARATOR','\'/\'')
700
701    return
702
703#-----------------------------------------------------------------------------------------------------
704  def configureDefaultArch(self):
705    conffile = os.path.join('conf', 'petscvariables')
706    if self.framework.argDB['with-default-arch']:
707      fd = file(conffile, 'w')
708      fd.write('PETSC_ARCH='+self.arch.arch+'\n')
709      fd.write('PETSC_DIR='+self.petscdir.dir+'\n')
710      fd.write('include ${PETSC_DIR}/${PETSC_ARCH}/conf/petscvariables\n')
711      fd.close()
712      self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile)
713    elif os.path.isfile(conffile):
714      try:
715        os.unlink(conffile)
716      except:
717        raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?')
718    return
719
720#-----------------------------------------------------------------------------------------------------
721  def configureScript(self):
722    '''Output a script in the conf directory which will reproduce the configuration'''
723    import nargs
724    import sys
725    scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py')
726    args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs])
727    if 'configModules' in args:
728      if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure':
729        del args['configModules']
730    if 'optionsModule' in args:
731      if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions':
732        del args['optionsModule']
733    if not 'PETSC_ARCH' in args:
734      args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch)
735    f = file(scriptName, 'w')
736    f.write('#!'+sys.executable+'\n')
737    f.write('if __name__ == \'__main__\':\n')
738    f.write('  import sys\n')
739    f.write('  import os\n')
740    f.write('  sys.path.insert(0, os.path.abspath(\'config\'))\n')
741    f.write('  import configure\n')
742    # pretty print repr(args.values())
743    f.write('  configure_options = [\n')
744    for itm in sorted(args.values()):
745      f.write('    \''+str(itm)+'\',\n')
746    f.write('  ]\n')
747    f.write('  configure.petsc_configure(configure_options)\n')
748    f.close()
749    try:
750      os.chmod(scriptName, 0775)
751    except OSError, e:
752      self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e))
753    self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration')
754    return
755
756  def configureInstall(self):
757    '''Setup the directories for installation'''
758    if self.framework.argDB['prefix']:
759      self.installdir = self.framework.argDB['prefix']
760      self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\
761                                              '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\
762                                              '-@echo "========================================="'])
763    else:
764      self.installdir = os.path.join(self.petscdir.dir,self.arch.arch)
765      self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\
766                                              '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\
767                                              '-@echo "========================================="'])
768      return
769
770  def configureGCOV(self):
771    if self.framework.argDB['with-gcov']:
772      self.addDefine('USE_GCOV','1')
773    return
774
775  def configureFortranFlush(self):
776    if hasattr(self.compilers, 'FC'):
777      for baseName in ['flush','flush_']:
778        if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1):
779          self.addDefine('HAVE_'+baseName.upper(), 1)
780          return
781
782
783  def configure(self):
784    if not os.path.samefile(self.petscdir.dir, os.getcwd()):
785      raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n  Configure invoked in: '+os.path.realpath(os.getcwd()))
786    if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir):
787      raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!')
788    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)):
789      raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!')
790    self.framework.header          = os.path.join(self.arch.arch,'include','petscconf.h')
791    self.framework.cHeader         = os.path.join(self.arch.arch,'include','petscfix.h')
792    self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables')
793    self.framework.makeRuleHeader  = os.path.join(self.arch.arch,'conf','petscrules')
794    if self.libraries.math is None:
795      raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.')
796    if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'):
797      raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.')
798    self.executeTest(self.configureInline)
799    self.executeTest(self.configurePrefetch)
800    self.executeTest(self.configureUnused)
801    self.executeTest(self.configureExpect);
802    self.executeTest(self.configureFunctionName);
803    self.executeTest(self.configureIntptrt);
804    self.executeTest(self.configureSolaris)
805    self.executeTest(self.configureLinux)
806    self.executeTest(self.configureWin32)
807    self.executeTest(self.configureDefaultArch)
808    self.executeTest(self.configureScript)
809    self.executeTest(self.configureInstall)
810    self.executeTest(self.configureGCOV)
811    self.executeTest(self.configureFortranFlush)
812    self.executeTest(self.configureFeatureTestMacros)
813    self.executeTest(self.configureAtoll)
814    # dummy rules, always needed except for remote builds
815    self.addMakeRule('remote','')
816    self.addMakeRule('remoteclean','')
817
818    self.Dump()
819    self.dumpConfigInfo()
820    self.dumpMachineInfo()
821    self.dumpCMakeConfig()
822    self.dumpCMakeLists()
823    self.cmakeBoot()
824    self.framework.log.write('================================================================================\n')
825    self.logClear()
826    return
827