1import config.base 2 3import os 4import re 5 6# The sorted() builtin is not available with python-2.3 7try: sorted 8except NameError: 9 def sorted(lst): 10 lst.sort() 11 return lst 12 13class Configure(config.base.Configure): 14 def __init__(self, framework): 15 config.base.Configure.__init__(self, framework) 16 self.headerPrefix = 'PETSC' 17 self.substPrefix = 'PETSC' 18 return 19 20 def __str2__(self): 21 desc = [] 22 desc.append('xxx=========================================================================xxx') 23 if self.getMakeMacro('PETSC_BUILD_USING_CMAKE'): 24 build_type = 'cmake build' 25 else: 26 build_type = 'legacy build' 27 desc.append(' Configure stage complete. Now build PETSc libraries with (%s):' % build_type) 28 desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 29 desc.append(' or (experimental with python):') 30 desc.append(' PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' ./config/builder.py') 31 desc.append('xxx=========================================================================xxx') 32 return '\n'.join(desc)+'\n' 33 34 def setupHelp(self, help): 35 import nargs 36 help.addArgument('PETSc', '-prefix=<dir>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 37 help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 38 help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 39 help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 40 help.addArgument('PETSc', '-with-iphone=<bool>', nargs.ArgBool(None, 0, 'Build an iPhone version of PETSc')) 41 return 42 43 def setupDependencies(self, framework): 44 config.base.Configure.setupDependencies(self, framework) 45 self.setCompilers = framework.require('config.setCompilers', self) 46 self.arch = framework.require('PETSc.utilities.arch', self.setCompilers) 47 self.petscdir = framework.require('PETSc.utilities.petscdir', self.setCompilers) 48 self.languages = framework.require('PETSc.utilities.languages',self.setCompilers) 49 self.debugging = framework.require('PETSc.utilities.debugging',self.setCompilers) 50 self.CHUD = framework.require('PETSc.utilities.CHUD', self) 51 self.compilers = framework.require('config.compilers', self) 52 self.types = framework.require('config.types', self) 53 self.headers = framework.require('config.headers', self) 54 self.functions = framework.require('config.functions', self) 55 self.libraries = framework.require('config.libraries', self) 56 if os.path.isdir(os.path.join('config', 'PETSc')): 57 for d in ['utilities', 'packages']: 58 for utility in os.listdir(os.path.join('config', 'PETSc', d)): 59 (utilityName, ext) = os.path.splitext(utility) 60 if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 61 utilityObj = self.framework.require('PETSc.'+d+'.'+utilityName, self) 62 utilityObj.headerPrefix = self.headerPrefix 63 utilityObj.archProvider = self.arch 64 utilityObj.languageProvider = self.languages 65 utilityObj.installDirProvider = self.petscdir 66 setattr(self, utilityName.lower(), utilityObj) 67 68 for package in config.packages.all: 69 if not package == 'PETSc': 70 packageObj = framework.require('config.packages.'+package, self) 71 packageObj.archProvider = self.arch 72 packageObj.languageProvider = self.languages 73 packageObj.installDirProvider = self.petscdir 74 setattr(self, package.lower(), packageObj) 75 # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built 76 framework.require('PETSc.utilities.scalarTypes', self.f2cblaslapack) 77 self.f2cblaslapack.precisionProvider = self.scalartypes 78 framework.require('PETSc.utilities.scalarTypes', self.blaslapack) 79 self.blaslapack.precisionProvider = self.scalartypes 80 81 self.compilers.headerPrefix = self.headerPrefix 82 self.types.headerPrefix = self.headerPrefix 83 self.headers.headerPrefix = self.headerPrefix 84 self.functions.headerPrefix = self.headerPrefix 85 self.libraries.headerPrefix = self.headerPrefix 86 self.blaslapack.headerPrefix = self.headerPrefix 87 self.mpi.headerPrefix = self.headerPrefix 88 headersC = map(lambda name: name+'.h', ['dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 89 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 90 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory', 91 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 92 'WindowsX', 'cxxabi','float','ieeefp','stdint','fenv','sched','pthread']) 93 functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid', 94 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 95 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'nanosleep', 'usleep', 'sleep', '_sleep', 'socket', 96 'times', 'gethostbyname', 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp', 97 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror', 98 '_intel_fast_memcpy','_intel_fast_memset'] 99 libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 100 self.headers.headers.extend(headersC) 101 self.functions.functions.extend(functions) 102 self.libraries.libraries.extend(libraries1) 103 104 return 105 106 def Dump(self): 107 ''' Actually put the values into the configuration files ''' 108 # eventually everything between -- should be gone 109#----------------------------------------------------------------------------------------------------- 110 111 # Sometimes we need C compiler, even if built with C++ 112 self.setCompilers.pushLanguage('C') 113 self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 114 self.setCompilers.popLanguage() 115 116 # C preprocessor values 117 self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 118 119 # compiler values 120 self.setCompilers.pushLanguage(self.languages.clanguage) 121 self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 122 self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 123 self.setCompilers.popLanguage() 124 # .o or .obj 125 self.addMakeMacro('CC_SUFFIX','o') 126 127 # executable linker values 128 self.setCompilers.pushLanguage(self.languages.clanguage) 129 pcc_linker = self.setCompilers.getLinker() 130 self.addMakeMacro('PCC_LINKER',pcc_linker) 131 self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 132 self.setCompilers.popLanguage() 133 # '' for Unix, .exe for Windows 134 self.addMakeMacro('CC_LINKER_SUFFIX','') 135 136 if hasattr(self.compilers, 'FC'): 137 self.setCompilers.pushLanguage('FC') 138 # need FPPFLAGS in config/setCompilers 139 self.addDefine('HAVE_FORTRAN','1') 140 self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 141 142 # compiler values 143 self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 144 self.setCompilers.popLanguage() 145 # .o or .obj 146 self.addMakeMacro('FC_SUFFIX','o') 147 148 # executable linker values 149 self.setCompilers.pushLanguage('FC') 150 # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 151 fc_linker = self.setCompilers.getLinker() 152 if config.setCompilers.Configure.isNAG(fc_linker): 153 self.addMakeMacro('FC_LINKER',pcc_linker) 154 else: 155 self.addMakeMacro('FC_LINKER',fc_linker) 156 self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 157 # apple requires this shared library linker flag on SOME versions of the os 158 if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 159 self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 160 self.setCompilers.popLanguage() 161 162 # F90 Modules 163 if self.setCompilers.fortranModuleIncludeFlag: 164 self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 165 else: # for non-f90 compilers like g77 166 self.addMakeMacro('FC_MODULE_FLAG', '-I') 167 if self.setCompilers.fortranModuleIncludeFlag: 168 self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 169 else: 170 self.addMakeMacro('FC','') 171 172 if hasattr(self.compilers, 'CUDAC'): 173 self.setCompilers.pushLanguage('CUDA') 174 self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 175 self.setCompilers.popLanguage() 176 177 # shared library linker values 178 self.setCompilers.pushLanguage(self.languages.clanguage) 179 # need to fix BuildSystem to collect these separately 180 self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 181 self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 182 self.setCompilers.popLanguage() 183 # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 184 # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 185 if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 186 self.addMakeMacro('SL_LINKER_SUFFIX', '') 187 self.addDefine('SLSUFFIX','""') 188 else: 189 self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 190 self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 191 192 self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 193 194#----------------------------------------------------------------------------------------------------- 195 196 # CONLY or CPP. We should change the PETSc makefiles to do this better 197 if self.languages.clanguage == 'C': lang = 'CONLY' 198 else: lang = 'CXXONLY' 199 self.addMakeMacro('PETSC_LANGUAGE',lang) 200 201 # real or complex 202 self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 203 # double or float 204 self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 205 206 if self.framework.argDB['with-batch']: 207 self.addMakeMacro('PETSC_WITH_BATCH','1') 208 209 # Test for compiler-specific macros that need to be defined. 210 if self.setCompilers.isCrayVector('CC'): 211 self.addDefine('HAVE_CRAY_VECTOR','1') 212 213#----------------------------------------------------------------------------------------------------- 214 if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 215 self.addDefine('USE_SOCKET_VIEWER','1') 216 if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 217 self.addDefine('HAVE_SO_REUSEADDR','1') 218 219#----------------------------------------------------------------------------------------------------- 220 # print include and lib for makefiles 221 self.framework.packages.reverse() 222 includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 223 libs = [] 224 for i in self.framework.packages: 225 if i.useddirectly: 226 self.addDefine('HAVE_'+i.PACKAGE, 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 227 if not isinstance(i.lib, list): 228 i.lib = [i.lib] 229 libs.extend(i.lib) 230 self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib)) 231 if hasattr(i,'include'): 232 if not isinstance(i.include,list): 233 i.include = [i.include] 234 includes.extend(i.include) 235 self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 236 if self.framework.argDB['with-single-library']: 237 self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.libraries.toStringNoDupes(['-L'+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),' -lpetsc']+libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS) 238 self.addMakeMacro('PETSC_EXTERNAL_LIB_BASIC',self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS) 239 self.PETSC_EXTERNAL_LIB_BASIC = self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS 240 self.addMakeMacro('PETSC_CC_INCLUDES',self.headers.toStringNoDupes(includes)) 241 self.PETSC_CC_INCLUDES = self.headers.toStringNoDupes(includes) 242 if hasattr(self.compilers, 'FC'): 243 if self.compilers.fortranIsF90: 244 self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes)) 245 else: 246 self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes)) 247 248 self.addMakeMacro('DESTDIR',self.installdir) 249 self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 250 251 if self.framework.argDB['with-single-library']: 252 # overrides the values set in conf/variables 253 self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 254 self.addMakeMacro('SHLIBS','libpetsc') 255 self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 256 self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 257 self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 258 self.addDefine('USE_SINGLE_LIBRARY', '1') 259 if self.sharedlibraries.useShared: 260 self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 261 self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 262 self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 263 self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 264 self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 265 self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 266 self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 267 self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 268 self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 269 self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 270 else: 271 self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 272 self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 273 self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 274 self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 275 self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 276 self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 277 self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 278 self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 279 self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 280 self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 281 282 if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 283 os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 284 285 # add a makefile entry for configure options 286 self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 287 return 288 289 def dumpConfigInfo(self): 290 import time 291 fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 292 fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 293 fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 294 fd.close() 295 return 296 297 def dumpMachineInfo(self): 298 import platform 299 import time 300 import script 301 fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 302 fd.write('static const char *petscmachineinfo = \"\\n\"\n') 303 fd.write('\"-----------------------------------------\\n\"\n') 304 fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 305 fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 306 fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir)) 307 fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch)) 308 fd.write('\"-----------------------------------------\\n\";\n') 309 fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 310 self.setCompilers.pushLanguage(self.languages.clanguage) 311 fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags())) 312 self.setCompilers.popLanguage() 313 if hasattr(self.compilers, 'FC'): 314 self.setCompilers.pushLanguage('FC') 315 fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS)) 316 self.setCompilers.popLanguage() 317 fd.write('\"-----------------------------------------\\n\";\n') 318 fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 319 fd.write('\"Using include paths: %s %s %s\\n\"\n' % ('-I'+os.path.join(self.petscdir.dir, self.arch.arch, 'include'), '-I'+os.path.join(self.petscdir.dir, 'include'), self.PETSC_CC_INCLUDES.replace('\\ ','\\\\ '))) 320 fd.write('\"-----------------------------------------\\n\";\n') 321 fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 322 self.setCompilers.pushLanguage(self.languages.clanguage) 323 fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 324 self.setCompilers.popLanguage() 325 if hasattr(self.compilers, 'FC'): 326 self.setCompilers.pushLanguage('FC') 327 fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 328 self.setCompilers.popLanguage() 329 if self.framework.argDB['with-single-library']: 330 petsclib = '-lpetsc' 331 else: 332 petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 333 fd.write('\"Using libraries: %s%s -L%s %s %s\\n\"\n' % (self.setCompilers.CSharedLinkerFlag, os.path.join(self.petscdir.dir, self.arch.arch, 'lib'), os.path.join(self.petscdir.dir, self.arch.arch, 'lib'), petsclib, self.PETSC_EXTERNAL_LIB_BASIC.replace('\\ ','\\\\ '))) 334 fd.write('\"-----------------------------------------\\n\";\n') 335 fd.close() 336 return 337 338 def dumpCMakeConfig(self): 339 ''' 340 Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 341 This file is private to PETSc and should not be included by third parties 342 (a suitable file can be produced later by CMake, but this is not it). 343 ''' 344 def cmakeset(fd,key,val=True): 345 if val == True: val = 'YES' 346 if val == False: val = 'NO' 347 fd.write('set (' + key + ' ' + val + ')\n') 348 def ensurelist(a): 349 if isinstance(a,list): 350 return a 351 else: 352 return [a] 353 def libpath(lib): 354 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 355 if not isinstance(lib,str): return '' 356 if lib.startswith('-L'): return lib[2:] 357 if lib.startswith('-R'): return lib[2:] 358 if lib.startswith('-Wl,-rpath,'): 359 # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 360 # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 361 # corresponding library. 362 return lib[len('-Wl,-rpath,'):] 363 if lib.startswith('-'): return '' 364 return os.path.dirname(lib) 365 def cleanlib(lib): 366 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 367 if not isinstance(lib,str): return '' 368 if lib.startswith('-l'): return lib[2:] 369 if lib.startswith('-Wl') or lib.startswith('-L'): return '' 370 lib = os.path.splitext(os.path.basename(lib))[0] 371 if lib.startswith('lib'): return lib[3:] 372 return lib 373 def nub(lst): 374 'Return a list containing the first occurrence of each unique element' 375 unique = [] 376 for elem in lst: 377 if elem not in unique and elem != '': 378 unique.append(elem) 379 return unique 380 try: reversed # reversed was added in Python-2.4 381 except NameError: 382 def reversed(lst): return lst[::-1] 383 def nublast(lst): 384 'Return a list containing the last occurrence of each unique entry in a list' 385 return reversed(nub(reversed(lst))) 386 def cmakeexpand(varname): 387 return r'"${' + varname + r'}"' 388 def uniqextend(lst,new): 389 for x in ensurelist(new): 390 if x not in lst: 391 lst.append(x) 392 def notstandardinclude(path): 393 return path not in '/usr/include /usr/local/include'.split() 394 def writeMacroDefinitions(fd): 395 if self.mpi.usingMPIUni: 396 cmakeset(fd,'PETSC_HAVE_MPIUNI') 397 for pkg in self.framework.packages: 398 if pkg.useddirectly: 399 cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE) 400 for name,val in self.functions.defines.items(): 401 cmakeset(fd,'PETSC_'+name,val) 402 for dct in [self.defines, self.libraryoptions.defines]: 403 for k,v in dct.items(): 404 if k.startswith('USE_'): 405 cmakeset(fd,'PETSC_' + k, v) 406 cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 407 cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper()) 408 cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 409 if hasattr(self.compilers, 'FC'): 410 cmakeset(fd,'PETSC_HAVE_FORTRAN') 411 if self.compilers.fortranIsF90: 412 cmakeset(fd,'PETSC_USING_F90') 413 if self.sharedlibraries.useShared: 414 cmakeset(fd,'BUILD_SHARED_LIBS') 415 def writeBuildFlags(fd): 416 def extendby(lib): 417 libs = ensurelist(lib) 418 lib_paths.extend(map(libpath,libs)) 419 lib_libs.extend(map(cleanlib,libs)) 420 uniqextend(includes,pkg.include) 421 lib_paths = [] 422 lib_libs = [] 423 includes = [] 424 libvars = [] 425 for pkg in self.framework.packages: 426 extendby(pkg.lib) 427 extendby(self.libraries.math) 428 extendby(self.libraries.rt) 429 extendby(self.compilers.flibs) 430 extendby(self.compilers.cxxlibs) 431 extendby(self.compilers.LIBS.split()) 432 for libname in nublast(lib_libs): 433 libvar = 'PETSC_' + libname.upper() + '_LIB' 434 addpath = '' 435 for lpath in nublast(lib_paths): 436 addpath += '"' + str(lpath) + '" ' 437 fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 438 libvars.append(libvar) 439 fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 440 fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 441 fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',filter(notstandardinclude,includes))) + ')\n') 442 fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 443 writeMacroDefinitions(fd) 444 writeBuildFlags(fd) 445 fd.close() 446 return 447 448 def dumpCMakeLists(self): 449 import sys 450 if sys.version_info >= (2,5): 451 import cmakegen 452 try: 453 cmakegen.main(self.petscdir.dir, log=self.framework.log) 454 except (OSError), e: 455 self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 456 else: 457 self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) ) 458 459 def cmakeBoot(self): 460 import sys 461 self.cmakeboot_success = False 462 if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'): 463 try: 464 import cmakeboot 465 self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log) 466 except (OSError), e: 467 self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 468 except (ImportError, KeyError), e: 469 self.framework.logPrint('Importing cmakeboot failed:\n' + str(e)) 470 if self.cmakeboot_success: 471 if self.framework.argDB['with-cuda']: # Our CMake build does not support CUDA at this time 472 self.framework.logPrint('CMake configured successfully, but could not be used by default because --with-cuda was used\n') 473 else: 474 self.framework.logPrint('CMake configured successfully, using as default build\n') 475 self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1) 476 else: 477 self.framework.logPrint('CMake configuration was unsuccessful\n') 478 else: 479 self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) ) 480 return 481 482 def configurePrefetch(self): 483 '''Sees if there are any prefetch functions supported''' 484 if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']: 485 self.addDefine('Prefetch(a,b,c)', ' ') 486 return 487 self.pushLanguage(self.languages.clanguage) 488 if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 489 # The Intel Intrinsics manual [1] specifies the prototype 490 # 491 # void _mm_prefetch(char const *a, int sel); 492 # 493 # but other vendors seem to insist on using subtly different 494 # prototypes, including void* for the pointer, and an enum for 495 # sel. These are both reasonable changes, but negatively impact 496 # portability. 497 # 498 # [1] http://software.intel.com/file/6373 499 self.addDefine('HAVE_XMMINTRIN_H', 1) 500 self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 501 self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 502 self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 503 self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 504 self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 505 elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 506 self.addDefine('HAVE_XMMINTRIN_H', 1) 507 self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 508 self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 509 self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 510 self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 511 self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 512 elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 513 # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 514 # 515 # The value of rw is a compile-time constant one or zero; one 516 # means that the prefetch is preparing for a write to the memory 517 # address and zero, the default, means that the prefetch is 518 # preparing for a read. The value locality must be a compile-time 519 # constant integer between zero and three. A value of zero means 520 # that the data has no temporal locality, so it need not be left 521 # in the cache after the access. A value of three means that the 522 # data has a high degree of temporal locality and should be left 523 # in all levels of cache possible. Values of one and two mean, 524 # respectively, a low or moderate degree of temporal locality. 525 # 526 # Here we adopt Intel's x86/x86-64 naming scheme for the locality 527 # hints. Using macros for these values in necessary since some 528 # compilers require an enum. 529 self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 530 self.addDefine('PREFETCH_HINT_NTA', '0') 531 self.addDefine('PREFETCH_HINT_T0', '3') 532 self.addDefine('PREFETCH_HINT_T1', '2') 533 self.addDefine('PREFETCH_HINT_T2', '1') 534 else: 535 self.addDefine('Prefetch(a,b,c)', ' ') 536 self.popLanguage() 537 538 def configureFeatureTestMacros(self): 539 '''Checks if certain feature test macros are support''' 540 if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <stdlib.h>',''): 541 self.addDefine('_POSIX_C_SOURCE_200112L', '1') 542 if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''): 543 self.addDefine('_BSD_SOURCE', '1') 544 545 def configureAtoll(self): 546 '''Checks if atoll exists''' 547 if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <stdlib.h>','long v = atoll("25")') or self.checkCompile ('#include <stdlib.h>','long v = atoll("25")'): 548 self.addDefine('HAVE_ATOLL', '1') 549 550 def configureUnused(self): 551 '''Sees if __attribute((unused)) is supported''' 552 if self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']: 553 self.addDefine('UNUSED', ' ') 554 return 555 self.pushLanguage(self.languages.clanguage) 556 if self.checkLink('__attribute((unused)) static int myfunc(void){ return 1;}', 'int i = myfunc();\ntypedef void* atype;\n__attribute((unused)) atype a;\n'): 557 self.addDefine('UNUSED', '__attribute((unused))') 558 else: 559 self.addDefine('UNUSED', ' ') 560 self.popLanguage() 561 562 def configureExpect(self): 563 '''Sees if the __builtin_expect directive is supported''' 564 self.pushLanguage(self.languages.clanguage) 565 if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 566 self.addDefine('HAVE_BUILTIN_EXPECT', 1) 567 self.popLanguage() 568 569 def configureFunctionName(self): 570 '''Sees if the compiler supports __func__ or a variant. Falls back 571 on __FUNCT__ which PETSc source defines, but most users do not, thus 572 stack traces through user code are better when the compiler's 573 variant is used.''' 574 def getFunctionName(lang): 575 name = '__FUNCT__' 576 self.pushLanguage(lang) 577 if self.checkLink('', "if (__func__[0] != 'm') return 1;"): 578 name = '__func__' 579 elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"): 580 name = '__FUNCTION__' 581 self.popLanguage() 582 return name 583 langs = [] 584 585 self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 586 if hasattr(self.compilers, 'CXX'): 587 self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 588 else: 589 self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__') 590 591 def configureIntptrt(self): 592 '''Determine what to use for uintptr_t''' 593 def staticAssertSizeMatchesVoidStar(inc,typename): 594 # The declaration is an error if either array size is negative. 595 # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case 596 return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 597 + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 598 self.pushLanguage(self.languages.clanguage) 599 if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 600 self.addDefine('UINTPTR_T', 'uintptr_t') 601 elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 602 self.addDefine('UINTPTR_T', 'unsigned long long') 603 elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 604 self.addDefine('UINTPTR_T', 'size_t') 605 elif staticAssertSizeMatchesVoidStar('','unsigned long'): 606 self.addDefine('UINTPTR_T', 'unsigned long') 607 elif staticAssertSizeMatchesVoidStar('','unsigned'): 608 self.addDefine('UINTPTR_T', 'unsigned') 609 else: 610 raise RuntimeError('Could not find any unsigned integer type matching void*') 611 self.popLanguage() 612 613 def configureInline(self): 614 '''Get a generic inline keyword, depending on the language''' 615 if self.languages.clanguage == 'C': 616 self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword) 617 self.addDefine('RESTRICT', self.compilers.cRestrict) 618 elif self.languages.clanguage == 'Cxx': 619 self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword) 620 self.addDefine('RESTRICT', self.compilers.cxxRestrict) 621 622 if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 623 self.addDefine('RTLD_DEFAULT','1') 624 return 625 626 def configureSolaris(self): 627 '''Solaris specific stuff''' 628 if os.path.isdir(os.path.join('/usr','ucblib')): 629 try: 630 flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 631 except AttributeError: 632 flag = None 633 if flag is None: 634 self.compilers.LIBS += ' -L/usr/ucblib' 635 else: 636 self.compilers.LIBS += ' '+flag+'/usr/ucblib' 637 return 638 639 def configureLinux(self): 640 '''Linux specific stuff''' 641 # TODO: Test for this by mallocing an odd number of floats and checking the address 642 self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 643 return 644 645 def configureWin32(self): 646 '''Win32 non-cygwin specific stuff''' 647 kernel32=0 648 if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 649 self.addDefine('HAVE_WINDOWS_H',1) 650 self.addDefine('HAVE_GETCOMPUTERNAME',1) 651 kernel32=1 652 elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 653 self.addDefine('HAVE_WINDOWS_H',1) 654 self.addDefine('HAVE_GETCOMPUTERNAME',1) 655 kernel32=1 656 if kernel32: 657 if self.framework.argDB['with-windows-graphics']: 658 self.addDefine('USE_WINDOWS_GRAPHICS',1) 659 if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 660 self.addDefine('HAVE_LOADLIBRARY',1) 661 if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 662 self.addDefine('HAVE_GETPROCADDRESS',1) 663 if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 664 self.addDefine('HAVE_FREELIBRARY',1) 665 if self.checkLink('#include <Windows.h>','GetLastError()'): 666 self.addDefine('HAVE_GETLASTERROR',1) 667 if self.checkLink('#include <Windows.h>','SetLastError(0)'): 668 self.addDefine('HAVE_SETLASTERROR',1) 669 if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 670 self.addDefine('USE_NT_TIME',1) 671 if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 672 self.addDefine('HAVE_GET_USER_NAME',1) 673 elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 674 self.addDefine('HAVE_GET_USER_NAME',1) 675 676 if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 677 self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 678 if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 679 self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 680 681 self.types.check('int32_t', 'int') 682 if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 683 self.addTypedef('int', 'uid_t') 684 self.addTypedef('int', 'gid_t') 685 if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 686 self.framework.addDefine('R_OK', '04') 687 self.framework.addDefine('W_OK', '02') 688 self.framework.addDefine('X_OK', '01') 689 if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 690 self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 691 self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 692 if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 693 self.addDefine('HAVE_LARGE_INTEGER_U',1) 694 695 # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 696 if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 697 self.addDefine('HAVE_O_BINARY',1) 698 699 if self.compilers.CC.find('win32fe') >= 0: 700 self.addDefine('PATH_SEPARATOR','\';\'') 701 self.addDefine('DIR_SEPARATOR','\'\\\\\'') 702 self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 703 self.addDefine('CANNOT_START_DEBUGGER',1) 704 else: 705 self.addDefine('PATH_SEPARATOR','\':\'') 706 self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 707 self.addDefine('DIR_SEPARATOR','\'/\'') 708 709 return 710 711#----------------------------------------------------------------------------------------------------- 712 def configureDefaultArch(self): 713 conffile = os.path.join('conf', 'petscvariables') 714 if self.framework.argDB['with-default-arch']: 715 fd = file(conffile, 'w') 716 fd.write('PETSC_ARCH='+self.arch.arch+'\n') 717 fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 718 fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n') 719 fd.close() 720 self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 721 elif os.path.isfile(conffile): 722 try: 723 os.unlink(conffile) 724 except: 725 raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 726 return 727 728#----------------------------------------------------------------------------------------------------- 729 def configureScript(self): 730 '''Output a script in the conf directory which will reproduce the configuration''' 731 import nargs 732 import sys 733 scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 734 args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 735 if 'configModules' in args: 736 if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 737 del args['configModules'] 738 if 'optionsModule' in args: 739 if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 740 del args['optionsModule'] 741 if not 'PETSC_ARCH' in args: 742 args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 743 f = file(scriptName, 'w') 744 f.write('#!'+sys.executable+'\n') 745 f.write('if __name__ == \'__main__\':\n') 746 f.write(' import sys\n') 747 f.write(' import os\n') 748 f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 749 f.write(' import configure\n') 750 # pretty print repr(args.values()) 751 f.write(' configure_options = [\n') 752 for itm in sorted(args.values()): 753 f.write(' \''+str(itm)+'\',\n') 754 f.write(' ]\n') 755 f.write(' configure.petsc_configure(configure_options)\n') 756 f.close() 757 try: 758 os.chmod(scriptName, 0775) 759 except OSError, e: 760 self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 761 self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 762 return 763 764 def configureInstall(self): 765 '''Setup the directories for installation''' 766 if self.framework.argDB['prefix']: 767 self.installdir = self.framework.argDB['prefix'] 768 self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 769 '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 770 '-@echo "========================================="']) 771 else: 772 self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 773 self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 774 '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 775 '-@echo "========================================="']) 776 return 777 778 def configureGCOV(self): 779 if self.framework.argDB['with-gcov']: 780 self.addDefine('USE_GCOV','1') 781 return 782 783 def configureFortranFlush(self): 784 if hasattr(self.compilers, 'FC'): 785 for baseName in ['flush','flush_']: 786 if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 787 self.addDefine('HAVE_'+baseName.upper(), 1) 788 return 789 790 def postProcessPackages(self): 791 postPackages=[] 792 for i in self.framework.packages: 793 if hasattr(i,'postProcess'): postPackages.append(i) 794 if postPackages: 795 # prometheus needs petsc conf files. so attempt to create them early 796 self.framework.dumpConfFiles() 797 for i in postPackages: i.postProcess() 798 return 799 800 def configure(self): 801 if not os.path.samefile(self.petscdir.dir, os.getcwd()): 802 raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 803 if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir): 804 raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 805 if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],os.path.join(self.petscdir.dir,self.arch.arch)): 806 raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 807 self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 808 self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 809 self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 810 self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 811 if self.libraries.math is None: 812 raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 813 if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 814 raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 815 self.executeTest(self.configureInline) 816 self.executeTest(self.configurePrefetch) 817 self.executeTest(self.configureUnused) 818 self.executeTest(self.configureExpect); 819 self.executeTest(self.configureFunctionName); 820 self.executeTest(self.configureIntptrt); 821 self.executeTest(self.configureSolaris) 822 self.executeTest(self.configureLinux) 823 self.executeTest(self.configureWin32) 824 self.executeTest(self.configureDefaultArch) 825 self.executeTest(self.configureScript) 826 self.executeTest(self.configureInstall) 827 self.executeTest(self.configureGCOV) 828 self.executeTest(self.configureFortranFlush) 829 self.executeTest(self.configureFeatureTestMacros) 830 self.executeTest(self.configureAtoll) 831 # dummy rules, always needed except for remote builds 832 self.addMakeRule('remote','') 833 self.addMakeRule('remoteclean','') 834 835 self.Dump() 836 self.dumpConfigInfo() 837 self.dumpMachineInfo() 838 self.postProcessPackages() 839 self.dumpCMakeConfig() 840 self.dumpCMakeLists() 841 self.cmakeBoot() 842 self.framework.log.write('================================================================================\n') 843 self.logClear() 844 return 845