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